c++ 在AllWinner设备上运行交叉编译的二进制文件时出现未找到错误

dddzy1tm  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(157)

我想交叉编译一个C++应用程序的AllWinner板运行OpenWRT。我已经找到了toolchain,并尝试使用CMake docs中描述的CMake构建Hello world应用程序。所以我有一个allwinner.cmake文件,其中包含

# the name of the target operating system
set(CMAKE_SYSTEM_NAME Linux)

# which compilers to use for C and C++
set(CMAKE_C_COMPILER  gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++)

# where is the target environment located
set(CMAKE_FIND_ROOT_PATH gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu/)

# adjust the default behavior of the FIND_XXX() commands:
# search programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# search headers and libraries in the target environment
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

我也有CMakeLists.txt与此内容:

project(hello)
add_executable(hello main.cpp)

我正在使用以下命令构建应用程序:

cmake -B build -DCMAKE_TOOLCHAIN_FILE=allwinner.cmake
-DCMAKE_BUILD_TYPE=Release . && cmake --build build

之后,我收到***hello***二进制文件,将其复制到/tmp中的板上,并尝试在那里运行它,如下所示:

# cd /tmp
# ./hello
sh: ./hello: not found

我不明白为什么我收到这个错误,它意味着什么。运行ldd hello会得到:

# ldd hello
    /lib/ld-linux-aarch64.so.1 (0x7fb5587000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fb543b000)
    libm.so.6 => /lib/ld-linux-aarch64.so.1 (0x7fb5587000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x7fb541b000)
    libc.so.6 => /lib/ld-linux-aarch64.so.1 (0x7fb5587000)

这个输出看起来是正确的。
谁能解释一下我做错了什么?

siv3szwd

siv3szwd1#

不允许从/tmp运行可执行文件。
您可以使用命令mount检查挂载的文件系统,并查看/tmp是否使用noexec属性挂载。

3pvhb19x

3pvhb19x2#

我使用了无效的工具链。当我比较两个ldd输出时检测到。正如我之前写的,我的二进制代码给出了这样的结果:

# ldd hello
    /lib/ld-linux-aarch64.so.1 (0x7fb5587000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fb543b000)
    libm.so.6 => /lib/ld-linux-aarch64.so.1 (0x7fb5587000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x7fb541b000)
    libc.so.6 => /lib/ld-linux-aarch64.so.1 (0x7fb5587000)

系统的ls的ldd给出了:

# ldd /bin/ls
    /lib/ld-musl-aarch64.so.1 (0x7f7b940000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x7f7b920000)
    libc.so => /lib/ld-musl-aarch64.so.1 (0x7f7b940000)

正如你所看到的,区别在于libc。我的二进制文件想要使用ld-linux-aarch 64,而ls二进制文件使用ld-musl-aarch 64。我已经下载了aarch 64-musl交叉编译器,用它构建了我的二进制文件,瞧,它现在工作了。

相关问题