11

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

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

有什么办法可以做到这一点?(也许通过链接器脚本?)

谢谢

4

3 回答 3

16

解决了这个问题。对于面对它的人:

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

    ENTRY(main)
    SECTIONS
    {
        .text :
        {
            *(.text.main);
            *(.text*);
        }
    }
    
于 2013-10-22T09:57:49.560 回答
3

首先,查看 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
于 2015-01-21T20:31:49.803 回答
1

您也可以使用以下命令将“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

于 2013-11-08T22:40:43.263 回答