使用gcc混合多个没有主要功能的对象文件

问题描述 投票:2回答:1

我尝试混合文件。例如,如果我有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
c linux gcc osdev ar
1个回答
1
投票

我已经使用]找到了解决方案>

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

谢谢大家

© www.soinside.com 2019 - 2024. All rights reserved.