libstdc++.so:添加符号时出错:文件格式错误

Posted

技术标签:

【中文标题】libstdc++.so:添加符号时出错:文件格式错误【英文标题】:libstdc++.so: error adding symbols: File in wrong format 【发布时间】:2015-03-14 02:29:58 【问题描述】:

我正在尝试建立自己的库。它适用于 x86 linux,所以我想为 MIPS Linux (Little endian) 构建。

我在 Mento Graphics 和 buildroot 和 CMake 中使用 sourcery codebench。

我如下配置了 build_all.sh

#!/bin/bash -ev
export TARGETROOT="/usr/mipsel-buildroot-linux-gnu/sysroot"

mkdir -p mips_build
cd mips_build

cmake  -DCMAKE_SYSTEM_NAME="Linux" \
    -DCMAKE_C_COMPILER="$CROSS_COMPILEgcc" \
    -DCMAKE_CXX_COMPILER="$CROSS_COMPILEg++" \
    -DCMAKE_AR="$CROSS_COMPILEar" \
    -DCMAKE_C_FLAGS="-EL -c -g  -O2 -fPIC --sysroot=$TARGETROOT "  \
    -DCMAKE_CXX_FLAGS="-EL  -c -g  -O2 -fPIC --sysroot=$TARGETROOT " \
    ../

make

cd .. 

$CROSS_COMPILE=/home/vagrant/bd1/mips-2014.05/bin/mips-linux-gnu-

CMakeFiles.txt 如下所示。

make_minimum_required (VERSION 2.6)

set(EMSG_INCLUDE_DIR  $CMAKE_CURRENT_SOURCE_DIR/../../src/eagle_msg/include )
set(EMSG_LIB_DIR  $CMAKE_CURRENT_SOURCE_DIR/../../lib )

set (PROJECT_SOURCE_DIR $CMAKE_CURRENT_SOURCE_DIR/src)
set (PROJECT_INCLUDE_DIR $CMAKE_CURRENT_SOURCE_DIR/include)
set (PROJECT_LIB_DIR $CMAKE_CURRENT_SOURCE_DIR/lib)


set(LIBRARIES  
    libemsg.a 
    libzmq.a  
    libprotobuf.a
    libprotobuf-c.a
    libpthread.a
    libstdc++.a
     )

#For controller : Client 
SET(EXECUTABLE test_controller)
project ($EXECUTABLE)
include_directories(
        $PROJECT_INCLUDE_DIR
        $EMSG_INCLUDE_DIR
        $ENVTARGETROOT/usr/include
)

link_directories( 
    $PROJECT_LIB_DIR 
    $EMSG_LIB_DIR
    $ENVTARGETROOT/usr/lib

)

set(SRCS 
    test_controller.cpp
)
add_executable( $EXECUTABLE  $SRCS)
target_link_libraries( $EXECUTABLE $LIBRARIES )

然后它会产生如下错误。

[ 40%] Built target emsg
Linking CXX executable ../../../bin/test_controller
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make[2]: *** [../bin/test_controller] Error 1
make[1]: *** [test/emsg_test/CMakeFiles/test_controller.dir/all] Error 2

所以我检查了 libstdc++.so 的格式。然后是 ELF 32 位 LSB 共享对象,MIPS,MIPS32。那是正确的版本。那我能做些什么来解决呢?

/usr/mipsel-buildroot-linux-gnu/sysroot# file /usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.* 
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.a:         current ar archive
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.so:        symbolic link to `libstdc++.so.6.0.19'
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.so.6:      symbolic link to `libstdc++.so.6.0.19'
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.so.6.0.19: ELF 32-bit LSB shared object, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, with unknown capability 0xf41 = 0x756e6700, not stripped

新信息

好像是buildroot的问题。我检查了 mips-linux-gnu-gcc 的 sysroot 值。

这是安装 buildroot 之前的结果。

$ mips-linux-gnu-gcc --print-sysroot
/home/vagrant/bd1/mips-2014.05/bin/../mips-linux-gnu/libc

这是安装 buildroot 后的结果。

$ mips-linux-gnu-gcc --print-sysroot
/usr/usr/mipsel-buildroot-linux-gnu/sysroot/soft-float/el

我还发现了post 类似的问题。但这是老问题了。

【问题讨论】:

【参考方案1】:

请使用 Buildroot 提供的 CMake 工具链文件。它在$(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake 中生成。以这种方式使用它:

cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/host/usr/share/buildroot/toolchainfile.cmake

然后您可以删除所有其他 -DCMAKE_ 变量,因为工具链文件向 CMake 指示要使用的编译器、标志等。

【讨论】:

我找到了 toolchainfile.cmake。我测试了它,但它没有用。我的 cmake 版本是 2.8.0。好像是Buildroot的脚本问题。 ------------------------------------------- > 字符串子命令 REPLACE 至少需要四个参数。 >调用堆栈(最近调用优先): > /usr/share/cmake-2.8/Modules/CMakeDetermineSystem.cmake:86 > (INCLUDE) 请在 Buildroot 错误跟踪器中报告错误。 toolchainfile.cmake 应该可以工作,并且已经过多次测试。因此,请提交包含重现问题的详细步骤的错误报告。抱怨 Stack Overflow 并不能解决问题。【参考方案2】:

我找到了原因。主要原因是sysroot路径。 Buildroot 将所有工具链组织到 $BUILDROOT/output/host/ 中。所以你应该像下面这样改变PATH环境。

HOST_BINARY="$BUILDROOT/output/host/usr/bin"
PATH="$PATH:$HOST_BINARY" 

$BUILDROOT 是解压 buildroot 的文件夹。

你应该使用$BUILDROOT/output/host/usr/bin下面的工具链。

【讨论】:

以上是关于libstdc++.so:添加符号时出错:文件格式错误的主要内容,如果未能解决你的问题,请参考以下文章

//usr/lib/x86_64-linux-gnu/libcrypto.so.1.1:添加符号时出错:命令行中缺少 DSO

等待设备时出错:AVD的仿真器进程被杀死了

未从 libstdc++.a(libstdc++.so.6) 导出对“_ZNSt5__padIcSt11char_traitsIcEE6_S_padERSt8ios_basecPcPKcllb”符号的

ldd 可执行文件如何找到 /usr/lib64/libstdc++.so.6?

centos缺少共享库:libstdc++.so.6

libstdc++.so.6:未找到版本 GLIBCXX_3.4.20