ELFライブラリの共有:移転が範囲外のオフセット
-
25-09-2019 - |
質問
(ちょうどCのためのelfutils
として - その名)ELFバイナリをチェックするためのeu-elflint
と呼ばれるプログラムを含むソフトウェアパッケージlint
があります。
だけが、好奇心のために、私は、このツールを使って私たち自身の共有ライブラリをチェックして、それは問題の多く、例えば見つかりました:ます。
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
あなたが見ることができるようにしても簡単な例でも問題の多くを示しています。
ところで:私は、Ubuntuの-カルマ-32bit版とGCC v4.4.1
の午前ところで:...同じことが、GCC v4.2.4
でのDebianレニー・64ビットで発生します私は心配しなければならないこの何かですか?
解決
クイック答え:「これは私が心配しなければならない何かか?」 いいえ。
長い答え:elflintチェックだけでなく、ABI規格だけでなく、いくつかのELF規則。 ABIが拡張され、下位互換性を維持する必要があり、そしてELFの規則は、時間を(主に、新機能を取得する)とともに進化します:両方のABIとELFの規則は、時間の経過とともに変化します。その結果、elflintの期待はどのようなあなたのアセンブラ/リンカ(この場合はGNU binutilsの)農産物と同期して保持する必要があります。あなたは、GNU binutilsの中に導入された新しいELF拡張についてelflintするレポートをたくさん見つけ、そのためだけに、後でキャッチelflintことができます。したがって、それはあなたがあなたのインストールbinutilsのための古すぎるelflintのバージョンを持っていることを最も可能性の高いです。 elflintはあまり使用されていないとして、それはLinuxのディストリビューションがうまく同期して、これらの2を保持していないことを私は驚かないだろう。