2013-03-08 3 views
1

개인 프로젝트의 경우 기본 메모리가 아닌 주소로로드되는 실행 파일을 작성해야합니다. this SO question에서 ELF에 대한 입력 주소를 설정하고 섹션 주소를 수동으로 수정하여 실행 파일이 내가 선택한 일부 주소에 효과적으로 기반 할 수 있음을 알고 있습니다. 그러나, 답변은 이것이 glibc 초기화 (이 프로젝트에 필요한)를하지 않고 컴파일 할 때마다 섹션 메모리 주소를 설정하는 것이 어려울뿐 (지루한 일은 아닐지라도) 작동하는 것입니다.Linux binutils로 ELF 이미지의 기본 주소를 설정하는 우아한 방법은 무엇입니까?

빌드 할 때 ELF의 기본 주소를 설정하는 더 좋은 방법이 있어야하는 것처럼 보입니다. 필요하다면 스크립트 포스트 빌드를 수동으로 수행하는 방법을 사용합니다. 는 PE 포트에 특정 아니었다면 ld에 대한이 옵션은 완벽 할 것 :

--image-base value 
    Use value as the base address of your program or dll. This is the lowest 
    memory location that will be used when your program or dll is loaded. To 
    reduce the need to relocate and improve performance of your dlls, each should 
    have a unique base address and not overlap any other dlls. The default is 
    0x400000 for executables, and 0x10000000 for dlls. [This option is specific 
    to the i386 PE targeted port of the linker] 

나는 아직 ELF 동등한를 발견하지 않았습니다. 존재하지 않습니까? ELF 파일을 직접 파싱하면 세상의 끝이 아니지만 어딘가에이 기능이 있어야하는 것처럼 보입니다.

+0

내장 된 링커 응답 파일을 덤프하고 수정하여 링커 매개 변수로 gcc (및 ld)에 전달합니까? –

+0

@MarcovandeVoort 빠른 Google 검색은'ld' 또는'gcc'에 대해서는 아무 것도 없습니다. 올바른 문서를 작성하거나 지시 할 수 있습니까? – nosuchthingasstars

+0

왜 "기본 메모리가 아닌 주소에서로드"해야합니까? 어쩌면 당신은 처음 목표를 다르게 달성 할 수 있습니다 .... –

답변

1

엘프 진입 점은 -v가 (시스템 특정 될 수있는 당신에게 기본 링커 RESPONSEFILE을 보여줍니다으로 -T

이 가짜 링크를 수행하여 LD에 전달 될 수있는 링커 응답 파일에 설정 될 수 있습니다 , 실제로는별로 좋지 않습니다. OS 당 아치 당 하나씩). 이 사용자 정의 링커 파일을 함께 끌고의 실제 예를 들어

(텍스트/codesegment에 거주하는 진입 점 등)의 제약을 추가 할이 자원을 구현하기 위해 수행하는 무료 파스칼 프로젝트를 볼 수 있다는

주 .