gpt4 book ai didi

c - 使用 ld 链接已编译的程序集和 C 文件

转载 作者:行者123 更新时间:2023-11-30 18:09:54 24 4
gpt4 key购买 nike

我已经编译了这些程序:

  BITS 16
extern _main
start:
mov ax, 07C0h
add ax, 288
mov ss, ax
mov sp, 4096

mov ax, 07C0h
mov ds, ax

mov si, text_string
call print_string

jmp $

text_string db 'Calling Main Script'
call _main

print_string:
mov ah, 0Eh

.repeat:
lodsb
cmp al, 0
je .done
int 10h
jmp .repeat

.done:
ret

times 510-($-$$) db 0
dw 0xAA55

这是一个测试,只是为了尝试链接它们

int main()
{
return 0;
}

两者都可以使用以下命令自行编译:gcc -Wall -m32 main.cnasm -f elf bootloader.asm但是我无法使用以下方式链接它们:ld bootloader.o main.o -lc -I/lib/Id-linux.so.2我收到此错误:

ld: i386 architecture of input file `bootloader.o' is incompatible with i386:x86-64 output
ld: i386 architecture of input file `main.o' is incompatible with i386:x86-64 output
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000
ld: bootloader.o: file class ELFCLASS32 incompatible with ELFCLASS64
ld: final link failed: file in wrong format

任何帮助都会非常感谢

最佳答案

默认情况下,GCC 已与 libc 动态链接,所以如果您想使用 ld 手动链接,请务必使您的 ELF 可执行 static ,您可以通过 -static 传递标志。

gcc -o <filename> <filename>.c -static -Wall -m32然后链接到ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o <filename> -lc <filename>.o

我想,由于像 NASM 这样的汇编器是静态的(独立的,没有 libc ),你可以直接使用 libc 使 ELF 动态可执行。 ,您可以通过 -dynamic-linker 传递标志。

例如:

x86

nasm -f elf32 -o <filename>.o <filename>.asm
ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o <filename> -lc <filename>.o

x86_64

nasm -f elf64 -o <filename>.o <filename>.asm
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o <filename> -lc <filename>.o

关于c - 使用 ld 链接已编译的程序集和 C 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60095718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com