2010-01-24 57 views
1

我已经写了一个代码生成器的接口,可以让我生成共享对象。虽然我不想实现对节头表的支持,因为这是ELF文件格式的大部分复杂度仍然存在的地方。我需要链接没有节标头的共享对象上的C程序

GNU ld使用节头来链接共享对象。这意味着当我尝试将gcc链接放在没有节标题的共享对象上时,它会失败,因为即使它们存在于库中,ld也找不到这些符号。

是否存在一些我可以用来欺骗编译器使链接成功的技巧,即使它找不到某些符号?

下面是一些澄清麻烦:

[email protected]:~/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 
[email protected]:~/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()); 
} 
[email protected]:~/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

请您澄清一下吗?你有符号表吗?你对“共享对象”的定义是什么? – 2010-01-24 16:06:06

+0

当然。我贴了一个显示一些上下文的粘贴。我希望这已经足够了。 – Cheery 2010-01-24 16:37:10

+3

这似乎是徒劳的练习;您希望为共享对象链接生成代码,而不提供允许动态加载器查找共享对象提供的符号的信息。 ELF的复杂性在各个部分都是正确的,但这些部分对于正确操作至关重要。 – 2010-01-24 18:44:25

回答

1

这里最好的方法是添加gcc所需的部分表。如果你的生成器中有一个工作的动态链接机制,它需要与你插入到节表中的信息相同的信息。

对于懒惰我写了一个共享程序集文件,并使用strip-command来获取参考点。扇形 - 部分显示了几个部分,但你不需要全部。我完成了这个工作并按顺序实施了部分,直到它开始正常工作。这是我不得不补充:

[email protected]:~/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) 

如果你把在不止这些部分它没有伤害,但是这足以让动态链接工作。

1

GCC(即后面的gcc LD)有一个命令行选项忽略无法解析的外部。这会抑制你从gcc获得的错误信息。我不确定那会让你快乐。