如何使编译器生成“ elf32-x86-64”格式的目标文件?

问题描述 投票:0回答:1

首先,有关elf32-x86-64格式的一些背景信息。

这是一种在强制32位指针的同时利用64位硬件的格式。 Ref1Ref2

问题

我正在尝试将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目标文件?

ADD 1-3:29 PM 11/1/2019

我通过以下调整设法将Google测试编译为elf32-x86-64

  • 添加编译标志-mx32
  • 并添加链接标志-Wl,--oformat=elf32-x86-64

现在输出二进制文件libgtest.alibgtest_main.aelf32-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

ADD 2-3/47 PM 11/1/2019

安装sudo apt-get install gcc-multilib g++-multilibref)后,在以下位置获得了elf32-x86-64版本:

/usr/lib/gcc/x86_64-linux-gnu/7/x32/libstdc++.so

并且最终指向/usr/libx32/libstdc++.so.6.0.25

现在看来,我只需要找到一种方法来告诉链接器使用它...太近了!

gcc googletest elf
1个回答
0
投票

如果您将其作为gcc -mx32调用,GCC将相应地调整链接器命令行。它不仅仅是一个编译器标志。

© www.soinside.com 2019 - 2024. All rights reserved.