問題タブ [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.
linux - -r オプション (再配置可能) を使用すると、ld でライブラリが見つからないのはなぜですか?
GNU ld 2.21 で Debian/Linux x86_64 を実行しています。
簡単に言えば、リンクすると
動作しますが、リンクすると
文句を言う
私は実際にこの方法でコードをコンパイルしようとしているわけではありませんが、ライブラリが存在するかどうかを確認する他の誰かのテストが機能しない理由を理解しようとしています。(したがって、何が起こっているのかよくわかりませんld
...通常はGCCを使用してリンクします)
再配置可能な方法でリンクするように指示ld
すると、突然ライブラリが見つからなくなるのはなぜですか? 存在することをテストしたいだけなら-lm
、他に何をすべきですか
ライブラリを見つけるように?
私が扱っているソースを見たい場合は、https ://github.com/jeremysalwen/ESPS からダウンロードできます (最初のコミットは元のソース コードであり、その後のコミットは変更であることにご注意ください)。個人で作っています。)
binutils - binutilsのエラーによりクロスコンパイルが発生します
私はbinutilsをコンパイルして、Linuxx86アーキテクチャでARM用にクロスコンパイルするためのGNUツールチェーンをセットアップしようとしています。
このために、GNUツールチェーンを http://lejosrt.org/tuto/install-gnu-arm-toolchain-under-linuxからダウンロードしました。
これには、すべてをインストールしてコンパイルするためにスクリプトを実行する必要があります。ただし、スクリプトを実行すると、次のエラーが発生します。
make [2]:ディレクトリlibiberty.aに入る'make [2]:ディレクトリ/home/GNU_Toolchain/src/binutils-2.20.51.0.1'を離れるmake:* [all]エラー2/home/GNU_Toolchain/src/binutils-2.20.51.0.1/libiberty'
rm -f ./libiberty.a pic/./libiberty.a
ar rc ./libiberty.a \
./regex.o ./cplus-dem.o ./cp-demangle.o ./md5.o ./sha1.o ./alloca.o ./argv.o ./choose-temp.o ./concat.o ./cp-demint.o ./crc32.o ./dyn-string.o ./fdmatch.o ./fibheap.o ./filename_cmp.o ./floatformat.o ./fnmatch.o ./fopen_unlocked.o ./getopt.o ./getopt1.o ./getpwd.o ./getruntime.o ./hashtab.o ./hex.o ./lbasename.o ./lrealpath.o ./make-relative-prefix.o ./make-temp-file.o ./objalloc.o ./obstack.o ./partition.o ./pexecute.o ./physmem.o ./pex-common.o ./pex-one.o ./pex-unix.o ./safe-ctype.o ./sort.o ./spaces.o ./splay-tree.o ./strerror.o ./strsignal.o ./unlink-if-ordinary.o ./xatexit.o ./xexit.o ./xmalloc.o ./xmemdup.o ./xstrdup.o ./xstrerror.o ./xstrndup.o
*** buffer overflow detected ***: ar terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0x40117df0]
/lib/i386-linux-gnu/libc.so.6(+0xe4cca)[0x40116cca]
/lib/i386-linux-gnu/libc.so.6(+0xe43c8)[0x401163c8]
/lib/i386-linux-gnu/libc.so.6(_IO_default_xsputn+0x95)[0x4009b7e5]
/lib/i386-linux-gnu/libc.so.6(_IO_padn+0xc8)[0x4008f598]
/lib/i386-linux-gnu/libc.so.6(_IO_vfprintf+0x1cd5)[0x40070e35]
/lib/i386-linux-gnu/libc.so.6(__vsprintf_chk+0xad)[0x4011647d]
/lib/i386-linux-gnu/libc.so.6(__sprintf_chk+0x2d)[0x401163bd]
ar[0x804ec04]
ar[0x8050d38]
ar[0x80585c2]
ar[0x804b452]
ar[0x804c3fd]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x40048e37]
ar[0x80494c1]
======= Memory map: ========
08048000-080b5000 r-xp 00000000 08:01 3940915 /usr/local/bin/ar
080b5000-080b6000 r--p 0006c000 08:01 3940915 /usr/local/bin/ar
080b6000-080b7000 rw-p 0006d000 08:01 3940915 /usr/local/bin/ar
080b7000-080bb000 rw-p 00000000 00:00 0
08efe000-08f9d000 rw-p 00000000 00:00 0 [heap]
40000000-4001c000 r-xp 00000000 08:01 3670837 /lib/i386-linux-gnu/ld-2.13.so
4001c000-4001d000 r--p 0001b000 08:01 3670837 /lib/i386-linux-gnu/ld-2.13.so
4001d000-4001e000 rw-p 0001c000 08:01 3670837 /lib/i386-linux-gnu/ld-2.13.so
4001e000-4001f000 r-xp 00000000 00:00 0 [vdso]
4001f000-40021000 rw-p 00000000 00:00 0
40021000-40022000 r--p 0065c000 08:01 3544340 /usr/lib/locale/locale-archive
40032000-4018c000 r-xp 00000000 08:01 3670850 /lib/i386-linux-gnu/libc-2.13.so
4018c000-4018d000 ---p 0015a000 08:01 3670850 /lib/i386-linux-gnu/libc-2.13.so
4018d000-4018f000 r--p 0015a000 08:01 3670850 /lib/i386-linux-gnu/libc-2.13.so
4018f000-40190000 rw-p 0015c000 08:01 3670850 /lib/i386-linux-gnu/libc-2.13.so
40190000-40195000 rw-p 00000000 00:00 0
40195000-40395000 r--p 00000000 08:01 3544340 /usr/lib/locale/locale-archive
403a6000-403c0000 r-xp 00000000 08:01 3670878 /lib/i386-linux-gnu/libgcc_s.so.1
403c0000-403c1000 r--p 00019000 08:01 3670878 /lib/i386-linux-gnu/libgcc_s.so.1
403c1000-403c2000 rw-p 0001a000 08:01 3670878 /lib/i386-linux-gnu/libgcc_s.so.1
bff19000-bff3b000 rw-p 00000000 00:00 0 [stack]
make[2]: *** [libiberty.a] Aborted
make[2]: *** Deleting file/home/GNU_Toolchain/src/binutils-2.20.51.0.1/libiberty'
make[1]: *** [all-libiberty] Error 2
make[1]: Leaving directory
binutilsパッケージをアップグレードしようとしましたが、無駄でした。
何か案は?前もって感謝します。
c - GNU ld スクリプトにセクションを挿入します。binutils のバージョン間のスクリプトの互換性。
質問のようなものを構築しています 異なる.aファイルから1つの配列にデータを収集する方法? ldスクリプトを使用して.aファイルにセクションを保持する方法は? 、つまり、リンク時に異なるオブジェクト ファイルの要素から構成される配列。
私の場合、いくつかの配列があり、それぞれが独自のセクション .ld_comp_array_* に入ります。ここで、* は配列の名前と一致します。次に、ld --verbose を使用してデフォルトのリンカー スクリプトを取得し、これらすべてのセクション (異なる配列の要素が混在しないように並べ替え) を出力セクションに配置して変更します。
すべてが正常に動作します。
この機能を使用するアプリケーションはさまざまなプラットフォーム用に構築される可能性があるため、状況は少し複雑になります。これまでのところ、ターゲット プラットフォームとして AVR Xmega、Windows 32 ビットおよび Linux 32 を試してみました単体テスト用の 64 ビットで、リストは公開されています (新しいプラットフォームが近い将来追加される可能性があります)。
ただし、特定のプラットフォームごとに、デフォルトのリンカー スクリプトが他のプラットフォームとは異なります。現在、手動で .ld_comp_array* セクションを挿入しています。何らかの形で自動的に行うことは可能でしょうか? 私が考えた唯一の解決策は、デフォルトのスクリプトを解析して上記の入力セクションの説明を貼り付けることでしたが、これは重すぎるようです。
比較的単純な解決策がない場合は手動で行うこともできますが、ld のローカル バージョンから取得したデフォルト スクリプトが別のバージョンの binutils で壊れるかどうかはわかりません。これが安全かどうかを明確にできる人はいますか?
自動的に実行できる場合、配列が「不変」であると仮定して、入力セクションの仕様を常に .text セクションに直接「挿入」しても問題ありませんか?
linker - gnu ld ライブラリ検索パスの*最後*に追加
-Ldir オプションを使用して GNU ld のライブラリ検索パスに追加し、それを広範囲に使用する方法を知っています。しかし、 gccとldのマニュアルを読んでわかる限り、ライブラリ検索パスのリストの最後に追加する方法はありません。
-L オプションは先頭に追加し、その後でデフォルトのシステム ライブラリ パスを検索します。しかし、他に見つからない場合はここを見るパスを追加したいと思います。ldでそれを行う方法はありますか?
(-print-search-dirs を使用して) すべての標準ライブラリ ディレクトリを抽出し、それらを -L 検索ディレクトリのリストに希望する順序で追加する、デフォルトの検索パスとしての暗黙の重複の前に追加するハックがらくたソリューションを想像できます。 ..
しかし、もっと良い方法があるはずです...
android - arコマンドラインの長さ
bjamによってar(正確にはandroid ar)に非常に長いコマンドラインが指定されていますが、arはファイルパスを破損し、ファイルが存在しないと文句を言います。
arに大きなコマンドラインバッファを割り当てる方法はありますか?
assembly - objdump と ARM と Thumb の比較
ARM 用にビルドされたオブジェクトを gcc で逆アセンブルしようとしています。残念ながら、objdump はコードが ARM と Thumb のどちらであるかを推測しようとしていますが、間違っています。実際には ARM であるのに、コードが Thumb であると認識します。
objdump には、強制的にすべての命令を Thumb ( -Mforce-thumb
) として解釈するオプションがありますが、ARM モードを強制するオプションはありません!
これは私には非常に奇妙な省略のように思え、作業を完了する能力を著しく妨げています (私は組み込みデバイスを使用しており、デバッグの唯一の手段は逆アセンブリを確認することです)。Thumb をサポートしない ARM アーキテクチャを使用するよう objdump に指示するなど、さまざまなアプローチを試しましたが、何も機能していないようです。何か案は?
(そして、はい、命令が本当にARMであることは知っています...)
binutils - nmとobjdumpの違い
マニュアルを見て、objdump
重複nm
する機能があります。
それぞれをいつ使用しますか?各コマンドの本来の目的は何でしたか?
perl - IPC::Open2 で大量のデータをフィルタリングするには?
私の仕事は、外部ユーティリティ (addr2line) を使用して perl スクリプトからいくつかのデータをフィルタリングすることです。データサイズはかなり大きいです。プログラムに大量のデータを出力し、(プログラムからスクリプトに)stdin
大量のデータを読み取る必要があります。stdout
今は でこれをやっていますがIPC::Open2
、読み書きを混ぜません。これは合法ですか?Open2
パイプ内の任意のサイズのデータをバッファリングしますか?
私のコード:
linux - Linux ELF ファイル: 静的および動的 ELF プログラムで異なるのはどのバイトですか?
Linuxのelfファイルを扱っています。
特定のelfプログラムが静的にリンクされているか(完全な静的リンク、ldd
「not a dynamic executable
」と表示されます)、または動的にリンクされているかを検出したいと思います。ELF は組み込み Linux 用であるため、単に実行したり、ldd
ユーティリティを使用したりすることはできません。
いくつかのバイトを読み取ってチェックすることにより、プログラムでこれを完全に実行したいと考えています。file
ユーティリティや libelf、binutils などに依存したくありません。
どのバイトが異なりますか?
gdb - gdb:変数の型とサイズをどのように知るのですか?
自家製のスクリプトで同じことを(うまくいけば)やろうとしているので、これを理解しようとしています:
Cコードの例:
これを後でコンパイルするgcc -g
とgdb a.out
、gdb
何がどこにあるかが正確にわかりa_ptr
ます。
どのようにそれをしますか?そして、他のユーティリティを介して同じことを(アドレスとタイプを知って)行うことはできますか?