我刚刚开始学习一些 ARM 编程,但遇到了一个有点烦人的问题。我用来编译源代码的工具链是 Sourcery CodeBench Lite 2013.05-23(可以在这里找到:https ://sourcery.mentor.com/GNUToolchain/release2449 )
我需要告诉 GCC 或 LD 或 OBJCOPY 将“main”函数的编译字节码放在 .text 部分的开头。
有什么办法可以做到这一点?(也许通过链接器脚本?)
谢谢
解决了这个问题。对于面对它的人:
其次,使用链接器脚本将这些“功能部分”排序到最终的大 .text 部分中。例如,将main函数放在 .text 部分的开头会导致 LD 脚本大致如下所示:
ENTRY(main)
SECTIONS
{
.text :
{
*(.text.main);
*(.text*);
}
}
首先,查看 gcc 的默认链接器脚本中的 .text 部分是如何定义的(因此您不必自己制作),将其称为:
gcc -Wl,-verbose
这将打印出默认的链接器脚本。我的 .text 部分显示了这个:
/* text: Program code section */
.text :
{
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
}
因此,为了让“main”函数成为 .text 部分中的第一个(其余部分是连续的),您必须为所有其他函数设置“section”属性。例如:
void main(void);
void funct1(....) __attribute__ ((section (".text.A")));
void funct2(....) __attribute__ ((section (".text.A")));
void funct3(....) __attribute__ ((section (".text.A")));
“归因”函数原型就足够了。这样,当您现在编译时,“main”函数将是“.text”部分中的第一个函数,所有其他函数将紧随其后的连续地址。
如果您想将“.text”部分(即“main”函数)放置在特定地址(例如 0x1000),请记住链接:
gcc .... -Wl,-Ttext=0x1000
您也可以使用以下命令将“main”放在自己的部分中__attribute__
:
int main (void) __attribute__ ((section ("entry")));
然后在 ld 文件中:
ENTRY(main)
SECTIONS
{
.text :
{
*(main)
*(.text)
}
}
还有很多其他有趣的__attributes__
,在这里阅读更多关于它们的信息:http: //gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html