2009-09-11 32 views
0

我正在维护一个可以将ELF32重定位转换为RDOFF2格式的工具。
有关此过程工作,我需要预先链接输入文件正在使用如下所示的LD-脚本:GNU LD脚本捕捉C++组/ dynsym部分

​​3210

的目标是减少输入文件只包含的.text。数据的.bss.strtab的.symtab.shstrtab部分。

虽然CURREN版本正常工作与它打破了C++为g ++/LD似乎产生类型SHT_DYNSYM后,我的一些C++的符号命名的部分C代码。

我的问题:如何修改提供的链接器脚本来捕获这些流浪符号?

这里是我的榜样来源:

/* compile with g++ -c cxx_hello.cc */ 
/* generic sys write provided by syswrite_$arch.S */ 
void _syscall_write(int fd, const char *msg, unsigned len); 

void syscall_write(int fd, const char *msg, unsigned len) 
{ 
    _syscall_write(fd, msg, len); 
} 

class HelloBase 
{ 
    public: 
     HelloBase() { syscall_write(1, "::HelloBase()\n", 14); i = 42; }; 
     ~HelloBase() { syscall_write(1, "::~HelloBase()\n", 15); }; 
     int res(void) { return i; } 
    protected: 
     void sayHi(void) { syscall_write(1, "Hello", 5); }; 
    private: 
     int i; 
}; 

class HelloDeriv : public HelloBase 
{ 
    public: 
     HelloDeriv() { syscall_write(1, "::HelloDeriv()\n", 15); } 
     ~HelloDeriv() { syscall_write(1, "::~HelloDeriv()\n", 16); } 

     void greet(void) { this->sayHi(); syscall_write(1, ", World!\n", 9); } 
}; 

int 
_main(void) 
{ 
    HelloDeriv hello; 

    hello.greet(); 
    return hello.res(); 
} 

objdump的-H(唯一感兴趣的部分)的输出:

cxx_hello.o:  file format elf32-i386 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
0 _ZN9HelloBase3resEv 00000008 00000000 00000000 00000034 2**2 
       CONTENTS, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD 

1 _ZN9HelloBaseC2Ev 00000008 00000000 00000000 0000003c 2**2 
       CONTENTS, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD 

2 _ZN9HelloBaseD2Ev 00000008 00000000 00000000 00000044 2**2 
       CONTENTS, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD 

3 _ZN10HelloDerivC1Ev 00000008 00000000 00000000 0000004c 2**2 
       CONTENTS, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD 

4 _ZN9HelloBase5sayHiEv 00000008 00000000 00000000 00000054 2**2 
       CONTENTS, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD 

5 _ZN10HelloDeriv5greetEv 00000008 00000000 00000000 0000005c 2**2 
       CONTENTS, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD 

6 _ZN10HelloDerivD1Ev 00000008 00000000 00000000 00000064 2**2 
       CONTENTS, READONLY, EXCLUDE, GROUP, LINK_ONCE_DISCARD 

7 .text   00000000 00000000 00000000 0000006c 2**2 
       CONTENTS, ALLOC, LOAD, READONLY, CODE 

8 .data   00000000 00000000 00000000 0000006c 2**2 

       CONTENTS, ALLOC, LOAD, DATA 
9 .bss   00000000 00000000 00000000 0000006c 2**2 
       ALLOC 

readelf同一文件-S 有37段标题,从偏移量0x59c开始:

Section Headers: 
[Nr] Name    Type   Addr  Off Size ES Flg Lk Inf Al 
[ 0]     NULL   00000000 000000 000000 00  0 0 0 
[ 1] .group   GROUP   00000000 000034 000008 04  35 26 4 
[ 2] .group   GROUP   00000000 00003c 000008 04  35 30 4 
[ 3] .group   GROUP   00000000 000044 000008 04  35 31 4 
[ 4] .group   GROUP   00000000 00004c 000008 04  35 33 4 
[ 5] .group   GROUP   00000000 000054 000008 04  35 34 4 
[ 6] .group   GROUP   00000000 00005c 000008 04  35 35 4 
[ 7] .group   GROUP   00000000 000064 000008 04  35 36 4 
[ 8] .text    PROGBITS  00000000 00006c 000000 00 AX 0 0 4 
[ 9] .data    PROGBITS  00000000 00006c 000000 00 WA 0 0 4 
[10] .bss    NOBITS   00000000 00006c 000000 00 WA 0 0 4 
+0

进一步调查(甚至是链接的来源。)没有透露任何消息:( – Shirkrin 2009-10-28 16:11:04

+0

我投票关闭这个问题(回答我自己感觉愚蠢的。)最近版本的GCC。改变了链接行为,并暴露出不同的dynsym部分..我不认为有人能够回答这个问题。 – Shirkrin 2011-11-23 13:38:10

回答

0

嗯,我有一个非常简单的sugestion,如此简单,它可能无法正常工作......

因此到:

http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_19.html

你可以指定一个文件只是名字(的.o)为其所有部分被捕获。

而且你可以使用通配符。

难道是只有一个*的行会捕获所有剩余的部分吗?就像这样:

.bss : { 
    *(.dynbss) 
    *(.bss .bss.* .gnu.linkonce.b.*) 
    *(COMMON) 
    * 
} 
+0

对不起,但这似乎在“最近的”版本(我使用ld 2.20.1)中被打破。 – Shirkrin 2010-11-23 10:18:51