14

LSB SDK を使用してテスト ELF プログラムを作成しました (私の質問は LSB に固有のものではないことに注意してください)。

$ /opt/lsb/bin/lsbcc tst.c
$ ls -l a.out 
-rwxr-xr-x 1 math math 10791 2009-10-13 20:13 a.out
$ file a.out 
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

しかし、私はそれを起動できません (はい、ファイルディレクトリにあることを保証します... ):

$ ./a.out 
bash: ./a.out: No such file or directory

$ uname -a
Linux math 2.6.28-15-generic #52-Ubuntu SMP Wed Sep 9 10:48:52 UTC 2009 x86_64 GNU/Linux

満たされていないELF依存関係があると思いますが、それを見つける方法がわかりません。ミッシングリンクを見つけるために使用できるライブラリ用の ldd に似たツールはありますか?

LSB コンパイラが動作しているため、2.6.15/2.6.28-15 の違いとは関係ないと思います。

$ file /opt/lsb/bin/lsbcc 
/opt/lsb/bin/lsbcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped

念のため、a.out の ELF 動的セクションを次に示します。

 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400428
 0x000000000000000d (FINI)               0x400638
 0x0000000000000004 (HASH)               0x400278
 0x0000000000000005 (STRTAB)             0x400350
 0x0000000000000006 (SYMTAB)             0x4002a8
 0x000000000000000a (STRSZ)              121 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x600fe8
 0x0000000000000002 (PLTRELSZ)           24 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x400410
 0x0000000000000007 (RELA)               0x4003f8
 0x0000000000000008 (RELASZ)             24 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x4003d8
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0x4003ca
 0x0000000000000000 (NULL)               0x0
4

1 に答える 1

17

これは、ELF インタープリターが欠落している場合に何が起こるかのように見えます。

/lib/ld-lsb.so.2(または同様のもの。LSB のバージョンとアーキテクチャによって異なります) が存在する ことを確認します。ldd実行可能ファイルが要求している ELF インタープリターをreadelf -l表示できます。

lsbcc(またはLSBツールチェーンの何か)は/lib/ld-linux.so.2、おそらく-Wl,--dynamic-linker=/lib/ld-lsb.so.2コンパイラに渡すことによって、システムのデフォルトをオーバーライドします。理由は、かなりばかげていると思います(Glibcは常にここでかなり優れた後方互換性を提供してきました)が、そこにあります。)

于 2009-10-13T20:39:02.330 に答える