我从http://newlib.sourcearchive.com/documentation/1.18.0/init_8c-source.html查看了__libc_init_array的源代码.
但我不太明白这个功能是做什么的.
我知道这些符号
/* These magic symbols are provided by the linker. */
extern void (*__preinit_array_start []) (void) __attribute__((weak));
extern void (*__preinit_array_end []) (void) __attribute__((weak));
extern void (*__init_array_start []) (void) __attribute__((weak));
extern void (*__init_array_end []) (void) __attribute__((weak));
extern void (*__fini_array_start []) (void) __attribute__((weak));
extern void (*__fini_array_end []) (void) __attribute__((weak));
Run Code Online (Sandbox Code Playgroud)
在链接描述文件中定义.
链接器脚本的一部分可能如下所示:
.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array*))
PROVIDE_HIDDEN (__preinit_array_end = .);
} >FLASH
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array*))
PROVIDE_HIDDEN …Run Code Online (Sandbox Code Playgroud) 我正在为Raspberry Pi开发一个小内核作为学校项目.我们遇到了静态变量初始化的问题:它们似乎根本没有初始化.我找到了一些相关的主题,但到目前为止还没有人提出解决方案,虽然这有助于我理解这个问题(至少,我认为).
所有代码都可以在此存储库中找到,但我将在此处尝试总结相关代码.
从显示问题的项目中提取的代码:(kernel/src/kernel.cpp)
static int staticVal = 42;
void doStuff() { // Prevent the compiler from optimizing the value of staticVal
staticVal++;
}
__attribute__((section(".init")))
int main(void) {
//...
gpio::blinkValue(staticVal); // Displays the value through LEDs
//...
}
Run Code Online (Sandbox Code Playgroud)
然后使用(例如)编译代码
arm-none-eabi-g++ -O2 -std=c++11 -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -nostartfiles -Wall -Wextra -pedantic -I src/ -I uspi/include -DHW_PI_1B -c src/[file].cpp -o _build/[file].o
Run Code Online (Sandbox Code Playgroud)
并使用相同的选项内置到二进制文件中,最后组装成kernel.img使用
arm-none-eabi-ld --no-undefined _build/master.bin -Map _build/kernel.map -o _build/output.elf -T kernel.ld
arm-none-eabi-objcopy _build/output.elf -O binary kernel.img
Run Code Online (Sandbox Code Playgroud)
(您可以直接阅读Makefile以获取更多详细信息:github.com/tobast/sysres-pikern/blob/staticNotWorking/kernel/Makefile).
使用的链接器脚本也可能是问题所在,因为我们试图找出如何在不知道我们在做什么的情况下编写工作脚本(我们使用来自另一个项目的修改过的链接器脚本):github.com/tobast/sysres …