В настоящее время я пытаюсь изучить программирование на ассемблере и использую 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?
ldd
покажет, какая библиотека не может быть найдена. Это может помочь в вашей диагностике. 2. Использование libc из программ на ассемблере требует использования или имитации работы модулей, используемых для запуска libc (crti.o
,crtbegin.o
) и очистки (crtn.o
,crtend.o
), что может быть слишком громоздко. Вместо этого вы можете использовать ассемблер внутри Cmain()
. - person Netch   schedule 08.09.2014