2016-05-13 6 views
1

私はOS Xに__builtin_return_address()によってリターンアドレスを取得しようとしている:OS Xで.textの再配置を無効にするにはどうすればよいですか?

/* foo.c */ 
#include <stdio.h> 

void foo() { 
    printf("return address: %p\n", __builtin_return_address(0)); 
} 

int main() { 
    foo(); 
} 

bash-3.2$ clang foo.c 
bash-3.2$ nm a.out 
0000000100000000 T __mh_execute_header 
0000000100000f40 T _foo 
0000000100000f70 T _main 
       U _printf 
       U dyld_stub_binder 

しかし、それは私がしたいアドレスを返しません。

bash-3.2$ ./a.out 
return address: 0x10c25cf79 
bash-3.2$ atos -o a.out 0x10c25cf79 
0x10c25cf79         

ただし、LLDBでもうまくいきます。

bash-3.2$ lldb a.out 
(lldb) target create "a.out" 
Current executable set to 'a.out' (x86_64). 
(lldb) r 
Process 77500 launched: '/private/tmp/a.out' (x86_64) 
return address: 0x100000f79 
Process 77500 exited with status = 0 (0x00000000) 
(lldb) q 
bash-3.2$ atos -o a.out 0x100000f79 
main (in a.out) + 9                

何が起こっているのですが、どうすれば解決できますか?

+0

これは、多くの最新のOS実装で見つかった[ASLR](https://en.wikipedia.org/wiki/Address_space_layout_randomization)セキュリティ機能に関連していると確信しています。 OS X(ダーウィン)のメモリページサイズは4KiB(4096バイト)で、アドレス指定を「49756」ページ、つまり0xC25C000でオフセットします。私はこれもLinuxのx86 [-64]のページサイズと同じだと考えています。他のBSDなどについてはわかりません。私の理解では、LLDBはASLRを無効にします。おそらく、繰り返し実行するとデバッグが容易になるからです。おそらくあなたは正常な実行のためにASLRを無効にすることができます... –

+0

@BrettHaleそれはASLRを無効にしたときに機能しました。ありがとうございました! –

答えて

1

@BrettHaleがコメントに答えました。これはASLRによって引き起こされます。

-no_pieオプションでASLRを無効にすると、この問題が解決されます。

$ clang -Wl,-no_pie foo.c 
$ ./a.out 
return address: 0x100000f79 
+0

私はそれを無効にする方法、またはこれが唯一のメカニズムであるかどうかはわかりませんでした。あなたは自分の答えを受け入れるように自由に感じるべきです。 –

+0

ありがとう、もう一度@BrettHale! –

関連する問題