GNU LD脚本捕捉C++组/ dynsym部分
我正在维护一个可以将ELF32重定位转换为RDOFF2格式的工具。
有关此过程工作,我需要预先链接输入文件正在使用如下所示的LD-脚本:GNU LD脚本捕捉C++组/ dynsym部分
的目标是减少输入文件只包含的.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
嗯,我有一个非常简单的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)
*
}
对不起,但这似乎在“最近的”版本(我使用ld 2.20.1)中被打破。 – Shirkrin 2010-11-23 10:18:51
进一步调查(甚至是链接的来源。)没有透露任何消息:( – Shirkrin 2009-10-28 16:11:04
我投票关闭这个问题(回答我自己感觉愚蠢的。)最近版本的GCC。改变了链接行为,并暴露出不同的dynsym部分..我不认为有人能够回答这个问题。 – Shirkrin 2011-11-23 13:38:10