繁体   English   中英

使用旧版glibc进行ARM交叉编译

[英]ARM cross compiling with older glibc

我试图将uGFX库静态构建为我的主要二进制文件。 我正在交叉编译。 我的构建系统是Ubuntu Linux,主机是ARM环境。 构建成功,但是在我的主机上执行二进制文件时,以下消息不断困扰我:

binary_name:/lib/libc.so.6:找不到版本“ GLIBC_2.17”(binary_name必需)

仅当将uGFX源包含到我的二进制文件中时,才会发生这种情况。 这是我的CMakeLists.txt的构建方式:

cmake_minimum_required(VERSION 3.9.1)
project(MyBinary)

set(CMAKE_C_FLAGS_DEBUG "-nostdinc -fsigned-char -Wstrict-prototypes -Wno-trigraphs -Wimplicit -Wformat")
set(CMAKE_CXX_FLAGS_DEBUG "-nostdinc++ -fsigned-char -Wno-trigraphs -Wimplicit -Wformat")

include_directories(./include
                ./include/ugfx
                ./ExternalProjects/ugfx
                ./ExternalProjects/ugfx/drivers/gdisp/framebuffer
                /usr/gnueabi/lib/gcc/arm-brcm-linux-gnueabi/6.3.0/include
                /usr/arm-linux-gnueabi/include
                /usr/arm-linux-gnueabi/include/linux)
link_directories(/usr/gnueabi/arm-brcm-linux-gnueabi/sysroot/lib)

set(SOURCE_FILES
   ./ExternalProjects/ugfx/src/gfx_mk.c
   ./ExternalProjects/ugfx/drivers/gdisp/framebuffer/gdisp_lld_framebuffer.c
   ./ExternalProjects/ugfx/drivers/ginput/touch/Linux-Event/gmouse_lld_linux_event.c
   MyBinary.c)

add_executable(MyBinary ${SOURCE_FILES})

target_link_libraries(MyBinary curl ssl)

我的工具链cmake文件:

include(CMakeForceCompiler)
set(CMAKE_CROSSCOMPILING 1)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_SYSROOT /usr/gnueabi/arm-brcm-linux-gnueabi/sysroot)

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)

set(CROSS_COMPILER arm-linux-gnueabi)
set(CMAKE_C_COMPILER "/usr/gnueabi/bin/arm-brcm-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER "/usr/gnueabi/bin/arm-brcm-linux-gnueabi-gcc")

使用objdump检查我的二进制文件时,我注意到以下几点:

Version References:
  required from libc.so.6:
    0x06969197 0x00 04 GLIBC_2.17
    0x0d696914 0x00 03 GLIBC_2.4
  r equired from libpthread.so.0:
   0x0d696914 0x00 02 GLIBC_2.4

这解释了我收到的消息。 使用objdump -T进一步检查可以发现以下内容:

...
00000000      DF *UND*  00000000  GLIBC_2.4   abort
00000000      DF *UND*  00000000  GLIBC_2.17  clock_gettime
00000000      DF *UND*  00000000  GLIBC_2.4   system
...

我尝试了链接器选项nodefaultlibsnostdlib libc.so.6中提供了libc.so.6文件。 我什至尝试在find_library(MYLIBC c-2.25 PATHS /usr/gnueabi/arm-brcm-linux-gnueabi/sysroot/lib)中使用find_library(MYLIBC c-2.25 PATHS /usr/gnueabi/arm-brcm-linux-gnueabi/sysroot/lib) ,并将其包含在二进制文件的target_link_libraries中,但也没有运气。

如何确保工具链libc与我的二进制文件链接?

更新1

首先回答问题。 是的,我尝试将libc静态链接到我的二进制文件。 但是然后二进制文件太大了。 好吧,该设备崩溃与SIGSEGV 此外,我不希望静态链接clib,因为最终我也希望动态链接uGFX 静态地将libc链接到共享的库是行不通的。 我还可以将所有内容静态链接在一起,但是二进制文件会变得庞大,将来在更新单个库时不会非常方便。

在设备上存在libc.so.6 我设法得到了文件系统的转储。 它位于主机的/lib目录中。 此外,我在没有uGFX情况下上传的二进制文件可以与GLIBC_2.4一起GLIBC_2.4并且可以很好地动态链接。

主机系统正在运行以下操作系统:

Linux(无)2.6.32.9#1 PREEMPT星期二1月16日11:00:00 CST 2018 armv6l GNU / Linux

同样,上述cmake文件可能无法静态链接到二进制文件。 示例显示了uGFX的源已添加到二进制文件本身。 但是我最初尝试使用以下方法:

# Find libc-2.25.so in sysroot (which lives there)
find_library(MYLIBC c-2.25 PATHS /usr/gnueabi/arm-brcm-linux-gnueabi/sysroot/lib)
add_library(gfx STATIC
    ./ExternalProjects/ugfx/src/gfx_mk.c
    ./ExternalProjects/ugfx/drivers/gdisp/framebuffer/gdisp_lld_framebuffer.c
    ./ExternalProjects/ugfx/drivers/ginput/touch/Linux-Event/gmouse_lld_linux_event.c)
target_link_libraries(gfx ${MYLIBC})
target_link_libraries(MyBinary ${MYLIBC} gfx curl ssl)

更新2

通过将以下行添加到库中,我设法摆脱了GLIB依赖项消息:

asm(".symver clock_gettime,clock_gettime@");

链接问题已经结束,现在它以以下内容终止:

[TERMINATION] errorNum = 11 POSIX信号11:SIGSEGV

当我静态链接所有内容时,这看起来就像是同一件事。 我将对此进行进一步调查。 如果有人有任何想法,我想听听他们:)

找到了解决问题的办法。 原来,我需要添加以下编译器标志:-lrt。 这将链接包括clock_gettime函数的实时扩展库。 因此,我不需要asm hack,这也不是解决此问题的方法。

至于SIGSEGV ,您需要自己初始化uGFX的板。 对于我的framebuffer,可以在board_framebuffer.h中找到。 功能static void board_init(GDisplay *g, fbInfo *fbi)需要进行编辑。 在这里,我映射了帧缓冲区( /dev/fb0 )并将其分配给fbi->pixels 后者默认设置为0,这会导致SIGSEGV。 必须将board_framebuffer.h文件从${ugfx_src}/drivers/gdisp/framebuffer/board_framebuffer_template.h复制到项目的include dir,然后重命名。 另外,在这种情况下,您可以使用${ugfx_src}/boards/base/Linux-Framebuffer/board-framebuffer.h的帧缓冲板文件board_framebuffer.h

您构建的库需要动态库libc ,但是您的主机os没有一个。 请告诉我们您正在运行哪个操作系统? 它是否包含动态库libc

  1. 如果它包含libc库,请确保正确的链接库目录
  2. 如果没有libc ,在构建uGFX时是否可以使用静态库代替,或者只是将libc.so从工具链目录(应该存在)复制到主机os lib path ,然后重试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM