相关疑难解决方法(0)

如果使用-fPIC构建目标文件,我怎么能用objdump之类的东西来判断?

如何使用类似的东西来判断objdump是否已经构建了一个目标文件-fPIC

gcc shared-libraries objdump fpic

53
推荐指数
2
解决办法
3万
查看次数

我可以确定哪些编译器/链接器标记用于创建仅二进制共享库的位置?

我想知道是否有办法找出哪些g++编译器/链接器标志用于创建仅二进制库.

例如,可能存在第三方共享库(仅存在.h/.so文件).

所以我认为在编译和链接我自己的应用程序(即使用仅二进制的第三方库)时使用相同的g ++标志是个好主意.

具体来说,我要求编译器标志,如

  • -fno内联
  • -pthreads
  • -mtune =拱
  • -02

并且有兴趣使用哪些链接器标志:

  • -fpic或-fPIC
  • -fexceptions
  • -pthreads

等等.

gcc g++ shared-libraries

12
推荐指数
1
解决办法
5222
查看次数

将对象从 C++ 存档 (.a) 包含到共享库中

我正在尝试将一些目标文件包含到我正在构建的共享库中。执行以下命令(为简洁起见,已省略 [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(位置无关代码)。

为什么链接器不相信!?

相关链接:

如何在共享对象中包含存档的所有对象?

将档案 (.a) …

c++ linker ffmpeg shared-libraries static-libraries

7
推荐指数
1
解决办法
1312
查看次数

标签 统计

shared-libraries ×3

gcc ×2

c++ ×1

ffmpeg ×1

fpic ×1

g++ ×1

linker ×1

objdump ×1

static-libraries ×1