如何使用类似的东西来判断objdump是否已经构建了一个目标文件-fPIC?
我想知道是否有办法找出哪些g++编译器/链接器标志用于创建仅二进制库.
例如,可能存在第三方共享库(仅存在.h/.so文件).
所以我认为在编译和链接我自己的应用程序(即使用仅二进制的第三方库)时使用相同的g ++标志是个好主意.
具体来说,我要求编译器标志,如
并且有兴趣使用哪些链接器标志:
等等.
我正在尝试将一些目标文件包含到我正在构建的共享库中。执行以下命令(为简洁起见,已省略 [ETC] 中的内容):
/usr/bin/c++ -fPIC -std=c++14 -pthread -Iinclude/ext/liveMedia -Iinclude/ext/groupsock [ETC] -g -shared -Wl,-soname,libValkka.so -o lib/libValkka .so CMakeFiles/Valkka.dir/src/avthread.cpp.o CMakeFiles/Valkka.dir/src/opengl.cpp.o [ETC] CMakeFiles/Valkka.dir/src/decoders.cpp.o -lX11 -lGLEW -lGLU -lGL -Wl,--whole-archive lib/libavcodec.a -Wl,--no-whole-archive
所以基本上我只是创建一个共享库,其中大部分对象来自我自己的源代码(即 CMakeFiles/Valkka.dir/src/*.o),但其中一些来自外部静态库,位于“lib /libavcodec.a”。我收到以下错误:
/usr/bin/ld: lib/libavcodec.a(h264_cabac.o): relocation R_X86_64_PC32针对符号'ff_h264_cabac_tables'在制作共享对象时不能使用;使用 -fPIC /usr/bin/ld 重新编译:最终链接失败:错误值 collect2:错误:ld 返回 1 退出状态
但这太不真实了!我可以提取“libavcodec.a”
ar x libavcodec.a
Run Code Online (Sandbox Code Playgroud)
在那之后检查
readelf --relocs h264_cabac.o | egrep '(GOT|PLT|JU?MP_SLOT)'
Run Code Online (Sandbox Code Playgroud)
确实给了一些**它:
00000000175d 003100000004 R_X86_64_PLT32 0000000000000000 __stack_chk_fail - 4 000000001926 0031000000004 R_000000006_4 000000000006_000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000心
...
就像
objdump -r h264_cabac.o | grep -i "relocation"
Run Code Online (Sandbox Code Playgroud)
因此,实际上,“libavcodec.a”中的目标文件已经被编译为获得 PIC(位置无关代码)。
为什么链接器不相信!?
相关链接: