这是一种在强制32位指针的同时利用64位硬件的格式。 Ref1和Ref2。
我正在尝试将Google Test框架二进制文件链接到我的项目。
我使用objdump -f
检查Google Test二进制文件和我的二进制文件的格式。
Google测试格式为elf64-x86-64
。矿山elf32-x86-64
。因此它们不能链接在一起。
然后我将以下内容添加到Google测试的internal_utils.cmake文件中:
set(ZEPHYR_LINK_FLAGS "-Wl,--oformat=elf32-x86-64")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ZEPHYR_LINK_FLAGS}")
我希望linker标志可以将输出格式更改为elf32-x86-64
。
但是Google测试版本因以下错误而失败:
/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++.so: error adding symbols: File in wrong format
/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++.so
也是elf64-x86-64
格式。
并且我检查了生成的目标文件,例如:./googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
它是静止 elf64-x86-64
。
所以看来链接器标志不会影响目标文件格式。
我记得链接器ld
将基于其第一个遇到的目标文件来选择输出格式。所以我想我需要告诉compiler输出elf32-x86-64
格式。
我如何要求编译器输出elf32-x86-64
目标文件?
我通过以下调整设法将Google测试编译为elf32-x86-64
:
-mx32
-Wl,--oformat=elf32-x86-64
现在输出二进制文件libgtest.a
,libgtest_main.a
为elf32-x86-64
。但是它们需要链接到libstdc++.so
。到目前为止,它是我系统上的elf64-x86-64
。而且我还没有找到一个elf32-x86-64
。因此下面的错误:
/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++.so: error adding symbols: File in wrong format
安装sudo apt-get install gcc-multilib g++-multilib
(ref)后,在以下位置获得了elf32-x86-64
版本:
/usr/lib/gcc/x86_64-linux-gnu/7/x32/libstdc++.so
并且最终指向/usr/libx32/libstdc++.so.6.0.25
现在看来,我只需要找到一种方法来告诉链接器使用它...太近了!
如果您将其作为gcc -mx32
调用,GCC将相应地调整链接器命令行。它不仅仅是一个编译器标志。