3

我正在使用 atmelstudio 编译固件映像,并希望将静态库(包括 gnu 的 libc.a 和 libgcc.a)中的函数放在 .text 部分的开头,然后 .text 属于我的项目源代码。现在发生的事情恰恰相反。

这是我的链接器脚本

    . = ALIGN(4);
    _sfixed = .;
    KEEP(*(.vectors .vectors.*))
    *(.text .text.* .gnu.linkonce.t.*)    <-- my functions and functions from static libraries are within this rule
    *(.glue_7t) *(.glue_7)
    *(.rodata .rodata* .gnu.linkonce.r.*)
    *(.ARM.extab* .gnu.linkonce.armextab.*)
4

1 回答 1

4

中的星*(.text)号表示匹配任何目标文件。您需要给出 libc 的名称并将其放在首位。这些在 gnu ld 手册中被称为输入部分。根据手册的语法是libc.a:(.text),您可以在库中订购特定对象,使用libc.a:strcmp.o(.text).

有关详细信息,请参阅:Gnu Ld 第 3.6.4.1 节输入部分基础


一个解决方案可能是,

KEEP(*(.vectors .vectors.)) 
.a:(.text .text. .rodata .rodata*) <-- this line 
*(.text .text. .gnu.linkonce.t.*) 
*(.glue_7t) *(.glue_7) 
*(.rodata .rodata .gnu.linkonce.r.*)
于 2014-03-19T14:49:21.067 回答