ノーセクションヘッダと共有オブジェクトにCプログラムをリンクする必要があります
-
22-09-2019 - |
質問
私は私が共有オブジェクトを生成することができますコードジェネレータへのインタフェースを書きました。私はしたくないけどOセクションヘッダテーブルのサポートを実装することのためにどこでELFファイル形式の遺跡の大多数の複雑ます。
はGNU LDは、共有オブジェクトに対してリンクするためのセクションヘッダーを使用します。ノーセクションヘッダと私の共有オブジェクトに対してgccのリンクを配置しようとするとき、彼らはライブラリに存在していてもldは、シンボルが見つからないので、それが失敗することをこの意味ます。
それは、特定のシンボルを見つけられないならば、は、いくつかのトリックが存在しない、私はリンクも成功させるためにコンパイラをだますために使用することができます?
ここでトラブルにいくつかの明確化があります:
cheery@ruttunen:~/Documents/g386$ gcc dev/shared_test.c -L. -lshared -m32
/tmp/cc6qBViY.o: In function `main':
shared_test.c:(.text+0xa): undefined reference to `example_function'
collect2: ld returned 1 exit status
cheery@ruttunen:~/Documents/g386$ cat dev/shared_test.c
// gcc shared_test.c -L. -lshared -m32
// LD_LIBRARY_PATH=. ./a.out
#include <stdio.h>
extern int example_function();
int main(){
printf("hello %d\n", example_function());
}
cheery@ruttunen:~/Documents/g386$ readelf -D -s libshared.so
Symbol table for image:
Num Buc: Value Size Type Bind Vis Ndx Name
2 0: 00800164 0 FUNC GLOBAL DEFAULT ABS example_function
1 0: 008000ac 0 OBJECT GLOBAL DEFAULT ABS _DYNAMIC
解決 2
ここでの最善のアプローチは、GCCによって必要なセクションテーブルを追加することです。あなたの発電メカニズムを結ぶ作業動を持っている場合、それはすべてあなたがセクションテーブルに挿入したいものと同じ情報を必要とします。
怠惰のために私は、基準点を得るためにそれに共有アセンブリファイルと使用済みのストリップのコマンドを書きました。 'readelfは、セクションのショーのカップルを--sections'が、あなたはそれらすべてを必要としません。それが正常に機能し始めるまで、私がために、この及び実装セクションを働きました。ここで私は追加する必要がありましたものです。
cheery@ruttunen:~/Documents/g386$ readelf --sections dynamic_hello.app
There are 5 section headers, starting at offset 0x1b9:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .shstrndx STRTAB 00000000 000281 000024 00 0 0 1
[ 2] .dynamic DYNAMIC 00000000 0000b0 000050 08 WA 3 0 4
[ 3] .dynstr STRTAB 00000000 000158 000020 00 A 0 0 1
[ 4] .dynsym DYNSYM 00000000 000100 000040 10 A 3 0 4
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
あなたはこれらよりも多くのセクションに置けば、それは傷つけることはありませんが、これは動的リンクの作業を取得するのに十分です。
他のヒント
gccの(つまり、gccの背後にあるLDである)未解決の外部を無視するためのコマンドラインオプションがあります。それはあなたが、GCCから取得したエラーメッセージを抑制します。私は確かにそれはあなたを幸せにしようとしていることはないよ。