运行使用工具链编译的二进制文件时出现分段错误

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

我有 crosstool-NG c++ 工具链(用它构建的 gcc 和 Boost 库),我使用它构建了这个 hello world 项目:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(HelloBoost)

set(CMAKE_CXX_STANDARD 20)

find_package(Boost 1.84.0 REQUIRED COMPONENTS filesystem)

link_directories(/home/vchistyakov/pt/647/output/toolchain/x86_64-pt-linux-gnu/sysroot/lib /home/vchistyakov/pt/647/output/toolchain/x86_64-pt-linux-gnu/sysroot/usr/lib)

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    add_executable(HelloBoost main.cpp)
    target_link_libraries(HelloBoost ${Boost_LIBRARIES})
else()
    message(FATAL_ERROR "Boost not found")
endif()

main.cpp:

#include <iostream>
#include <boost/filesystem.hpp>

int main() {
    boost::filesystem::path p = boost::filesystem::current_path();
    std::cout << "Current path is: " << p << std::endl;
    return 0;
}

工具链.cmake:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR x86_64)

set(CMAKE_SYSROOT "/tmp/toolchain/x86_64-pt-linux-gnu/sysroot")

set(CMAKE_C_COMPILER "/tmp/toolchain/bin/x86_64-pt-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/tmp/toolchain/bin/x86_64-pt-linux-gnu-g++")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

编译没有问题,但是当我在目标操作系统上运行二进制文件时,出现分段错误:

LD_LIBRARY_PATH=/tmp/toolchain/x86_64-pt-linux-gnu/sysroot/lib:/tmp/toolchain/x86_64-pt-linux-gnu/sysroot/usr/lib gdb ./HelloBoost

我做错了什么?

c++ cross-compiling
1个回答
0
投票

问题出在动态链接器(“ld-linux-x86-64.so.2”)上。为了成功运行该程序,我必须通过运行以下命令将其从工具链更改为链接器:

patchelf --set-interpreter /tmp/toolchain/x86_64-pt-linux-gnu/sysroot/lib64/ld-linux-x86-64.so.2 HelloBoost

LD_LIBRARY_PATH=/tmp/toolchain/x86_64-pt-linux-gnu/sysroot/usr/lib ./HelloBoost
© www.soinside.com 2019 - 2024. All rights reserved.