1

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

2 回答 2

1

gcc(即 gcc 后面的 ld)有一个命令行选项可以忽略未解析的外部变量。这将抑制您从 gcc 获得的错误消息。我不确定那会让你开心。

于 2010-01-25T09:59:16.007 回答
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)

如果您放入比这些更多的部分并没有什么坏处,但这足以让动态链接工作。

于 2010-01-25T16:48:47.043 回答