libstdc++.so: грешка при добавяне на символи: Файл в грешен формат

Опитвам се да създам собствена библиотека. Работеше на x86 linux, така че искам да създам за MIPS Linux (Little endian.)

Използвам sourcery codebench в Mento Graphics и buildroot и CMake.

Конфигурирах 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_COMPILE}gcc" \
    -DCMAKE_CXX_COMPILER="${CROSS_COMPILE}g++" \
    -DCMAKE_AR="${CROSS_COMPILE}ar" \
    -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}
        $ENV{TARGETROOT}/usr/include
)

link_directories( 
    ${PROJECT_LIB_DIR} 
    ${EMSG_LIB_DIR}
    $ENV{TARGETROOT}/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. Проверих sysroot стойността на mips-linux-gnu-gcc.

Това е резултатът преди инсталирането на 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

Намерих и публикация за подобен проблем. Но това е стар проблем.


person Jinho Yoo    schedule 15.01.2015    source източник


Отговори (2)


Моля, използвайте CMake toolchain файла, предоставен от Buildroot. Генерира се в $(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake. Използвайте го по следния начин:

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

След това можете да премахнете всичките си останали -DCMAKE_ променливи, тъй като файлът на инструменталната верига показва на CMake кой компилатор да използва, кои флагове и т.н.

person Thomas Petazzoni    schedule 16.01.2015
comment
Намерих toolchainfile.cmake. Тествах го, но не се получи. Моята версия на cmake е 2.8.0. Изглежда, че това е проблемът със скрипта на Buildroot. ------------------------------- › низова подкоманда REPLACE изисква поне четири аргумента. ›Стек за повиквания (първо последното извикване): › /usr/share/cmake-2.8/Modules/CMakeDetermineSystem.cmake:86 › (ВКЛЮЧВА) - person Jinho Yoo; 17.01.2015
comment
Моля, докладвайте за грешка в програмата за проследяване на грешки на Buildroot. Toolchainfile.cmake трябва да работи и вече е тестван няколко пъти. Затова, моля, изпратете доклад за грешка с подробни стъпки за възпроизвеждане на вашия проблем. Оплакването на Stack Overflow няма да поправи грешката. - person Thomas Petazzoni; 27.01.2015

Намерих причината. Основната причина е sysroot пътят. Buildroot организира цялата верига от инструменти в $BUILDROOT/output/host/. Така че трябва да промените PATH средата, както е показано по-долу.

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

Където $BUILDROOT е папката, където се извлича buildroot.

Трябва да използвате инструментална верига под $BUILDROOT/output/host/usr/bin.

person Jinho Yoo    schedule 16.01.2015