|
作者:http://jinglexy.cublog.cn MSN & mail: jinglexy at yahoo.com.cn 2008.05.30
原来的链接器脚本如下:
.text : AT(ADDR(.text) - LOAD_OFFSET) { *(.text .text.*) *(.fixup) *(.gnu.warning) } = 0x9090 _etext = .;
.rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { *(.rodata) *(.rodata.*) }
. = ALIGN(16); .data : AT(ADDR(.data) - LOAD_OFFSET) { /* we do the constructor by ourself, no need the below lable */ start_ctors = .; *(.ctor*) end_ctors = .; start_dtors = .; *(.dtor*) end_dtors = .; CONSTRUCTORS
/* call: start_kernel()->rest_init()->kernel_init()->do_basic_setup()->do_initcalls() */ __initcall_start = .; *(.initcall1.init) *(.initcall2.init) *(.initcall3.init) *(.initcall4.init) *(.initcall5.init) *(.initcall6.init) *(.initcall7.init) __initcall_end = .;
*(.data) /* writeable */ *(.data.*) } _edata = .;
链接程序后发现elf中很多.gnu.linkonce.t.xxxxx这样的节, 尝试了编译几个简单的c++程序,其c++内联函数被安装到.gnu.linkonce.*这样的节中, 但是链接后不存在了。
ld --verbose查看,是脚本做的处理。 修正后的链接器脚本如下:
LOAD_OFFSET = 0xC0000000;
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) ENTRY(_pa_start32) SECTIONS { . = (LOAD_OFFSET + 0x100000); _pa_start32 = _va_start32 - LOAD_OFFSET; _text = .; .text : AT(ADDR(.text) - LOAD_OFFSET) { *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.fixup) *(.gnu.warning) } = 0x9090 _etext = .;
.rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) }
. = ALIGN(16); .data : AT(ADDR(.data) - LOAD_OFFSET) { /* we do the constructor by ourself, no need the below lable */ start_ctors = .; *(.ctor*) end_ctors = .; start_dtors = .; *(.dtor*) end_dtors = .; CONSTRUCTORS
/* call: start_kernel()->rest_init()->kernel_init()->do_basic_setup()->do_initcalls() */ __initcall_start = .; *(.initcall1.init) *(.initcall2.init) *(.initcall3.init) *(.initcall4.init) *(.initcall5.init) *(.initcall6.init) *(.initcall7.init) __initcall_end = .;
*(.data) /* writeable */ *(.data.*) *(.gnu.linkonce.d.*) } _edata = .;
. = ALIGN(4096); .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) { *(.data.idt) }
. = ALIGN(4096); __bss_start = .; .bss : AT(ADDR(.bss) - LOAD_OFFSET) { *(.bss) *(.bss.page_aligned) } . = ALIGN(4); _end = .;
/* Sections to be discarded */ /DISCARD/ : { *(.text.exit) *(.data.exit) *(.exitcall.exit) }
/* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } }
如果说内联函数加入到代码段中(.gnu.linkonce.t.*), .gnu.linkonce.r.*和.gnu.linkonce.d.*是否就是类中成员? 这只是猜测,未经证实。期待解答。
|