問題タブ [binutils]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - リンクされたライブラリを実行可能ファイルから削除するにはどうすればよいですか
全て。
誰かが実行可能ファイルを作成しました。
この場合、libB.so を libA.so にマージしたいと考えています。
そこで、libB.so が提供するすべての API をカバーする libA.so を作成します。
次に、このライブラリと再リンクする必要があります。しかし、test_bin のソースがありません。
ソースなしで実行可能ファイルから libB.so リンクを削除するにはどうすればよいですか?
出来ますか?binutils を見回すだけです。しかし、私はそれを見つけていません。
アドバイスをお願いします。
gcc - gcc は as、ld、およびその他の binutils 実行可能ファイルをどのように検出しますか?
それらの場所は gcc コードにハードコードされていますか、それとも gcc が呼び出すだけで、PATH 変数に場所がas
必要ですか?as
後者の場合、2 つの完全に別個の gcc ツールチェーンを作成するにはどうすればよいでしょうか? つまり、 とが両方とも呼ばれる場合、どのようにgcc-A
呼び出しas-A
とgcc-B
呼び出しを行うことができますか?as-B
as-A
as-B
as
gcc - Macos 10.6.8 (Snow Leopard) でのネイティブ ツールチェーンの問題
以下、問題の説明です。StackOverflow が行う暗黙の書式設定を避けるために、すべてをコードとしてマークしました。自分の質問をどのようにフォーマットしたいかを正確に知っているのに、Wiki のようなマークアップ言語を扱わなければならないのはかなり面倒です。
python - gnu-binutils-utf-16またはasciiの代わりにutf-8を文字列
gnu-binutils-stringsがファイル内のutf-16コンテンツを印刷できることに気づきました-プログラムがutf-8文字列を印刷することは可能ですか?もしそうなら、どの議論が適切ですか?私はサブプロセスを使用してPython環境で作業しており、subprocess.Popen呼び出しがパイプを介して生成するgnu-binutils-stringsからの出力を処理したいと考えています。
solaris - Solaris で binutils 2.21.1a をビルド中にエラーが発生しました
Solaris sun4u sparc SunOS 5.10でhttp://ftp.gnu.org/gnu/binutilsから binutils 2.21.1a をビルドしようとしています。gcc バージョン 4.0.2 を使用しています。私が構築したとき、これはエラーです:
--disable-werror
それをバイパスしてうまくいけばビルドを続行するために、構成行にを追加しました。残念ながら、これも機能せず、リンク時に次の新しい関連するエラーが発生しました。
既存の問題を検索しましたが、関連するものは見つかりませんでした。何か案は?私はこのバージョンの binutils を使用することを好みますが、特に gcc 4.0.2 を使用してこのプラットフォームで問題なくビルドできるバージョンを知っている場合はお知らせください。
assembly - '.set noat' は MIPS アセンブリでサポートされていませんか?
現在、私は GNU as を学んでおり、"info as" で多くの有用な情報を見つけています。
".set noat" が MIPS 指定のコードで使用されていることがわかりましたが、"info as" でこのディレクティブを検索すると、ノード "alpha ディレクティブ" でその説明が見つかりましたが、"MIPS Dependent Features" では見つかりませんでした。なんで?マニュアルで何かを見逃しましたか?
ティア
linker - MIPS、ELF、部分リンク
次のような複雑なビルド プロセスを伴う大きなソフトウェア プロジェクトがあります。
- 個々のソース ファイルをコンパイルします。
- を使用して、各モジュールのオブジェクト ファイルを別の .o に部分的にリンクします
ld -r
。 - を使用して、各モジュールのプライベート シンボルを非表示にします
objcopy -G
。 - 再び を使用して、モジュール オブジェクトを部分的にリンクします
ld -r
。 - モジュールを共有オブジェクトにリンクします。
ステップ 3 は、プロジェクトの残りの部分にエクスポートされないモジュール プライベート グローバル変数を許可するために必要です。
これはすべて、ARM と IA32 で正常に動作します。残念ながら、今は mips (具体的には Android 用の mipsel-linux-gnu) で動作させる必要があります。また、MIPS 共有オブジェクト ABI は、他のプラットフォームよりもはるかに複雑であり、機能していません。
何が起こっているかというと、ステップ 5 が次のエラーで失敗しています。
これは、コンパイラが別のコンパイル単位で関数を呼び出すために CALL16 再配置を生成するためと思われますが、CALL16 ではグローバル シンボルの呼び出ししか許可されません。また、手順 3 のために、呼び出しようとしているシンボルの一部が呼び出されません。もはやグローバル。
この時点で、いくつかの可能なオプションが表示されます。
- ステップ 2 で、CALL16 再配置を通常のコンパイル単位内 PC 相対呼び出しに解決するようにリンカを説得します。
- 同上ですが、ステップ 4 または 5 です。
- コンパイル ユニット間の関数呼び出しに対して CALL16 再配置を生成しないようにコンパイラに指示します。
- 他の。
残念ながら、ステップ 3 を無効にすることは、外部要件のためオプションではありません。
私が本当にやりたいことは、ロード時に正しいアドレスにパッチされる絶対コードを生成することです。より小さく、はるかに高速で、非常に単純であり、プロセス間でライブラリを共有する必要はありません。残念ながら、Androiddlopen()
はこれをサポートしていないようです。
現在、私は私の深さから外れています。誰にも提案はありますか?
これは gcc 4.4.5 (Emdebian から)、binutils 2.20.1 です。ターゲット BFD は elf32-tradlittlemips です。ホスト OS は Linux で、Android 用にクロスコンパイルしています。
補遺
手順 4 から、このような警告も表示されます。
ステップ 4 への入力の逆アセンブリを見ると、コンパイラが生成したコードが次のようになっていることがわかります。
GOT16 はアドレスの上位半分まで修正されず、下位半分には LO16 が続く必要がありますか? しかし、コードは GOT 間接化を実行しようとしているように見えます。これは私を困惑させます。これが以前の問題に関連しているのか、別の問題なのか、それともまったく問題ではないのか、私にはわかりません...
アップデート
どうやら MIPSは非表示のグローバル シンボルをサポートしていないようです!
隠されているはずのシンボルの名前をマングリングして、誰もそれらが何であるかを知ることができないようにすることで、これを回避しました。これは外部要件をかなり押し付けていますが、出荷可能な製品を入手する唯一の方法であると指摘して、私は管理者に売り込みました。
それはまったく恐ろしいことです(そして、行うには非常に嫌なmakefile作業が含まれます)ので、誰かが持っているなら、より良い解決策が欲しいです...
assembly - GNUアセンブラ(as)を使用してアセンブリファイルを生のバイナリ(DOS .comなど)形式にコンパイルするにはどうすればよいですか?
このソースコードをWindowsでコンパイルしたい(これは単なる例です):
NASMまたはFASMでコンパイルすると、出力ファイルの長さは2バイトになります。しかし、GNUアセンブラでコンパイルすると、出力ファイルの長さは292バイトになります。
GNUアセンブラ(as)を使用してアセンブリファイルを生のバイナリ(DOS .comなど)形式にコンパイルするにはどうすればよいですか?
なぜ私はこれをするのですか?
独自のシンプルなOSを作成したいので、Cを使用してコードを作成し(stdio.hやmath.hでもC標準ライブラリを使用せずに)、アセンブリに変換します。
次に、アセンブリファイルを生のバイナリにコンパイルします。
次に、名前をa.out
(アセンブラーの出力)に変更しmy_os.flp
、最後にVMWareでOSを起動します:)
assembly - GASには、NASMの$トークンと同様に評価されるものがありますか?
私は議会の道を歩み始めたばかりで、最初の「Hello、World!」の1つです。私が見つけたチュートリアルhttp://asm.sourceforge.net/intro/hello.htmlは、システムコールに入力する文字列の長さを疑似動的に取得するための優れた方法を提供します。
これはnasmでうまく機能し、すべてが問題なく組み立てられ、リンクされ、実行されます。
問題は、私がガスで同じことをする方法を見つけようとするときに起こります。
この場合の$は、現在のアセンブリ位置http://www.csie.ntu.edu.tw/~comp03/nasm/nasmdoc3.html#section-3.5に評価されるトークンであることを理解しています。
この表現($ --msg)はガスで表現できますか、それともこのnasm専用のシンタックスシュガーですか?
c++ - リンク時に関数を弱く定義し、オーバーライドをテストする
(環境:gcc 4.6、c ++ 11、glibc 2.13、binutils 2.21)
背景については、次の「リンク」デモを検討してください。
foo.h:
foo1.cpp:
foo2.cpp:
main.cpp:
Makefile:
次のような関数宣言があります。
そして、それの複数の定義があります。1つはfoo1.cppにあり、もう1つはfoo2.cppにあります。
.cppファイルを.oファイルにコンパイルします。
問題ありません。main.o、foo1.o、foo2.oが生成されます。
ケース1
次に、main.oだけをリンクしてみます。
わかりました。main.oはfooを参照していますが、定義がリンクされていません。
ケース2
次に、main.oとfoo1.oをリンクしてみます
foo1.oにはfooの単一の定義があるため、エラーなしでリンクします。
ケース3
次に、main.ofoo1.oとfoo2.oをリンクしてみます
リンカは、foo1.oとfoo2.oでfooの2つの定義を検出するため、ランダムな定義を取得するのではなく、エラーで高速に失敗し、リンクしません。
質問
私の質問は次のとおりです。
foo1.cppのバージョンのfoo(おそらく何らかのgcc属性またはプラグマを使用)の定義を「弱い」とマークすることは可能ですか?具体的には、ケース1とケース2の動作を同じままにし、ケース3の動作を変更して警告やエラーなしで正常にリンクし、foo2.cppのfooの定義をリンクする(「弱い」定義をオーバーライドする)ことを意味します。 foo1.cppで)。
実行時にfooの弱いバージョンがリンクされているか(関数を明らかに実行せずに)強いバージョンがリンクされているかをテスト(およびブール変数に割り当てる)することは可能ですか?つまり、次のようにmainで関数を実装します。
/li>
is_weak_linked(foo)は、ケース2ではtrueを返し、ケース3ではfalseを返す必要があります。