2012-01-04 8 views
2

OS X(x86-64)でCシンボルをロードする必要があるアセンブリがあります。 x86のでは、あなたがこれを行う方法は次のとおりです。シンボルのアドレスをロードする(nasm、64ビットOS X)

LD:警告:PIEが無効になって

mov rax, some_symbol_name 

しかし、x86-64ので、これはリンクの警告の原因となります。絶対アドレス指定(おそらく-mdynamic-no-pic)は、コードで署名されたPIEでは使用できませんが、Test2.oから_mainで使用されます。この警告を修正するには

注-no_pie、-mdynamic-NO-PICまたは-Wlとのリンクを使用してコンパイルしていない:私はPIEが何であるかを知っている、と私はそれを無効にしたくないし。私は本当にこの(一見)の単純な問題で困惑

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に正しいコードを生成させることはできません。

EDIT:参考までに、これはガスによって生成されたアセンブリコードです:

leaq some_symbol_name(%rip), %rax 

答えて

3

あなたが対処するRIPの相対を使用するようにNASMを強制したいです。これが機能しない場合

default rel 
lea rax, [some_symbol_name] 

、NASMとGASの両方によって生成されたマシンコードをポスト:

lea rax, [rel some_symbol_name] 

か:のいずれかの操作を行います。

+1

私はこれらのオプションを試してみたところ、間違ったアドレスが計算されることがありました。これは正しい解決策ではありますが、OS X版のNASM for x86-64にはバグがあると思います。 –

関連する問題