linux ld 链接器学习笔记

ld链接器笔记

1. 首先编写一段汇编代码

这里的汇编语法时 AT&T语法,是gcc原生支持的语法,底层使用 gas(gnu assembler) 完成汇编,相较于 Intel x86语法, AT&T 语法要更加古老,因此大多数人更加偏向于使用 Intel 的语法. nasm 编译器支持x86语法.自从2.10版本,Intel语法可以通过使用.intel_syntax指令增加支持

asm 复制代码
.global _start
    .text
_start:
    mov $1,%eax # 将立即数1放到eax寄存器中
    mov $2,%ebx # 将立即数2放到 ebx 寄存器中
    add %ebx,%eax # 将 ebx 与 eax相加,结果放到 eax 中
loop:
    jmp loop # 循环

2. 使用 gcc 命令进行编译

Makefile 文件内容:

makefile 复制代码
main.o: main.s
    gcc -m32 -c $< -o $@
# -m32 编译为32位代码
# -c 执行编译和汇编,但不执行链接
# -o 指定输出文件名称
# -E 执行预处理,但不执行编译,汇编和链接
# -S 只执行编译,但不执行汇编和链接
#  -shared 创建一个共享库,格式.so

3. 使用 ld 执行链接

makefile 复制代码
main: main.o
    ld -m elf_i386 main.o
# -m elf_i386 指定链接格式,这里指定为 elf 格式(linux中二进制格式)
# -o 指定输出文件名称
# ld 可以指定配置文件 map.lds,按照规格进行配置可以

4. 使用 gdb 执行输出

sh 复制代码
gdb main
# 开启图形界面
tui enable
# 打开汇编窗口
lay asm
# 打开寄存器窗口
lay reg
# 开始执行程序
starti
# 步进执行程序
si
# 之后可以通过回车执行上一步执行的命令

汇编代码-栈学习

栈的使用主要是 push 和pop 指令,其中 push 指令会将指定数据写入内存

asm 复制代码
push %ebp # 将 ebp 寄存器中的值压入栈中
push $0xa # 将 0xa 值压入栈中

还有 pop 指令,从栈顶弹出一个值到指定寄存器中

asm 复制代码
pop 
asm 复制代码
.global _start
    .text
_start:
    push %ebp
    mov %esp,%ebp

    push $0xa
    push $0xb
    pop %eax
    push $4
    pop %eax
    pop %ebx
loop:
    jmp loop

参考资料

xv6操作系统实践

相关推荐
项目申报小狂人6 分钟前
中科院1区SCI-哲学命题优化算法Philosophical proposition optimizer-附Matlab免费代码
linux·算法·matlab
济6177 分钟前
linux 系统移植(第二十期)---- BusyBox构建根文件系统---- Ubuntu20.04
linux·嵌入式硬件
石像鬼₧魂石11 分钟前
网络安全渗透测试学习路线的核心技能阶段应该学习哪些知识
学习·安全·web安全
觉醒大王19 分钟前
简单说说参考文献引用
java·前端·数据库·学习·自然语言处理·学习方法·迁移学习
开开心心就好19 分钟前
免费抽奖工具支持批量导入+自定义主题
linux·运维·服务器·macos·pdf·phpstorm·1024程序员节
名誉寒冰24 分钟前
Linux 网络内核:tcp_transmit_skb 与 udp_sendmsg 解析
linux·网络·tcp/ip
John Song25 分钟前
miniconda是否初始化?
linux·运维·服务器·python
求真求知的糖葫芦29 分钟前
微波工程4.3节散射矩阵(S参数矩阵)参考平面移动与广义散射参数学习笔记(下)(自用)
学习·平面·矩阵·射频工程
草草_33 分钟前
【内核驱动基础】内核模块的两种编译方式(in-tree vs out-of-tree)
linux·驱动开发·内核
淮北49437 分钟前
大模型学习(二、使用lora进行微调)
java·服务器·学习