Dal*_*e Z 5 c gcc shared-libraries
从技术上讲,就文件内容而言,输出gcc -fPIC -shared src.c和gcc -fPIC src.c?之间有什么区别?
假设int main(int, char**)已定义,src.c以便两个编译都成功.但正如预期的那样执行a.out生成的gcc -shared src.c,会出现以下错误:
-bash: ./a_shared.out: cannot execute binary file
即使它有一个main功能它.
另外,如何使用otool或等工具检查输出文件的差异objdump?
非常感谢.
共享库和可执行文件使用相同的格式:它们都是可加载的图像.然而,
共享库通常与位置无关,可执行文件通常不是.这会影响代码生成:对于与位置无关的,您必须加载全局变量或使用相对地址跳转到函数.
可执行文件有一个"入口点",即执行开始的地方.这通常不是 main(),因为它main()是一个函数,函数返回,但执行不应该从入口点返回.
现在,这并没有回答关于什么-shared做的问题.您可以使用该-v标志询问GCC .以下是我的系统在调用without和with之间的差异-shared.
collect2没有参数-shared:-dynamic-linker
/lib64/ld-linux-x86-64.so.2
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtend.o
Run Code Online (Sandbox Code Playgroud)
collect2与-shared:-shared
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtbeginS.o
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtendS.o
Run Code Online (Sandbox Code Playgroud)
看起来代码生成不受影响:您仍然必须使用-fpic或-fPIC.
您可以看到crt1.o(只有"C运行时")仅在链接可执行文件时包含.使用nm,我们可以找出它包含的内容:
$ nm /usr/lib/x86_64-linux-gnu/crt1.o
0000000000000000 R _IO_stdin_used
0000000000000000 D __data_start
U __libc_csu_fini
U __libc_csu_init
U __libc_start_main
0000000000000000 T _start
0000000000000000 W data_start
U main
Run Code Online (Sandbox Code Playgroud)
所以你可以看到它似乎定义了一些事情stdin,以及_start(它是入口点),它有一个未定义的引用main.
我不确定其余的文件是什么,但至少你知道如何找到它们,你可以四处寻找,或者如果你愿意,可以查看源代码.
| 归档时间: |
|
| 查看次数: |
4244 次 |
| 最近记录: |