У меня есть проект CMake
, который должен работать в очень старой системе ARM
. Поскольку система имеет другую версию libc
, то единственная возможность - связать инструментальную цепочку с libc
статически.
Проблема в том, что помимо libc
приложение должно быть связано с другим динамическим c библиотека. CMakeFiles.txt выглядит следующим образом:
target_link_libraries(${PROJECT_NAME} PUBLIC -static-libstdc++)
target_link_libraries(${PROJECT_NAME} PUBLIC -static-libgcc)
add_subdirectory(my_dynamic_library)
target_link_libraries(${PROJECT_NAME} PRIVATE my_dynamic_library)
Но похоже, что libc
подключается не динамически, а как общая библиотека:
readelf -d my_app
Dynamic section at offset 0x34668 contains 29 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [my_dynamic_library.so]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libc.so.6]
При работе в целевой системе Я получаю сообщение об ошибке:
./my_app: /lib/libc.so.6: version `GLIBC_2.17' not found (required by ./my_app)
Я понятия не имею, почему это происходит, но по какой-то причине g cc связал мои приложения с неправильными версиями библиотеки c:
objdump -T ./my_app| grep 2.17
000103a8 DF *UND* 00000000 GLIBC_2.17 clock_gettime
I Я прочитал много похожих сообщений и вижу, что мне нужно добавить
target_link_libraries(${PROJECT_NAME} PUBLIC -static)
Но это вызывает другую ошибку:
../arm-none-linux-gnueabi/bin/ld: attempted static link of dynamic object my_dynamic_library.so
Так что я понятия не имею, как скомпилировать все это вместе.