Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 如何使编译器生成“elf32-x86-64”格式的对象文件? 首先,介绍一些关于elf32-x86-64格式的背景信息。_Gcc_Googletest_Elf - Fatal编程技术网

Gcc 如何使编译器生成“elf32-x86-64”格式的对象文件? 首先,介绍一些关于elf32-x86-64格式的背景信息。

Gcc 如何使编译器生成“elf32-x86-64”格式的对象文件? 首先,介绍一些关于elf32-x86-64格式的背景信息。,gcc,googletest,elf,Gcc,Googletest,Elf,它是一种利用64位硬件同时强制执行32位指针的格式。和 问题 我正在尝试将Google测试框架二进制文件链接到我的项目 我使用objdump-f检查Google测试二进制文件和我的二进制文件的格式 谷歌的测试格式是elf64-x86-64。我的elf32-x86-64。因此,它们不能联系在一起 然后,我将以下内容添加到google测试的内部_utils.cmake文件中: set(ZEPHYR_LINK_FLAGS "-Wl,--oformat=elf32-x86-64") set(CMAKE_

它是一种利用64位硬件同时强制执行32位指针的格式。和

问题 我正在尝试将Google测试框架二进制文件链接到我的项目

我使用objdump-f检查Google测试二进制文件和我的二进制文件的格式

谷歌的测试格式是elf64-x86-64。我的elf32-x86-64。因此,它们不能联系在一起

然后,我将以下内容添加到google测试的内部_utils.cmake文件中:

set(ZEPHYR_LINK_FLAGS "-Wl,--oformat=elf32-x86-64")
set(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${ZEPHYR_LINK_FLAGS}")
我希望链接器标志可以将输出格式更改为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: error adding symbols: File in wrong format
/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++。因此也是elf64-x86-64格式

我检查了生成的对象文件,例如: ./googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o

它仍然是elf64-x86-64

因此,链接器标志似乎不影响对象文件格式

我记得链接器ld将根据其第一次遇到的对象文件选择输出格式。所以我想我需要告诉编译器输出elf32-x86-64格式

如何要求编译器输出elf32-x86-64对象文件

添加2019年11月1日下午1-3:29 我已通过以下调整将Google测试编译为elf32-x86-64:

添加编译标志-mx32 并添加链接标志-Wl,-oformat=elf32-x86-64 现在输出二进制文件libgtest.a、libgtest_main.a是elf32-x86-64。但是它们需要链接到libstdc++。到目前为止,在我的系统上是elf64-x86-64。我还没有找到elf32-x86-64。因此,以下错误:

/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: error adding symbols: File in wrong format
添加2019年11月1日下午2-3:47 在安装sudo apt get install gcc multilib g++-multilib之后,我得到了libstdc++的elf32-x86-64版本。因此,在以下位置:

/usr/lib/gcc/x86_64-linux-gnu/7/x32/libstdc++.so
它最终指向/usr/libx32/libstdc++.so.6.0.25

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

添加2019年11月4日下午3-2:44 感谢Florian和EmployeedRussian,我将Google Test的内部_utils.cmake文件更改为添加以下4行:

set(MY_COMPILE_FLAGS "-mx32")
set(cxx_base_flags "${cxx_base_flags} ${MY_COMPILE_FLAGS}") 
set(MY_LINK_FLAGS "-mx32")
set(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${MY_LINK_FLAGS}")
现在生成的可执行文件是elf32_x86-64格式

因此,基本上,我将-mx32添加到编译和链接标志中

在生成的rules.ninja文件中,链接规则如下所示:

command=$PRE_LINK&&/usr/bin/c++$FLAGS$LINK_FLAGS$in-o$TARGET_FILE$LINK_PATH$LINK_LIBRARIES&&$POST_BUILD

$FLAGS和$LINK_标志在build.ninja文件中定义如下:

FLAGS = -Wall -Wshadow -Werror  -mx32 ...
LINK_FLAGS = -mx32 ...
因此,本质上,忍者命令定义中有2-mx32选项,分别由$FLAGS$LINK_FLAGS提供

那么为什么我需要两次指定-mx32呢

我不明白为什么我可以为CMAKE_EXE_LINKER_标志指定-mx32

首先,-mx32只是一个编译选项,而不是链接器选项


其次,从链接规则定义来看,$link_标志传递给usr/bin/c++而不带-Wl前缀,因此即使链接器可以欣赏该选项,它也不会传递给链接器。

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

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

您看到了吗?export LDFLAGS='-m32-L/usr/lib32'您看到这个了吗?export LDFLAGS='-m32-L/usr/lib32'要详细说明,添加链接标志-Wl,-oformat=elf32-x86-64是错误的。而是将-mx32添加到链接行。@EmployedRussian我尝试为链接器添加-Wl,-mx32。我的最终链接标志是-Wl,-mx32-rdynamic。它们最终被传递到/usr/bin/x86_64-linux-gnu-g++-7,然后是/usr/bin/x86_64-linux-gnu-ld.bfd。但我得到了这个错误:/usr/bin/ld:无法识别的仿真模式:x32。似乎我不应该将-mx32传递给链接器,因为它被识别为-m链接选项。@FlorianWeimer如果我只将-mx32添加到g++编译选项中,我得到的.o文件名为elf32_x86-64,这很好。但是链接器要求输出格式为elf64_x86-64。所以我得到了这个错误/usr/bin/ld:i386:x64-32输入文件googletest/CMakeFiles/sample2_unittest.dir/samples/sample2_unittest.cc.o的体系结构与i386:x86-64输出不兼容。因此,似乎我必须明确地告诉链接器通过-Wl,-oformat=elf32-x86-64以elf32_x86-64格式输出。@smwikipedia您应该传递-mx32,不带-Wl,前缀。您必须在编译和链接命令行上同时使用-mx32。@smwikipedia没有将-mx32传递给链接器并不意味着它对链接行没有影响。在这种情况下,链接线上存在-mx32会导致gcc将-m elf32_x86_64传递给ld。此外,还选择了不同的动态链接器和不同的crt0.o。正如答案所说:-mx32不仅仅是一个编译器标志。更详细地说,添加link标志-Wl,-oformat=elf32-x86-64是错误的。而是将-mx32添加到链接行。@EmployedRus
我尝试为链接器添加-Wl,-mx32。我的最终链接标志是-Wl,-mx32-rdynamic。它们最终被传递到/usr/bin/x86_64-linux-gnu-g++-7,然后是/usr/bin/x86_64-linux-gnu-ld.bfd。但我得到了这个错误:/usr/bin/ld:无法识别的仿真模式:x32。似乎我不应该将-mx32传递给链接器,因为它被识别为-m链接选项。@FlorianWeimer如果我只将-mx32添加到g++编译选项中,我得到的.o文件名为elf32_x86-64,这很好。但是链接器要求输出格式为elf64_x86-64。所以我得到了这个错误/usr/bin/ld:i386:x64-32输入文件googletest/CMakeFiles/sample2_unittest.dir/samples/sample2_unittest.cc.o的体系结构与i386:x86-64输出不兼容。因此,似乎我必须明确地告诉链接器通过-Wl,-oformat=elf32-x86-64以elf32_x86-64格式输出。@smwikipedia您应该传递-mx32,不带-Wl,前缀。您必须在编译和链接命令行上同时使用-mx32。@smwikipedia没有将-mx32传递给链接器并不意味着它对链接行没有影响。在这种情况下,链接线上存在-mx32会导致gcc将-m elf32_x86_64传递给ld。此外,还选择了不同的动态链接器和不同的crt0.o。正如答案所说:-mx32不仅仅是一个编译器标志。