- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
出于观察目的,我使用 _start()、_init()、_fini() 编写了一个程序,目标是不使用启动文件。代码如下
#include <stdio.h>
void test()
{
printf("\n%s: \n",__func__);
printf("library test routine invoked\n");
int a=3,b=2;
int sum=a+b;
printf("sum=%d\n",sum);
getchar();
_fini();
}
int _start()
{
printf("\n%s: \n",__func__);
printf("in library start routine\n");
test();
return 0;
}
int _init()
{
printf("\n%s: \n",__func__);
printf("in library init routine\n");
return 0;
}
int _fini()
{
printf("\n%s: \n",__func__);
printf("in library fini routine\n");
return 0;
}
符合
gcc -nostartfiles test.c -o test
输出是
_start:
in library start routine
test:
library test routine invoked
sum=5
l
_fini:
in library fini routine
Segmentation fault (core dumped)
这里我想知道为什么可执行文件会出现段错误??我是否需要指定,因为它是程序的结尾?如果是这样,怎么办??可以做些什么来克服段错误?还有一个问题就是这些_start(),_init(),_fini()只是在处理库的时候用到的???请
最佳答案
_start
例程无法返回。通常,它调用 __libc_start_main
调用 main
。然后当 main
返回时,__libc_start_main
以 main
的返回值调用 exit
。
由于您是自己定义 _start
而不是调用 __libc_start_main
,因此您需要显式调用 exit
。您遇到了 sigfault,因为该函数预计不会返回。
有关详细信息,请参阅 this question。
关于c - 特殊函数 _init 和 _fini 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32457722/
我基本上是在寻找一种在二进制文件中提取 _fini 地址的方法。我能想到的天真的方法是使用 objdump 并解析 _fini。有没有更好的方法来做到这一点(例如不使用 objdump)。 谢谢! 最
出于观察目的,我使用 _start()、_init()、_fini() 编写了一个程序,目标是不使用启动文件。代码如下 #include void test() { printf("\n%s: \n
我正在创建一个共享库,我注意到使用 __attribute__((visibility("default"))) (连同 -fvisibility=hidden )我的图书馆也导出 _init和 _f
使用 oprofile 分析我的程序后,我感到有点惊讶。 配置文件显示我的程序在 _fini 中花费了 85%: CPU: Intel Core/i7, speed 1199 MHz (estimat
我是一名优秀的程序员,十分优秀!