GCC:如何告诉GCC将'main'函数放在.text段的开头?

时间:2013-10-19 20:15:46

标签: gcc main ld linker-scripts objcopy

我刚刚开始学习一些ARM编程,但我遇到了一个有点恼人的问题。我用来编译源代码的工具链是Sourcery CodeBench Lite 2013.05-23(可以在这里找到:https://sourcery.mentor.com/GNUToolchain/release2449

我需要告诉GCC或LD或OBJCOPY将'main'函数的编译字节码放在.text段的开头。

有没有办法实现这个目标? (也许通过链接描述文件?)

谢谢

3 个答案:

答案 0 :(得分:10)

解决了这个问题。无论面对谁:

  • 使用GCC进行编译时,请在命令行中添加 -ffunction-sections 选项。 会告诉GCC将每个功能放在一个单独的部分中。部分名称的格式为 .text。#function name#,没有(即,如果该函数属于.text部分[默认情况下]是真的])。
  • 其次,使用链接描述文件将这些“函数部分”排序到最后的大.text部分。例如,将 main 函数放在.text部分的开头会导致LD脚本看起来大致如下:

    ENTRY(main)
    SECTIONS
    {
        .text :
        {
            *(.text.main);
            *(.text*);
        }
    }
    

答案 1 :(得分:1)

您也可以使用__attribute__

将'main'放在自己的部分中
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