作者: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.*是否就是类中成员?
这只是猜测,未经证实。期待解答。
阅读(4452) | 评论(0) | 转发(0) |