如何将共享库安装到嵌入式Linux

时间:2019-04-03 21:54:58

标签: linux gcc arm shared-libraries

我正在为Digilent Zybo Zynq-7000(ARMv7 Cortex-A9)写一些C ++ 17代码。我正在使用arm-linux-gnueabihf GCC 8.3 toolchain。我下载了编译器和sysroot。

我可以使用-static链接器标志来编译和运行项目,但是这会导致巨大的二进制文件,并且如果启用LTO,则会遇到内部编译器错误。

当我尝试使用共享库进行编译时,即使复制了.sosysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi/lib文件夹中的所有usr/lib文件,我也无法在目标设备上运行它。

构建环境中我的Dockerfile的重要部分:

RUN wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
RUN tar xf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz && \
    rm gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
ENV PATH="${PATH}:/home/develop/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin"
RUN wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/sysroot/sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi.tar.xz
RUN mkdir /home/develop/sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi
WORKDIR /home/develop/sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi
RUN tar xf ../sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi.tar.xz && \
    rm ../sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi.tar.xz

Complete version on GitHub

我的CMake工具链文件:

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)

# Specify the cross compiler
SET(CMAKE_C_COMPILER   arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)

# Where is the target environment
SET(CMAKE_FIND_ROOT_PATH /home/develop/sysroot-glibc-8.3-2019.03-x86_64-arm-linux-gnueabi)

# Search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
-mcpu=cortex-a9 \
-mfpu=neon -mfloat-abi=hard -ftree-vectorize -mvectorize-with-neon-quad" 
CACHE STRING "" FORCE)

# Link all libraries statically
# SET(CMAKE_EXE_LINKER_FLAGS " -static"
# CACHE STRING "" FORCE)

我的可执行文件需要的共享库是:

$ arm-linux-gnueabihf-readelf -d bin/test-crypto
Dynamic section at offset 0x5cef0 contains 29 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]

当我尝试在目标上运行可执行文件时,出现以下错误,因为找不到所需的库:

$ /media/test-crypto 
/bin/sh: /media/test-crypto: not found
$ ldd /media/test-crypto
checking sub-depends for 'not found'
checking sub-depends for '/usr/lib/libstdc++.so.6'
checking sub-depends for 'not found'
checking sub-depends for '/lib/libgcc_s.so.1'
checking sub-depends for 'not found'
checking sub-depends for '/lib/libm.so.1'
        libc.so.1 => /lib/libc.so.1 (0xb6ea7000)
        ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0xb6f06000)
checking sub-depends for '/lib/libc.so.1'
        ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0xb6f88000)
        libpthread.so.0 => not found (0x00000000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00000000)
        libm.so.6 => not found (0x00000000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00000000)
        libc.so.6 => not found (0x00000000)
        libm.so.1 => /lib/libm.so.1 (0x00000000)
        libc.so.1 => /lib/libc.so.1 (0x00000000)
        /lib/ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0x00000000)
        /lib/ld-uClibc.so.1 => /lib/ld-uClibc.so.1 (0x00000000)

我检查了目标上的/ lib和/ usr / lib文件夹,并且/usr/lib/libstdc++.so.6/lib/libgcc_s.so.1在那,其他三个不在。

当我将所有库从GCC sysroot文件夹复制到SD卡,并将它们添加到LD_LIBRARY_PATH时,ldd输出会更改,似乎找到了所有库,但是当我尝试时运行可执行文件,我仍然遇到相同的错误:

$ LD_LIBRARY_PATH=/media/lib ldd /media/test-crypto 
checking sub-depends for '/media/lib/libpthread.so.0'
checking sub-depends for '/media/lib/libstdc++.so.6'
checking sub-depends for '/media/lib/libm.so.6'
checking sub-depends for '/media/lib/libgcc_s.so.1'
checking sub-depends for '/media/lib/libc.so.6'
        libpthread.so.0 => /media/lib/libpthread.so.0 (0x00000000)
        libstdc++.so.6 => /media/lib/libstdc++.so.6 (0x00000000)
        libm.so.6 => /media/lib/libm.so.6 (0x00000000)
        libgcc_s.so.1 => /media/lib/libgcc_s.so.1 (0x00000000)
        libc.so.6 => /media/lib/libc.so.6 (0x00000000)
        /lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)
        /lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)

$ LD_LIBRARY_PATH=/media/lib /media/test-crypto 
/bin/sh: /media/test-crypto: not found

我尝试使用/lib创建从库到/usr/libln -s /media/lib/* /lib的符号链接,但这没有用。

我不能将GCC sysroot添加到我们得到的Linux映像的rootfs.cpio归档文件中,因为它太大,然后当我添加太多文件时它不再启动。 SD卡的FAT32文件系统不支持符号链接,并且许多共享库都是符号链接,因此也许是个问题。我尝试使用ext2和ext4代替FAT,但是开发板不支持此功能,如果我尝试使用FAT以外的其他功能,则无法启动。仅为库添加第二个分区也不起作用。

在SD卡上安装必要的库以使我可以运行C / C ++程序的最佳方法是什么?

0 个答案:

没有答案