2009-05-29 6 views
4

x86 코드의 생성을 단순화하기 위해 델파이 용 프레임 워크 또는 라이브러리를 사용하는 사람이 있습니까? 나는 어셈블러를 찾고있는 것이 아니라 오히려 저수준 비트와 바이트 이상에서 코드 생성 프로세스를 추상화하는 프레임 워크를 찾고있다. 이론적으로 기존의 라이브러리 나 프레임 워크를 기반으로 구축하고 싶습니다.델파이 용 x86 코드 생성기 프레임

초기 사용은 Delphi가 SOAP 요청을 보내는 방법과 비슷한 런타임에 작은 코드 스텁을 생성하는 것입니다. 내가 뭔가를 찾을 수 없다면 나는 내 자신을 굴릴 것 같지만 나는 바퀴를 재발견하는 것을 싫어할 것이다. 라이센스가 상용 및 오픈 소스 프로젝트에서 번역 및 사용을 허용하는 경우 "C"의 내용이 흥미로울 수 있습니다.

업데이트 : 여기

좀 더 상황입니다 : 내가 향해 노력하고하는 것은 지속성 프레임 워크의 한 부분으로 인터페이스 및/또는 클래스의 런타임 구현입니다. 명확하게 델파이의 맛을 제외하고 자바 어노테이션 구동 지속성 (JPA/EJB3)과 같은 것입니다. 호출 대상은 일반화 된 지속성 모델을 구현하는 모듈 식/확장형 프레임 워크입니다. RTTI와 애노테이션/애트리뷰트 모델 (InstantObjects 메타 데이터와 비슷한 것)에 기반한 메소드 호출을 매우 동적이며 유동적 인 방식으로 디스패치하고 후크해야합니다.

감사합니다, 데이비드

+0

델파이 델파이 포트가 SOAP 요청을 파견 코드 생성을 사용하지 않습니다. 그것은 {$ METHODINFO}와 ObjAuto.pas에있는 RTTI 정보를 통해 이루어졌습니다. 어떻게 작동하는지에 대해 당신이 intrested 경우 나는 예제 애플 리케이션을 가지고. –

+0

기술적으로는 정확하지만 호출 논리는 RTTI를 기반으로 호출을 디스패치하는 데 필요한 스택 프레임과 매개 변수를 실제로 설정합니다. 이렇게하려면 어셈블러에서 저수준 작업이 필요합니다. 이 과정을 추상화하고 좀 더 복잡한 썽크 (thunks)와 같은 것들에 대한 짧은 코드 시퀀스를 생성 할 수 있습니다. –

답변

2

PaxCompiler의 기능에 따르면 독립형 실행 파일을 만들 수 있습니다.

+0

필자는 이전 버전의 PaxCompiler를 추가하기 전에이 기능을 추가했습니다. 그 원시 코드 생성 기능은 흥미로운 것으로 들리며 함께 플레이 할 수있는 것들입니다. 아마도 오픈 소스 라이선스 관점에서 볼 때 적합하지 않을 수 있습니다. –

5

는 더 나는 당신의 질문에 대해 생각했다. Dynamic Method Invocation을 수행하려는 모든 사람이 확실하지 않습니다. 비록 당신이 x86 코드를 생성하는 것에 대해 물어 본다. 이렇게하는 몇 가지 기술이 있습니다.

해당 메서드의 서명을 알고있는 경우 TM 메서드를 사용하고 메서드 주소 및 데이터를 설정하면 쉽게 메서드를 서명 할 수 있습니다.

procedure TForm8.Button1Click(Sender: TObject); 
begin 
    Showmessage('Hello1'); 
end; 

procedure TForm8.Button2Click(Sender: TObject); 
var 
M : TMethod; 
begin 
    M.Code := MethodAddress('Button1Click'); 
    M.Data := Self; 
    TNotifyEvent(M)(self); 
end; 

당신이 메서드 서명은 다음 메소드를 호출하는 ObjAuto.pas의 기능을 사용 {$ METHODINFO ON} 을 가지는 클래스를 쓸 수를 알 수없는 경우.

나는 이것을 수행하는 방법에 대해 DelphiLive의 RTTI Presentation code에 예제가 있습니다.

2

매우 유쾌한 대답 : 같은 것 LLVM? 델파이에서 사용할 수 있는지 모르겠지만 dll을 만들 수 있어야합니다.

+0

예, 이와 비슷한 것일 수 있지만, 더 많은 델파이에서만 가능하며 그럴 필요는 없습니다. 이상적으로 지원되는 델파이 호출 규칙을 이해하고 (아마 RTTI와 통합) 기본적인 코드 생성 (물론 어셈블리 지식이 필요합니다)을 수행 할 수 있습니다. –

+1

나는 그것이 가능한 것을 확인할 수있다. –

0

논리적으로 단순히 델파이 코드를 생성하고 cmdline 컴파일러로 DLL/BPL로 컴파일 한 다음 그 중 하나를로드하십시오.

불행히도 Delphi Explorer에는 cmdline 컴파일러가 제공되지 않습니다. 그리고 메인 바이너리는 델파이 익스플로러 (또는 최소한 바이너리 호환이 가능하다면 D2006 이상)에 있어야합니다.

Delphi 버전 (또는 Free Pascal)은 패키지 또는 HLL 레벨에서 작동하지 않습니다. 기본 절차 DLL 수준에서만.

+0

안녕하세요 Marco - 저는 정말 더 역동적 인 것을 원합니다. Delphi에서 인라인 어셈블러를 코딩 할 수는 있지만 앞으로 필요하게 될 모든 순열을 쉽게 추측 할 수 없습니다. –

0

방금 ​​원래 질문을 게시했을 때 내가 찾고 있던 많은 것을 수행하는 흥미로운 프레임 워크를 발견했습니다.약간의 내 목적을 위해 늦었지만 다른 사람이 유용있을 거라고 생각합니다 :

DAsmJitasmjit project

+0

너무 오래 된 포트. 최신 포트를 찾고 있습니다. – user3655788