当前位置: 首页 > news >正文

linux ld 链接器学习笔记

ld链接器笔记

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

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

.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 文件内容:

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

3. 使用 ld 执行链接

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

4. 使用 gdb 执行输出

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

汇编代码-栈学习

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

push %ebp # 将 ebp 寄存器中的值压入栈中
push $0xa # 将 0xa 值压入栈中

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

pop 
.global _start.text
_start:push %ebpmov %esp,%ebppush $0xapush $0xbpop %eaxpush $4pop %eaxpop %ebx
loop:jmp loop

在这里插入图片描述

参考资料

xv6操作系统实践

http://www.lryc.cn/news/249561.html

相关文章:

  • 栈模拟先序后序中序遍历(非递归遍历)
  • linux 内核软中断介绍
  • 软考:2024年软考高级:软件工程
  • Kubernetes(K8s)_15_CNI
  • python 生成器的作用
  • 第十五届蓝桥杯(Web 应用开发)模拟赛 2 期-大学组(详细分析解答)
  • 图解系列--HTTPS,认证
  • element plus中表格的合计属性和例子
  • 计网Lesson1笔记
  • 指针数组以及利用函数指针来实现简易计算器及typedef关键字(指针终篇)
  • josef JZ-7Y-33静态中间继电器 电压DC220V 板前接线
  • Java第二十章 ——多线程
  • 【超强笔记软件】Obsidian实现免费无限流量无套路云同步
  • 【Linux小项目】实现自己的bash
  • 客户案例:EDLP助力金融行业打造高效数据防泄露体系
  • 【JavaFX漏扫开发基础】stage窗口/模式/模态
  • MySQL进阶知识:锁
  • linux下的工具---gdb
  • ESP32-Web-Server编程-JS 基础 2
  • Java Web基础教程
  • BUUCTF john-in-the-middle 1
  • HashMap的死循环及数据覆盖问题
  • 数据库数据恢复—MongoDB数据库文件拷贝出现错误的数据恢复案例
  • 2023年11月个人工作生活总结
  • Spark-06:Spark 共享变量
  • Spring整合web环境
  • 分享从零开始学习网络设备配置--任务4.3 使用动态路由RIPng实现网络连通
  • vue2.0+elementui集成file-loader之后图标失效问题
  • C# 文件帮助类(FileHelper)
  • WordPress 外链跳转插件