ARM кросс-компиляция с более старым glibc

Я пытаюсь построить 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

Это похоже на то же самое, когда я связывал все статически. Я буду исследовать дальше по этому вопросу. Если у кого-то есть идеи, я бы хотел их услышать 🙂

0

Решение

Библиотека, которую вы строите, нуждается в динамической библиотеке libc, но у вашего хоста ОС его нет. пожалуйста, сообщите нам, какой ОС вы работаете? Включает ли динамическая библиотека libc,

  1. если он включает в себя libc библиотека, убедитесь, что ссылка на каталог библиотеки правильная
  2. если нет libc, возможно ли использовать статическую библиотеку вместо при сборке uGFX или просто скопируйте libc.so из вашего каталога toolchain (он должен существовать) на ваш хост os lib path и попробуйте еще раз.
0

Другие решения

Нашел решение проблемы. Оказалось, что мне нужно добавить следующий флаг компилятора: -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в данном конкретном случае.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector