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 ...
随机推荐
- SparkStreaming-Kafka集成
SparkStreaming-Kafka集成 参考链接: Spark Streaming + Kafka Integration Guide 文章基本是官方的翻译, 最多再加入了一小部分自己的思考在内 ...
- mysql时间类型和格式转换
内容目录 简介mysql时间类型DATE_FORMAT()函数 简介 今天开发中,做一个功能需要对历史数据进行补充,相信大家也遇到过这样的情况,这个历史数据需要按月份和人的id进行区分,于是想到了my ...
- Java.数据结构.集合体系详解
I. 第一部分:常见数据结构 首先简单说下数据结构. 什么是数据结构?数据结构就是组织数据的方式. 常见的数据结构:栈,堆,树,图,数组,队列,链表. 这里主要介绍与java集合体系相关的栈.数组和链 ...
- java 类初识
一.定义 成员变量 成员方法 注意: 1.成员变量有默认值,是全局变量 2.成员方法,不需要使用static 3.成员变量的默认值 整型 0 浮点型 0.0 引用数据类型 null 二.使用 1.导包 ...
- 头条一面竟然问我Maven?
maven package和maven install 有什么区别? 你常用的maven命令有哪些? <dependencyManagement> 是干什么的? 还有用过其它构建工具吗? ...
- PairProgramming 个人第三次作业
Github地址:主仓库 https://github.com/Yanyixiao/PairProgramming.git Partner博客园地址: https://www.cnblogs.com/ ...
- 龙芯 fedora28 安装指南
版权声明:原创文章,未经博主允许不得转载 关于硬件 龙芯3号的板子安装系统都差不多,我分别在 Lemote A1310 和 Lemote A1901 上都尝试过. 本文主要依据 Lemote A190 ...
- springBoot的事件机制---GenericApplicationListener用法
springBoot的事件机制---GenericApplicationListener用法 什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环 ...
- js中函数this的指向
this 在面试中,js指向也常常被问到,在开发过程中也是一个需要注意的问题,严格模式下的this指向undefined,这里就不讨论. 普通函数 记住一句话哪个对象调用函数,该函数的this就指向该 ...
- python+selenium爬取百度文库不能下载的word文档
有些时候我们需要用到百度文库的某些文章时,却发现需要会员才能下载,很难受,其实我们可以通过爬虫的方式来获取到我们所需要的文本. 工具:python3.7+selenium+任意一款编辑器 前期准备:可 ...