Я пытаюсь построить библиотеку uGFX статически для моего основного двоичного файла.Я кросс-компиляция.Моя система сборки - Ubuntu Linux, а хост - среда ARM.Сборка завершается успешно, но при выполнении двоичного файла на моем хосте меня продолжает вызывать следующее сообщение:
имя_бинарного файла: /lib/libc.so.6: версия 'GLIBC_2.17' не найдена (требуетсяимя_бинарного файла)
Это происходит только при включении источников 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
...
Я попробовал опции компоновщика nodefaultlibs и nostdlib .Файл libc.so.6
доступен в системном корне.Я даже пытался использовать find_library(MYLIBC c-2.25 PATHS /usr/gnueabi/arm-brcm-linux-gnueabi/sysroot/lib)
в моем CMakeLists.txt и включить его в мой target_link_libraries
для бинарного файла, но мне тоже не повезло.
Как я могу убедиться, что libc цепочки инструментов связан с моим бинарным файлом?
Обновление 1
Чтобы ответить на вопросы в первую очередь.Да, я пытался статически связать libc с моим двоичным файлом.Но тогда как-то двоичный файл становится слишком большим.Ну, устройство вылетает с SIGSEGV
.Кроме того, я бы предпочел не статически связывать клиб, потому что в конечном итоге я хочу, чтобы uGFX
тоже был динамически связан.И статически связывать libc с разделяемым не стоит.Я также могу статически связать все вместе, но двоичный файл станет массовым и не очень пригодится для обновления отдельных библиотек в будущем.
На устройстве существует libc.so.6
.Мне удалось получить дамп файловой системы.Он живет в каталоге /lib
хоста.Кроме того, двоичные файлы, которые я загружаю без uGFX
, работают с GLIBC_2.4
и работают нормально с динамической связью.
Хост-система работает под управлением следующей ОС:
Linux (нет) 2.6.32.9 # 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
Это похоже на то же самое, когда я все статически связывал.Я буду исследовать дальше по этому вопросу.Если у кого-то есть идеи, я бы хотел их услышать:)