【问题标题】:Mix multiple objects files with gcc which have no main function使用没有主要功能的 gcc 混合多个对象文件
【发布时间】: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 新手?
  • 有什么问题或疑问?

标签: c linux gcc osdev unix-ar


【解决方案1】:

我已经通过使用找到了解决方案

ar cr 将所有对象 (.o) 文件归档到一个静态库 (.a) 文件中。 https://helpmanual.io/help/gcc-ar/

使用静态库意味着在链接阶段只需要拉入一个目标文件。这与在链接期间让编译器拉入多个目标文件(每个函数一个等)形成对比。 这意味着程序不必在项目或对象文件的不同部分中查找每个实体,而只需引用一个已将实体排序在一起的单个归档对象 (.a) 文件。由于有一个有序的目标文件,链接这个库的程序可以加载得更快。

支持的目标:elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 插件 srec symbolsrec verilog tekhex 二进制 ihex 向http://www.sourceware.org/bugzilla/报告错误

所以:

ar cr first_second.a first.o second.o

谢谢大家

【讨论】:

  • 如果您要创建多个需要静态库的程序,我可以理解这样做,但如果这是为了操作系统开发,为什么不将目标文件单独添加到创建内核的最终链接阶段?只是好奇你这样做有什么收获。
  • 是的,当然,我想使用静态库创建多个程序。使用静态库意味着在链接阶段只需要拉入一个对象文件,我只需要引用一个已将实体排序在一起的单个归档对象 (.a) 文件。
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2018-04-30
相关资源
最近更新 更多