3

ELF バイナリをチェックするためにelfutils呼び出されるプログラムを含むソフトウェア パッケージがあります ( C の場合と同様 - 名前の由来)。eu-elflintlint

好奇心のために、このツールを使用して独自の共有ライブラリをチェックしたところ、次のような多くの問題が見つかりました。

eu-elflint libUtils.so

section [ 2] '.dynsym': _DYNAMIC symbol size 0 does not match dynamic segment size 248
section [ 2] '.dynsym': _GLOBAL_OFFSET_TABLE_ symbol size 0 does not match .got.plt     section size 3076
section [ 8] '.rel.plt': relocation 0: offset out of bounds
section [ 8] '.rel.plt': relocation 1: offset out of bounds
...
section [ 8] '.rel.plt': relocation 765: offset out of bounds

クロスチェックとして、以下のソースコードから非常に簡単な共有ライブラリを構築しました

int foo(int a) {
   return a + 1;
}

// gcc -shared -fPIC -o libfoo.so foo.c

そして再挑戦…

eu-elflint libfoo.so

section [ 9] '.rel.plt': relocation 0: offset out of bounds
section [ 9] '.rel.plt': relocation 1: offset out of bounds
section [23] '.comment' has wrong flags: expected none, is MERGE|STRINGS
section [25] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol size 0 does not match .got.plt section size 20
section [25] '.symtab': _DYNAMIC symbol size 0 does not match dynamic segment size 200

ご覧のとおり、些細な例でも多くの問題が示されています。

ところで:私はgcc v4.4.1でUbuntu-Karmic-32bitを使用しています

ところで:... gcc v4.2.4を使用したDebian-Lenny-64bitでも同じことが起こります

これは私が心配すべきことですか?

4

1 に答える 1

0

簡単な回答: 「これは私が心配する必要があることですか?」いいえ

より長い答え: elflint は、ABI 標準だけでなく、いくつかの ELF 規則もチェックします。ABI と ELF の規則はどちらも時間の経過とともに変化します。ABI は拡張され、下位互換性を維持する必要があり、ELF の規則は時間の経過とともに進化します (主に新しい機能を取得するため)。結果として、elflint の期待値は、アセンブラー/リンカー (この場合は GNU binutils) が生成するものと同期を保つ必要があります。GNU binutils で導入された新しい ELF 拡張について、elflint への多くのレポートが見つかります。したがって、インストールされている binutils に対して古すぎるバージョンの elflint を使用している可能性が最も高くなります。elflint はあまり使用されていないため、Linux ディストリビューションがこれら 2 つの同期をうまく保っていないことは驚くことではありません。

于 2010-02-11T10:56:12.447 に答える