【发布时间】:2019-03-24 21:57:33
【问题描述】:
我正在阅读一本关于编写操作系统的书,我正在编写书中的 C 代码示例,并在终端中编译和测试代码,但我遇到了这段代码的问题。
包含此代码的文件名为“hello.c”。
我用“gcc hello.c -o hello”编译了文件
然后用“./hello”运行它。
我收到消息分段错误(核心转储), 而且我不确定自己做错了什么。
#include <stdio.h>
void preinit1() {
printf("%s\n", __FUNCTION__);
}
void preinit2() {
printf("%s\n", __FUNCTION__);
}
void init1() {
printf("%s\n", __FUNCTION__);
}
void init2() {
printf("%s\n", __FUNCTION__);
}
typedef void (*preinit)();
typedef void (*init)();
__attribute__((section(".init_array"))) preinit
preinit_arr[2] = {preinit1, preinit2};
__attribute__((section(".init_array"))) init
init_arr[2] = {init1, init2};
int main(int argc, char *argv[])
{
printf("hello world!\n");
return 0;
}
【问题讨论】:
-
stdout是在调用各种初始化函数的时候初始化的,还是在系统库初始化之前调用的?您是否尝试过使用write(0, __FUNCTION__, strlen(__FUNCTION__));而不是printf()? (这省略了换行符;它们是一种可以暂时放弃的细节。)