【发布时间】:2020-04-13 09:23:11
【问题描述】:
我尝试混合文件。 例如,如果我有 file1.o 和 file2.o,它们都没有 main 函数,那么 le1_file2.o 就是这些文件的结果。 所以我用了两件事:
链接器和makefile的使用:
linker.ld:
OUTPUT_FORMAT(elf32-i386)
SECTIONS
{
.text : {*(.text)}
.data : {*(.data)}
.rodata : {*(.rodata)}
.bss :
{
*(COMMON)
*(.bss)
}
end = .; _end = .; __end = .;
}
生成文件:
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
仅使用生成文件:
生成文件:
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
【问题讨论】:
-
没有问题。
-
而 gcc 抱怨你没有 main ?如果是这种情况,您可能需要阅读有关静态库或动态库的信息。这很简单,您不需要 main。
-
您的 Makefile 和链接器脚本有问题。首先,您需要确定在内存中加载它的位置。我认为这不是 Multiboot 并且您已经创建了自己的自定义引导加载程序来加载此内核?
-
我假设你是 Makefiles 新手?
-
有什么问题或疑问?