2012-01-04 2 views
2

OS X (x86-64)에서 C 심볼을로드해야하는 어셈블리가 있습니다. 86, 당신은이 작업을 수행하는 방법은 다음과 같습니다심볼 주소로드 (nasm, 64 비트 OS X)

LD : 경고 : PIE 사용할

mov rax, some_symbol_name 

그러나, - 64로,이 링크 경고가 발생합니다. 절대 주소 지정 (아마도 -mdynamic-no-pic)은 코드 서명 된 PIE에서는 허용되지 않지만 Test2.o에서는 _main에서 사용됩니다. 내가 PIE가 무엇인지, 그리고 나는 그것을 사용하지 않으려는하지 않습니다
는 -no_pie, -Wl와 -mdynamic 노 그림 또는 링크

주를 컴파일하지 않는,이 경고를 해결하려면. 난 정말이 (겉으로는) 간단한 문제에 난처한 해요

movq rax, some_symbol_name   ; Link warning 
lea rax, [rel some_symbol_name]  ; No link warning, but doesn't always get correct address 

: 여기 레지스터에 심볼의 주소를로드하는 내 다른 시도의 일부입니다. 나는 GAS 해체를 살펴 봤고 위의 lea 행을 따라 뭔가를하고있는 것처럼 보이지만 NASM이 올바른 코드를 생성 할 수는 없습니다.

편집 :

leaq some_symbol_name(%rip), %rax 

답변

3

주소 지정 RIP 상대적 NASM 사용을 강제 할 : 참고로,이 가스에 의해 생성 된 어셈블리 코드이다.

lea rax, [rel some_symbol_name] 

나 : 중 하나를 수행 문제가 해결되지 않으면

default rel 
lea rax, [some_symbol_name] 

은 NASM과 GAS 모두에 의해 생성 된 머신 코드를 게시 할 수 있습니다.

+1

나는이 두 가지 옵션을 시도해 보았고 때로는 잘못된 주소가 계산되는 결과를 낳았습니다. 이것은 올바른 해결책 일 것입니다,하지만 저는 x86-64 용 NASM의 OS X 버전에 버그가 있다고 생각합니다. –

관련 문제