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 ...
随机推荐
- Could not find iPhone 6 simulator
最近原来的老项目有点问题需要处理一下,运行启动命令,就报了如下错误,提示找不到iPhone 6 模拟器. react-native run-ios Owaiss-Mac:pdm owaisahmed$ ...
- 关于neo4j初入门(5)
neo4j和Java Neo4j提供JAVA API以编程方式执行所有数据库操作. 它支持两种类型的API: Neo4j的原生的Java API Neo4j Cypher Java API Neo4j ...
- 力扣337——打家劫舍 III
这一篇也是基于"打家劫舍"的扩展,需要针对特殊情况特殊考虑,当然其本质还是动态规划,优化时需要考虑数据结构. 原题 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃 ...
- 最强PostMan使用教程
最近需要测试产品中的REST API,无意中发现了PostMan这个chrome插件,把玩了一下,发现postman秉承了一贯以来google工具强大,易用的特质.独乐乐不如众乐乐,特此共享出来给大伙 ...
- 16、python面对对象之类和继承
前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名 ...
- html恶搞之无限弹窗
啦啦啦啦啦 恶搞别人吗? 把下面代码做成html文件发给别人,用浏览器打开就可以看见效果了 <!DOCTYPE html> <html><head><meta ...
- 面试必备!Java核心技术100+面试题
一线互联网公司工作了几年,我作为求职者参加了不少面试,也作为面试官面试了很多同学,整理这份面试指南,一方面是帮助大家更好的准备面试,有的放矢,另一方面也是对自己知识框架做一个体系化的梳理. 这篇文章梳 ...
- Shoot the Bullet(有源汇带上下界最大流)
有源汇带上下界最大流 在原图基础上连一条汇点到源点流量为inf的边,将有源汇网络流转化为无源汇网络流用相同方法判断是否满流,如果满流再跑一边源点到汇点的最大流就是答案 例题:Shoot the Bul ...
- 前端性能优化之利用 Chrome Dev Tools 进行页面性能分析
背景 我们经常使用 Chrome Dev Tools 来开发调试,但是很少知道怎么利用它来分析页面性能,这篇文章,我将详细说明怎样利用 Chrome Dev Tools 进行页面性能分析及性能报告数据 ...
- python 不可变字典 inmutabledict的实现
python inmutabledict的实现 关于在python中如何实现不可变字典的方法.早在pep416中,就建议python官方实现inmutabledict,但是官方否认了.理由主要是 根据 ...