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