我尝试混合文件。例如,如果我有file1.o和file2.o,它们都没有主要功能,则le1_file2.o是这些文件的结果。所以我用了两件事:
使用链接器和makefile:
linker.ld:
OUTPUT_FORMAT(elf32-i386)
SECTIONS
{
.text : {*(.text)}
.data : {*(.data)}
.rodata : {*(.rodata)}
.bss :
{
*(COMMON)
*(.bss)
}
end = .; _end = .; __end = .;
}
Makefile:
CC =gcc
OBJ = file1.o file2.o
all : file1_file2.o
file1_file2.o: $(OBJ)
ld -m elf_i386 --oformat=binary -Tlinker.ld $^ -o $@
%.o : %.c
@$(CC) -o $@ -c $< -m32 -g -ffreestanding -fno-PIC -fno-stack-protector -Werror
仅使用makefile:
Makefile:
CC =gcc
OBJ = file1.o file2.o
all : file1_file2.o
file1_file2.o: $(OBJ)
$(CC) $^ -o $@ -m32 -g -ffreestanding -fno-PIC -fno-stack-protector -Werror
%.o : %.c
@$(CC) -o $@ -c $< -m32 -g -ffreestanding -fno-PIC -fno-stack-protector -Werror
我已经使用]找到了解决方案>
ar cr将所有对象(.o)文件归档到一个静态库(.a)文件中。https://helpmanual.io/help/gcc-ar/
使用静态库意味着在链接阶段仅需要拉入一个目标文件。这与在链接期间使编译器提取多个目标文件(每个函数一个)有关。这意味着程序不必在项目或目标文件的不同部分上查找每个实体,而只需引用将实体排序在一起的单个单个归档对象(.a)文件。由于拥有一个有序的目标文件,链接此库的程序可以更快地加载。
支持的目标:elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1omelf64-little elf64-big elf32-little elf32-big pe-x86-64pe-bigobj-x86-64 pe-i386插件srec symbolsrec verilog tekhex二进制将错误报告给http://www.sourceware.org/bugzilla/
所以:
ar cr first_second.a first.o second.o
谢谢大家