汇编和C同步使用(Linux下编译ELF)

本文介绍了如何在Linux环境下编译一个包含C和汇编语言的程序。通过使用nasm编译汇编文件,然后用gcc编译C文件,并最终使用ld进行链接。在遇到64位系统的兼容性问题时,找到了解决方案,成功完成了编译过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要编译一个内核,必须要想办法将C和汇编语言连接在一起。

这里是一个汇编语言的一份代码:

foo.asm

; 编译链接方法
; (ld 的‘-s’选项意为“strip all”)
;
; [root@XXX XXX]# nasm -f elf foo.asm -o foo.o
; [root@XXX XXX]# gcc -c bar.c -o bar.o
; [root@XXX XXX]# ld -s hello.o bar.o -o foobar
; [root@XXX XXX]# ./foobar
; the 2nd one
; [root@XXX XXX]# 


extern choose	; int choose(int a, int b);


[section .data]	; 数据在此

num1st		dd	3
num2nd		dd	4


[section .text]	; 代码在此

global _start	; 我们必须导出 _start 这个入口,以便让链接器识别。
global myprint	; 导出这个函数为了让 bar.c 使用

_start:
	push	num2nd		; ┓
	push	num1st		; ┃
	call	choose		; ┣ choose(num1st, num2nd);
	add	esp, 4		; ┛

	mov	ebx, 0
	mov	eax, 1		; sys_exit
	int	0x80		; 系统调用

; void myprint(char* msg, int len)
myprint:
	mov	edx, [esp + 8]	; len
	mov	ecx, [esp + 4]	; msg
	mov	ebx, 1
	mov	eax, 4		; sys_write
	int	0x80		; 系统调用
	ret
	

bar.c
void myprint(char* msg, int len);

int choose(int a, int b)
{
	if(a >= b){
		myprint("the 1st one\n", 13);
	}
	else{
		myprint("the 2nd one\n", 13);
	}

	return 0;
}
本来在Linux下输入命令:

nasm -f elf -o foo.o foo.asm

gcc -c -o bar.o bar.c

ld -s -o foobar foo.o bar.o

就可以连接完毕了,但是我的虚拟机是CentOS 64-bit 最后一步显示file not recongize

错误的原因很明显...gcc默认按64位搞了……估计GCC咋办呢...上网搜了一下 Bingo~




连接完毕~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值