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

Cor*_*uzu 6 gcc program-entry-point ld linker-scripts objcopy

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

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

有没有办法实现这个目标?(也许通过链接器脚本?)

谢谢

Cor*_*uzu 11

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

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

    ENTRY(main)
    SECTIONS
    {
        .text :
        {
            *(.text.main);
            *(.text*);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用:'int main(int argc,char**argv)__ attribute __((section(".text.main")));' 并将其余部分保留在默认部分. (3认同)

小智 5

首先,查看 .text 部分是如何在 gcc 的默认链接器脚本中定义的(因此您不必创建自己的链接器脚本),将其调用为:

gcc -Wl,-verbose
Run Code Online (Sandbox Code Playgroud)

这将打印出默认的链接描述文件。我的显示了 .text 部分:

/* text: Program code section */
  .text : 
  {
    *(.text)
    *(.text.*)
    *(.gnu.linkonce.t.*)
  }
Run Code Online (Sandbox Code Playgroud)

因此,为了使“main”函数成为 .text 部分中的第一个函数(并且其余函数是连续的),您必须为所有其他函数设置“section”属性。例如:

void main(void);
void funct1(....) __attribute__ ((section (".text.A")));
void funct2(....) __attribute__ ((section (".text.A")));
void funct3(....) __attribute__ ((section (".text.A")));
Run Code Online (Sandbox Code Playgroud)

“归因”函数原型就足够了。这样,当您现在编译时,“main”函数将是“.text”部分中的第一个函数,所有其他函数将紧随其后的连续地址。

如果您想将“.text”部分(即“main”函数)放置在特定地址(例如0x1000),请记住链接:

gcc .... -Wl,-Ttext=0x1000
Run Code Online (Sandbox Code Playgroud)