我已经为代码生成器编写了一个接口,可以让我生成共享对象。虽然我不想实现对节头表的支持,因为这是 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