質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

8080閲覧

OSXでrpathを渡してコンパイル/rpathを確認する

H.Kikuchi

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/07/07 10:17

編集2016/07/14 15:36

###環境等
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形式だと思うのですが...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

OSXでrpathを渡してコンパイルする,rpathを確認する方法はありますか.

ツールotoolが利用できるそうです(未確認)

gccでコンパイルしたファイルは普通ELF形式だと思うのですが...

Mac OS X上の実行可能バイナリはELF形式ではなく、Mach-O形式と呼ばれるフォーマットです。

投稿2016/07/11 11:48

編集2016/07/11 11:48
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

H.Kikuchi

2016/07/14 17:27 編集

otool -l で出てくる"LC_RPATH"のセクションがrpathだと確認できました.ありがとうございます. コンパイル方法やotoolの使い方についてはこちら(http://qiita.com/false-git@github/items/cb4528701752f76cfaa7)が参考になりました.こちらではcc(clang)でコンパイルしていますが,本文に記載したgccのコマンドでも同じ結果になりました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問