CMake: связывание сборки с libc в Linux

В настоящее время я пытаюсь изучить программирование на ассемблере и использую CMake для создания своих проектов и упражнений.

В книге, за которой я следую, мне предлагается связать одну из программ-примеров со стандартной библиотекой C с помощью этой командной строки (Программирование с нуля, глава 8):

ld printf-example.o -o printf-example -lc -dynamic-linker /lib/ld-linux.so.2

Но я не уверен, как воспроизвести это поведение из CMake.

На данный момент мой файл CMake выглядит так:

project(ch8)

enable_language(ASM-ATT)

include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/include)

add_executable(printf-example printf-example.s)
target_link_libraries(printf-example c)

Если я пропущу строку target_link_libraries, make завершится ошибкой "неопределенная ссылка" на функции libc, указанные в printf-example.s.

Если я включаю строку, make выполняется, но когда я пытаюсь запустить программу, я получаю ошибку

bash: ./printf-example: No such file or directory

file дает мне этот вывод:

printf-example: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), \
dynamically linked (uses shared libs), not stripped

uname -m дает мне i686, поэтому я не думаю, что связываюсь с libc для другой архитектуры.

Кто-нибудь знает, как связать программы сборки со стандартной библиотекой C в CMake?


person immutablestate    schedule 08.09.2014    source источник
comment
1. ldd покажет, какая библиотека не может быть найдена. Это может помочь в вашей диагностике. 2. Использование libc из программ на ассемблере требует использования или имитации работы модулей, используемых для запуска libc (crti.o, crtbegin.o) и очистки (crtn.o, crtend.o), что может быть слишком громоздко. Вместо этого вы можете использовать ассемблер внутри C main().   -  person Netch    schedule 08.09.2014


Ответы (1)


На данный момент я могу заставить его работать с этим оператором, но любые его улучшения будут хорошо приняты.

set_target_properties(
    printf-example
    PROPERTIES
    LINK_FLAGS "-lc -dynamic-linker /lib/ld-linux.so.2"
)
person immutablestate    schedule 08.09.2014