博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

os fans

MSN & Mail:jinglexy at yahoo dot com dot cn
操作系统开发博客圈:http://blog.chinaunix.net/group/group_507.html
qq group(os fans): 3*2*2*6*2*9*2
  jinglexy.cublog.cn

关于作者
马甲:天衣有缝
职业:linux driver
位置:徐家汇上海交大
|| << >> ||
我的分类


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

发表于: 2008-05-30,修改于: 2008-06-02 21:49,已浏览201次,有评论0条 推荐 投诉


网友评论
 发表评论