ARM кросс-компиляция с более старым glibc - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь построить библиотеку 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

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

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Нашел решение проблемы.Оказалось, что мне нужно добавить следующий флаг компилятора: -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 в каталог вашего проекта include и переименован.Кроме того, вы можете использовать файл платы кадрового буфера board_framebuffer.h, который находится в ${ugfx_src}/boards/base/Linux-Framebuffer/board-framebuffer.h, в данном конкретном случае.

0 голосов
/ 29 декабря 2018

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

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