我刚开始学习一些ARM编程,遇到了一个稍微有点烦人的问题。我正在使用Sourcery CodeBench Lite 2013.05-23(可以在此处找到:https://sourcery.mentor.com/GNUToolchain/release2449)来编译我的源代码。
我需要告诉GCC或LD或OBJCOPY将'main'函数的已编译字节码放在.text部分的开头。
是否有方法实现这一点?(也许通过链接脚本?)
谢谢
我刚开始学习一些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 -Wl,-verbose
这将打印默认的链接器脚本。我的显示如下,针对 .text 段:
/* text: Program code section */
.text :
{
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
}
因此,为了使“主”函数在.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
__attribute__
将“main”放入自己的部分中:int main (void) __attribute__ ((section ("entry")));
然后在 ld 文件中:
ENTRY(main)
SECTIONS
{
.text :
{
*(main)
*(.text)
}
}
还有很多其他有趣的__属性__
,在这里阅读更多相关信息:http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
main
函数的正确返回类型是 int
,而不是 void
。(void main(void)
可能会被一些编译器允许;但在托管实现中,int main(void)
是通用的。) - Keith Thompson__attributes__
的一个例子,我不知道他的主函数是什么样子的 :) - ordahanmain
的两个有效签名之一。clang 拒绝编译 void main()
。 - Peter Cordes
*(.text*.main);
而不是*(.text.main);
是更好和更通用的方式,因为在.text
和.main
之间可能会有其他短语,就像在我的情况下,main
标签是.text.startup.main
,并且一开始并不能正常工作,后来通过在中间添加通配符进行修复。 - Celuk