Я пытаюсь построить 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
Это похоже на то же самое, когда я связывал все статически. Я буду исследовать дальше по этому вопросу. Если у кого-то есть идеи, я бы хотел их услышать 🙂
Библиотека, которую вы строите, нуждается в динамической библиотеке libc
, но у вашего хоста ОС его нет. пожалуйста, сообщите нам, какой ОС вы работаете? Включает ли динамическая библиотека libc
,
libc
библиотека, убедитесь, что ссылка на каталог библиотеки правильнаяlibc
, возможно ли использовать статическую библиотеку вместо при сборке uGFX
или просто скопируйте libc.so
из вашего каталога toolchain (он должен существовать) на ваш хост os lib path
и попробуйте еще раз.Нашел решение проблемы. Оказалось, что мне нужно добавить следующий флаг компилятора: -lrt. Это связывает библиотеку расширений в реальном времени, которая включает в себя clock_gettime
функция. Так что мне не нужно asm
хак, который был не решение этой проблемы.
Для SIGSEGV
, вам нужно инициализировать плату uGFX самостоятельно. Который можно найти, в моем случае для framebuffer, в board_framebuffer.h. Функция static void board_init(GDisplay *g, fbInfo *fbi)
должен быть отредактирован. Здесь я mmap’d буфер кадра (/dev/fb0
) и назначил его fbi->pixels
, Последний по умолчанию установлен в 0, что вызвало SIGSEGV.
Файл board_framebuffer.h должен быть скопирован из ${ugfx_src}/drivers/gdisp/framebuffer/board_framebuffer_template.h
к вашему проекту относятся dir и переименованный.
Также вы можете использовать файл фреймбуфера board_framebuffer.h
который находится в ${ugfx_src}/boards/base/Linux-Framebuffer/board-framebuffer.h
в данном конкретном случае.