【发布时间】:2017-08-28 09:24:48
【问题描述】:
我试图了解裸机 C 应用程序是如何工作的。我编写了自己的启动汇编代码,调用__libc_init_array,我看到它遍历preinit_array 部分并调用里面的所有函数。据我了解,gcc 为一些需要在 main 之前运行的自己的初始化例程添加了该部分,但随后在 .init 部分中出现了 _init() 函数。
gcc 会生成那个函数吗?它来自libc吗?还是我必须自己提供一份?有什么好的资源来学习这些东西?
【问题讨论】:
-
好的资源包括你的平台文档和
objdump。 -
符号与平台有什么关系? init_() 是由 gcc 在一个平台上生成而不是在另一个平台上生成的吗?:)
-
所有过程都是特定于平台的。例如,在 AVR 上,init 代码必须包含一些填充以跳过中断向量表。然后内容本身在这里设置 C 程序运行的环境:初始化固定寄存器,设置堆栈指针,也许安装一些陷阱处理程序……同样,所有这些都是特定于平台的。
-
是的,但谁生成_init?我要手动写吗?海合会?它是从某个库链接的吗?
-
__libc_init_array 只是一些奇怪的 gcc 特定的东西,它与处理器启动代码本身无关。较小的嵌入式应用程序根本不使用标准库是很常见的。