ELF文件之九——使用链接脚本-2个函数-data-bss-temp-call-debug信息-struct
main.c
int enable;
int test = ; struct aaa
{
int membera;
char memberb;
}s_aaa; int main()
{
int temp; add();
del(); s_aaa.membera = ;
s_aaa.memberb = ; return ;
} int add()
{
return ;
} int del()
{
return ;
}
nm
a *ABS*
T main
T add
7000005c T del
D test
B enable
B s_aaa
asm
main.elf: file format elf32-sparc Disassembly of section .text: <main>:
: 9d e3 bf save %sp, -, %sp
: call <add>
: nop
7000000c: call 7000005c <del>
: nop
: 1c sethi %hi(0x70000000), %o0
: or %o0, 0x78, %o1 ! <s_aaa>
7000001c: mov , %o0
: d0 st %o0, [ %o1 ]
: 1c sethi %hi(0x70000000), %o0
: or %o0, 0x78, %o1 ! <s_aaa>
7000002c: mov , %o0
: d0 2a stb %o0, [ %o1 + ]
: clr %o0
: b0 mov %o0, %i0
7000003c: nop
: c7 e0 ret
: e8 restore <add>:
: 9d e3 bf save %sp, -, %sp
7000004c: b0 clr %i0
: nop
: c7 e0 ret
: e8 restore 7000005c <del>:
7000005c: 9d e3 bf save %sp, -, %sp
: b0 clr %i0
: nop
: c7 e0 ret
7000006c: e8 restore
Disassembly of section .data: <test>:
: unimp 0x1
s_aaa结构体地址在70000078,sethi和or两步操作将该地址赋值给o1
: 1c sethi %hi(0x70000000), %o0
: or %o0, 0x78, %o1 ! <s_aaa>
然后,将o0赋值为1,将o0赋值到第一个结构体成员的内存中
7000001c: mov , %o0
: d0 st %o0, [ %o1 ]
结构体第二个成员赋值与第一个类似,最后会有4字节偏移,偏移到第二个成员,同时是stb,即存储字节;而第一个是st,存储字,32bit。
: 1c sethi %hi(0x70000000), %o0
: or %o0, 0x78, %o1 ! <s_aaa>
7000002c: mov , %o0
: d0 2a stb %o0, [ %o1 + ]
从上面可以看出,高级语言C语言的结构体,int,char等类型在汇编上均没有体现,最后都是体现为ld,st这些赋值上,结构体的成员差别是通过结构体内存起始+内存偏移实现的。
ELF文件之九——使用链接脚本-2个函数-data-bss-temp-call-debug信息-struct的更多相关文章
- ELF文件之二——使用链接脚本
main.c int main() { ; } 编译:sparc-elf-gcc.exe -c main.c -o main.o 链接:sparc-elf-ld.exe main.o -nostart ...
- ELF文件之四——使用链接脚本-2个函数-data
main.c ; int main() { ; } int add() { ; } main.o 反汇编可以看到多了.text节的反汇编,存储的是全局变量的初始化数值 main.o对比,text段后面 ...
- ELF文件之八——使用链接脚本-2个函数-data-bss-temp-call-debug信息
gcc编译选项可以设置生成调试信息, debug信息格式有stabs,coff,xcoff,dwarf. 常用的有两种格式,stab和dwarf,stab较早,dwarf较新.两种格式介绍:https ...
- ELF文件之七——使用链接脚本-2个函数-data-bss-temp-call
main.c int enable; ; int main() { int temp; add(); ; } int add() { ; } o反汇编的地址都是0起始,elf的地址都是映射后的地址. ...
- ELF文件之三——使用链接脚本-2个函数
main.c int main() { ; } int add() { ; } main.o的比较 与之二相比,section header offset由0x90变为0xA4,增加0x14,即add ...
- ELF文件之五——使用链接脚本-2个函数-data-bss
main.c int enable; ; int main() { ; } int add() { ; } bss段在elf中虽然size是4,但并不占filesize,节头表如下图所示 程序头中,项 ...
- ELF文件之六——使用链接脚本-2个函数-data-bss-temp
main.c int enable; ; int main() { int temp; ; } int add() { ; } elf反汇编结果如下,可以看出main函数中的栈多开了8字节,虽然局部变 ...
- 四、u-boot 链接脚本
4.1 C语言中的段 编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. 代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆 ...
- Linux之ELF文件初探
对比windowsPE文件与概述 在windows中可执行文件是pe文件格式,Linux中可执行文件是ELF文件,其文件格式是ELF文件格式,在Linux下的ELF文件除了可执行文件(Excutabl ...
随机推荐
- ElasticSearch安装中文分词器IKAnalyzer
# ElasticSearch安装中文分词器IKAnalyzer 本篇主要讲解如何在ElasticSearch中安装中文分词器IKAnalyzer,拆分的每个词都是我们熟知的词语,从而建立词汇与文档 ...
- Governing sand 贪心
题目链接:https://ac.nowcoder.com/acm/contest/887/C 题目描述 The Wow village is often hit by wind and sand,th ...
- MySQL:如何查询出每个分组中的 top n 条记录?
问题描述 需求: 查询出每月 order_amount(订单金额) 排行前3的记录. 例如对于2019-02,查询结果中就应该是这3条: 解决方法 MySQL 5.7 和 MySQL 8.0 有不同的 ...
- 高通量计算框架HTCondor(一)——概述
目录 1. 正文 2. 目录 3. 参考 4. 相关 1. 正文 HTCondor是威斯康星大学麦迪逊分校构建的分布式计算软件和相关技术,用来处理高通量计算(High Throughput Compu ...
- 深入学习MySQL 01 一条查询语句的执行过程
在学习SpringCloud的同时,也在深入学习MySq中,听着<mysql45讲>,看着<高性能MySQL>,本系列文章是本人学习过程的总结,水平有限,仅供参考,若有不对之处 ...
- 【JQ】 validate验证表单时多个name相同的元素的解决办法
使用jQuery.validate插件http://jqueryvalidation.org/,当节点的name相同时候,脚本特意忽略剩余节点,导致所有相关节点的errMsg都显示在第一个相关节点上. ...
- 客户端TNSPING通 连接出现ORA-12514错误
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务,这是一个经常遇到的问题,可以按照以下步骤一步步解决 1.使用tnsping检测 tnsping可判断出以下两点(1)判断网络 ...
- dotnet restore 初次运行 这个 指令 会安装 特别多的 4.0.0 或者 4.1 的 rc2-24027的 东东 这些东西。
- LeetCode题目总结-滑窗法
LeetCode题目总结-滑动窗口法 滑动窗口法:此方法首先建立一个长度为零的窗口,把右侧窗口向右移动,当新的元素与原来窗口中的元素不重复时,把新的元素加入其中,并更新窗口长度:当新的元素与原集合中的 ...
- 在python开发工具PyCharm中搭建QtPy环境(详细)
在python开发工具PyCharm中搭建QtPy环境(详细) 在Python的开发工具PyCharm中安装QtPy5(版本5):打开“File”——“Settings”——“Project Inte ...