Я играю с голым металлом x86 и наткнулся на препятствие, портирующее мою сборку с простых make-файлов на cmake.
В моем make-файле мои объекты определены так:
LINK_LIST=\
$(LDFLAGS) \
$(ARCHDIR)/crti.o \
$(ARCHDIR)/crtbegin.o \
$(KERNEL_OBJS) \
$(LIBS) \
$(ARCHDIR)/crtend.o \
$(ARCHDIR)/crtn.o \
crtbegin.o и crtend.o 'генерируются', то есть предоставлены моим кросс-компилятором (флаг -print-file-name).$ (LIBS) - это флаги -l, например -lgcc и т. Д. Так как это передается непосредственно компоновщику, порядок соответствует указанному.
Моя цель cmake определяется следующим образом:
ADD_EXECUTABLE(loader
"${INIT_SRC}"
"${INIT_OBJ}"
"${PLATFORM_SRCS}"
"${ISA_SRCS}"
"${GENERIC_SRCS}"
"${FINI_OBJ}"
"${FINI_SRC}")
INIT_OBJ и FINI_OBJ имеют EXTERNAL_OBJECT и GENERATED, установленный в true в свойствах исходного файла.Глядя на командную строку при запуске сгенерированного make-файла, я вижу, что все исходные файлы находятся в указанном порядке, но объекты init и fini являются последними в списке.
Вот результирующая командная строка (отредактировано для краткости):
i686-elf-gcc -nostdlib -ffreestanding -nostdinc -T linker.ld -lgcc crti.s.obj boot.s.obj loader.c.obj crtn.s.obj crtbegin.o crtend.o -o loader
Флаг -lgcc явно указан в моих LINK_FLAGS, и это тоже то, что я хотел бы изменить.
Поэтому у меня есть несколько вопросов по этому поводу.:
Почему cmake не использует порядок для двух внешних объектных файлов, а использует его для скомпилированных?
Какя могу сказать cmake обрабатывать эти объекты так же, как те, которые приходят из моих источников?
Как я могу получить полный клон установки, которую я имею в моем Makefile (с флагами библиотекимежду моими объектными файлами)
Я также проверил CMAKE_C_LINK_EXECUTABLE, но, похоже, для достижения этого не хватает гранулярности / контроля над параметрами компоновщика.
я использую cmake 3.10.2 в Ubuntu.
И еще один (не по теме) вопрос о cmake:
.S не рассматривается как стандартное расширение файла сборки.Я попытался добавить его с помощью LIST(APPEND CMAKE_ASM-ATT_SOURCE_FILE_EXTENSIONS S)
, и он добавляет его просто отлично, однако файлы по-прежнему не компилируются, пока я не изменю его на .s.У кого-нибудь еще была такая проблема?
Спасибо!