通过链接描述文件链接两个目标文件

时间:2017-01-16 20:44:33

标签: c gcc assembly linker linker-scripts

我有两个源文件(一个用NASM程序集编写 - try.asm,另一个用纯C编写 - tryasmc.c)。我在.c文件中有一个C函数func(),我必须链接到汇编文件中的extern func

try.asm文件:

section .text
extern func

global main
main:
    push ebp
    mov ebp, esp

    call func

    pop ebp
    ret

tryasmc.c文件:

void func()
{
    // doesn't really do anything
}

链接描述文件(mylink.ld):

ENTRY(main)
OUTPUT_FORMAT(binary)

SECTIONS
{
    .text :
    {
        tryasm.o (.text)
        tryasmc.o (.text)
    }
}

我想单独编译它们并链接它们(通过链接描述文件)以生成flat binary文件。我做了以下事情:

  1. nasm -f elf32 -o tryasm.o try.asm(编译汇编代码)
  2. gcc -c -g -m32 -o tryasmc.o tryasmc.c(编译C代码)
  3. gcc -m32 tryasm.o tryasmc.o -o tryasm -T mylink.ld
  4. 我收到以下错误:

    /usr/lib32/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
    (.text+0x18): undefined reference to `__init_array_end'
    /usr/lib32/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
    (.text+0x23): undefined reference to `__init_array_start'
    /usr/lib32/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
    (.text+0x47): undefined reference to `__init_array_start'
    /usr/bin/ld: tryasm: hidden symbol `__init_array_end' isn't defined
    /usr/bin/ld: final link failed: Bad value
    collect2: error: ld returned 1 exit status
    

    正如我之前所说,我希望生成平面二进制文件tryasm,其中包含main作为入口点,func作为子例程。 我该如何解决?为什么我会收到这些错误?

    注意:我正在使用64 bit Linux (ubuntu-16)计算机,但使用elf formatgcc将代码编译为32位nasm

    目的:我在汇编中编写了一个小操作系统,所以我需要flat binary加载到RAM中。

0 个答案:

没有答案