###環境等
OS: OSX El Capitan 10.11.5
gcc: OSXデフォルトのgcc(=clang)ではなく,Homebrewでインストールしたgcc 6.1.0
###やりたいこと
こちらのように,gccでrpathを指定してコンパイルしたい,またreadelfやobjdumpでrpathの確認をしたいと思っています.
###試したこと
上のサイトと同様に,main.cppを用意し,
C++
1#include <iostream> 2 3int main(int argc, char const* argv[]) 4{ 5 std::cout << "aaa" << std::endl; 6 return 0; 7}
これを,rpathオプションを付けてg++でコンパイルしました.
$g++ -Wl,-rpath,/tmp main.cpp
※なぜか-rpath=/tmpではunknown optionのエラーが出ました.カンマでも同じ意味らしい(参考リンク)のでやってみたらエラーは出ませんでした.
Macではreadelfやobjdumpはデフォルトで入っていないようなので,Homebrewでbinutilsをインストールし,greadelfやgobjdumpを使用できるようにしました.
しかし,greadelfでは
$ greadelf -dw a.out readelf: エラー: ELF ファイルではありません - 始点にあるマジック番号が異なります
とエラーを返されました.gobjdumpは実行できるのですが,
$ gobjdump -x a.out a.out: ファイル形式 mach-o-x86-64 a.out アーキテクチャ: i386:x86-64, フラグ 0x00000012: EXEC_P, HAS_SYMS 開始アドレス 0x0000000100000e49 セクション: 索引名 サイズ VMA LMA File off Algn 0 .text 0000009f 0000000100000e49 0000000100000e49 00000e49 2**0 CONTENTS, ALLOC, LOAD, CODE 1 __TEXT.__stubs 00000018 0000000100000ee8 0000000100000ee8 00000ee8 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 2 __TEXT.__stub_helper 00000038 0000000100000f00 0000000100000f00 00000f00 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 3 .const 00000001 0000000100000f38 0000000100000f38 00000f38 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .cstring 00000004 0000000100000f39 0000000100000f39 00000f39 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 5 .eh_frame 000000c0 0000000100000f40 0000000100000f40 00000f40 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 6 __DATA.__got 00000018 0000000100001000 0000000100001000 00001000 2**3 CONTENTS, ALLOC, LOAD, DATA 7 __DATA.__nl_symbol_ptr 00000010 0000000100001018 0000000100001018 00001018 2**3 CONTENTS, ALLOC, LOAD, DATA 8 __DATA.__la_symbol_ptr 00000020 0000000100001028 0000000100001028 00001028 2**3 CONTENTS, ALLOC, LOAD, DATA 9 .mod_init_func 00000008 0000000100001048 0000000100001048 00001048 2**3 CONTENTS, ALLOC, LOAD, DATA 10 .static_data 00000001 0000000100001050 0000000100001050 00001050 2**0 CONTENTS, ALLOC, LOAD, DATA SYMBOL TABLE: 0000000100000e8a l 0e SECT 01 0000 [.text] __Z41__static_initialization_and_destruction_0ii 0000000100000ed3 l 0e SECT 01 0000 [.text] __GLOBAL__sub_I_main.cpp 0000000100000f38 l 0e SECT 04 0000 [.const] __ZStL19piecewise_construct 0000000100001050 l 0e SECT 0b 0000 [.static_data] __ZStL8__ioinit 0000000100000000 g 0f SECT 01 0010 [.text] __mh_execute_header 0000000100000e49 g 0f SECT 01 0000 [.text] _main 0000000000000000 g 01 UND 00 0100 __ZNSolsEPFRSoS_E 0000000000000000 g 01 UND 00 0100 __ZNSt8ios_base4InitC1Ev 0000000000000000 g 01 UND 00 0100 __ZNSt8ios_base4InitD1Ev 0000000000000000 g 01 UND 00 0100 __ZSt4cout 0000000000000000 g 01 UND 00 0100 __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_ 0000000000000000 g 01 UND 00 0100 __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc 0000000000000000 g 01 UND 00 0200 ___cxa_atexit 0000000000000000 g 01 UND 00 0200 dyld_stub_binder
と,rpathに関する情報がないように思えます.
また,Linuxで同じことを試したところ,上記サイトのように問題なくコンパイルと確認が行えました.
###質問
OSXでrpathを渡してコンパイルする,rpathを確認する方法はありますか.
また,greadelfで「ELF ファイルではありません」と返される理由もわかれば教えて下さい.gccでコンパイルしたファイルは普通ELF形式だと思うのですが...
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/14 17:27 編集