問題タブ [objcopy]
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 - 妖精。すでにリンクされている DSO のエクスポートされたシンボルを非表示にする
私はすでにコンパイル済み/リンク済みの DSO ファイルを持っています。これは、実際に非表示にする必要があるいくつかの関数をエクスポートします。コードをそのライブラリにリンクしようとすると、自分のシンボルではなく不要なシンボルが検出されます。ソース コードにアクセスできないため、バイナリを再構築して、不要なものに適切な可視性属性を使用することができません。
ここで唯一の解決策が見えます-不要なシンボルフォームの可視性GLOBAL
をHIDDEN
直接バイナリに変更します。そのような変更のための明らかなツールは ですobjcopy
が、問題は、objcopy
動的シンボル テーブルを変更するオプションがなく、通常のシンボル テーブルしか処理できないことです。
ダイナミック シンボル テーブルのシンボルの可視性を変更できるツールを知っている人はいますか?
gcc - 「シン アーカイブ」ファイルで objcopy を使用する際の問題
問題を再現するには、次のシェル コマンドを使用してください。
その結果、次のエラーが発生します。
objcopy:st0AENRL/subdir/file2.o: そのようなファイルまたはディレクトリはありません
PS「薄い」アーカイブがサブディレクトリのオブジェクトファイルで構成されている場合、objcopyの問題が発生します。
そのような objcopy の動作が問題ないかどうかは誰にもわかりませんか?
binutils - 「objcopy -O ...」のエンディアンの意味は? バイナリデータは壊れますか?
この回答を読んだ後、私はすぐに次のように考えました。
リトル エンディアンかビッグ エンディアンかを特定する必要があるのはなぜですか? 単にバイナリ入力データをコピーするのではなく、objcopy
選択したエンディアンに応じて何らかの方法でデータをマングルするということですか?
手元にあった例は次のとおりです。
これが本当にバイナリ データなら、objcopy
気にする必要はありませんよね? 後でデータを読み取るものは何でも必要ですが、そうobjcopy
する必要はありません...
objcopy
オプションで指定されたビット数とエンディアンに基づいてデータをマングルし-O
ますか?
debugging - Linux カーネル用の個別のデバッグ シンボル ファイル
デバッグ シンボルを含むプログラムをコンパイルする場合 (例: を使用gcc -g
) objcopy
、. 後で、デバッグ シンボルのファイルを使用して、削除されたバイナリをデバッグできますgdb
。
私の質問は、Linux カーネル全体でこれを行うメカニズムまたは方法はありますか?
私の意図は、カーネル イメージをデバッグしながらサイズを縮小することです。
c++ - 外部オブジェクト ファイルで名前が変更されたシンボルを呼び出す方法は?
main()
関数を外部に公開するだけの LLVM libFuzzer を使用して、特定のコードをファジングしようとしています。ターゲット コードのソースにアクセスできますが、変更できません。
オブジェクト ファイルを直接インクルードしようとすると、main
によって提供される定義と競合します-fsanitize=fuzzer
。main
オブジェクト ファイル内のシンボルの名前を変更することで、これを解決できるかもしれないと考えました。
次に、ハーネス コードで次のように宣言します。
そして、リンク行に含めながら、stub_main()
の代わりに呼び出します。ただし、これは機能していないようで、リンカーは への参照を見つけることができません。main()
main.stub
stub_main(int, char**)
main
独自の を提供する別のコードからこの関数を呼び出すにはどうすればよいmain()
ですか?
gcc - 「x86_64-elf-objcopy -O binery Kernel.tmp Kernel.bin」を実行するとエラーになるのはなぜですか?
Windows で GCC クロスコンパイラを使用してカスタム OS 用のカーネルをコンパイルしています。Linux 用 Windows サブシステムをインストールし、クロス コンパイラを正常にビルドしました。ただし、x86_64-elf-objcopy -O binery Kernel.tmp Kernel.bin
カーネルを .bin ファイルにコンパイルするために実行しようとすると、この問題が発生し/usr/local/x86_64elfgcc/bin/x86_64-elf-objcopy: Kernel.bin: invalid bfd target
ます。以前にこの問題に遭遇し、解決策を知っている人はいますか?
gcc - .elf から .bin に変換するとファイル サイズが大きくなる
arm-gcc ツールチェーンから生成された .elf ファイルを .bin ファイルに変換すると、そのサイズは 40kB から 1.1Gb に増加します。
変換のために使用しています:
./arm-none-eabi-objcopy -O binary test.elf test.bin
連続していないメモリマップが原因で、メモリ領域間のギャップがゼロで埋められている可能性があります。
objcopy で使用できるオプションは何ですか? または、変換する他の方法はありますか?
以下はエルフ情報です。
- Tag_CPU_name: "Cortex-M7" Tag_CPU_arch: v7E-M
Tag_CPU_arch_profile: Microcontroller Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: FPv5/FP-D16 for ARMv8 Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754 Tag_ABI_align_needed: 8-byte
Tag_ABI_enum_size: small Tag_ABI_VFP_args: VFP レジスタ
Tag_ABI_optimization_goals: アグレッシブ デバッグ
Tag_CPU_unaligned_access: v6
ELF ファイルに含まれるセクションのリストは次のとおりです。オフセット 0x3e982c から始まる 25 個のセクション ヘッダーがあります。
rust - 錆びたプログラムで objcopy --strip-all を実行するとサイズが半分になるのはなぜですか?
任意の錆プログラムで objcopy --strip-all を実行すると、サイズが半分になります。たとえば、通常の hello world アプリケーションを cargo build --release でコンパイルすると、3 MB の実行可能ファイル (Linux の場合) で終わります。次に、実行可能ファイルで objcopy --strip-all を実行すると、330 kb の実行可能ファイルで終了します。なぜこれが起こるのですか?
また、ツールチェーンとして x86_64-pc-windows-gnu を使用して Windows でこれをテストしたところ、実行可能ファイルのサイズが 4 MB から 1 MB に縮小されました。
Windows では、私のツールチェーンは毎晩 2021-07-22 です。Linux では、私のツールチェーンは毎晩 2021-07-05 です。
gcc - gcc objcopy によって生成されたバイナリ ファイルのサイズが、gcc サイズ出力の「テキスト」と「データ」の合計よりもはるかに大きい
からファイルobjcopy -S -g -O binary test.elf test.bin
を取得するために使用します。.bin
.elf
のサイズは、 のテキストとデータtest.bin
の合計よりも明らかに大きいです。なぜこれほど大きな違いがあるのでしょうか。にコピーするセクションは?test.elf
objcopy
.elf
.bin
objcopy - objcopy - 複数のセクションのコピー
-j オプションobjcopy
を使用して特定のセクションを 1 つだけコピーする場合は、次のようにします。
複数のセクションをコピーするには、このオプションを複数回指定する必要があることを正しく理解しましたか?