Chinaunix首页 | 论坛 | 博客
  • 博客访问: 704465
  • 博文数量: 60
  • 博客积分: 2849
  • 博客等级: 少校
  • 技术积分: 1011
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-10 15:38
文章分类
文章存档

2013年(4)

2012年(11)

2011年(5)

2010年(3)

2009年(9)

2008年(19)

2007年(9)

分类: C/C++

2008-05-30 09:01:46

作者: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.*是否就是类中成员?
这只是猜测,未经证实。期待解答。

阅读(4273) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~