我已经编写了一个代码生成器的接口,可以让我生成共享对象。虽然我不希望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
答案 0 :(得分:1)
gcc(即gd后面的ld)有一个命令行选项来忽略未解析的外部。那将会抑制你从gcc获得的错误信息。我不确定这会让你开心。
答案 1 :(得分:1)
这里最好的方法是添加gcc所需的节表。如果您的生成器中有一个可用的动态链接机制,它需要与您在节表中插入的内容相同的所有信息。
对于懒惰,我写了一个共享的汇编文件,并在其上使用了strip-command来获取参考点。 '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)
如果你放入比这些更多的部分,这并没有什么坏处,但这足以使动态链接工作。