gpt4 book ai didi

c - 代码中的 "my_main()"是什么

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:18 25 4
gpt4 key购买 nike

我在一个项目中看到过如下代码:

extern void my_main(void) __attribute__ ((__noreturn__, asection(".main","f=ax")));

这是做什么的?

项目中没有直接的 main() 函数。上面的代码是否向编译器表明 my_main() 应该被视为 main()

还有,.main内存段是什么意思?

最佳答案

上面的声明基本上是声明一个名为 my_main()extern 函数,不带任何参数。

__attribute__ 部分是 GNU/LLVM attribute syntax .属性基本上是描述相关函数的一些非标准或扩展特性的编译指示 - 在本例中为 my_main()


my_main() 有两个属性。

__noreturn__ (搜索 noreturn)表示该函数将从不返回。

这与返回 void 不同 - 在 void 类型的函数中,即使没有值(value)。这意味着执行将跳转/返回调用者。

noreturn(又名 _noreturn__noreturn__)函数中,这表明,除其他外,调用此函数不应添加堆栈的返回地址,因为函数本身将在执行返回之前退出,或者将长跳转到执行中的另一个点。

它也用于将返回地址添加到堆栈会以干扰被调用函数的方式破坏堆栈的地方(尽管这种情况很少见,我只见过一次因为这个原因使用它)。


第二个属性 asection(".main","f=ax") 有点模糊。我似乎找不到它的具体文档,但它似乎或多或少非常简单。

它似乎在做的是指定一个 linker section以及 看起来unix filemode 的东西指定生成的二进制文件是 ex可执行的,尽管我可能是错的。


当您编写 native 代码时,所有功能都放在目标二进制格式的适当部分(例如 ELF、Mach-O、PE 等)。最常见的部分是 .text.rodata,和.data

但是,当调用 GCC 链接器 ld 时,您可以指定 linker script 确切地指定目标二进制文件的构建方式。

这包括部分、大小,甚至是您要用来制作文件的目标文件,指定它们应该去哪里以及它们的大小限制。

一个常见的误解是您从不使用 ld。事实并非如此;当您运行 gccg++clang 系列编译器时没有 -c 标志,您会无意中调用ld 带有 default linker script用于链接您的二进制文件。

链接器脚本对于必须根据内存规范构建 ROM 的嵌入式硬件尤其重要。


回到您的代码行:它将 my_func() 放入名为 .main 的任意部分。这就是它所做的一切。最终,在您的项目中的某处,有一个链接描述文件指定了 .main 的使用方式及其去向。

我想这段代码的目标是将 my_main() 放在目标二进制文件/可执行文件中的确切地址,所以无论使用它的人都知道确切的地址该函数的位置 (asection(".main")) 并可以将其用作入口点 (__noreturn__)。

关于c - 代码中的 "my_main()"是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35198820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com