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的更多相关文章

  1. ELF文件之二——使用链接脚本

    main.c int main() { ; } 编译:sparc-elf-gcc.exe -c main.c -o main.o 链接:sparc-elf-ld.exe main.o -nostart ...

  2. ELF文件之四——使用链接脚本-2个函数-data

    main.c ; int main() { ; } int add() { ; } main.o 反汇编可以看到多了.text节的反汇编,存储的是全局变量的初始化数值 main.o对比,text段后面 ...

  3. ELF文件之八——使用链接脚本-2个函数-data-bss-temp-call-debug信息

    gcc编译选项可以设置生成调试信息, debug信息格式有stabs,coff,xcoff,dwarf. 常用的有两种格式,stab和dwarf,stab较早,dwarf较新.两种格式介绍:https ...

  4. ELF文件之七——使用链接脚本-2个函数-data-bss-temp-call

    main.c int enable; ; int main() { int temp; add(); ; } int add() { ; } o反汇编的地址都是0起始,elf的地址都是映射后的地址. ...

  5. ELF文件之三——使用链接脚本-2个函数

    main.c int main() { ; } int add() { ; } main.o的比较 与之二相比,section header offset由0x90变为0xA4,增加0x14,即add ...

  6. ELF文件之五——使用链接脚本-2个函数-data-bss

    main.c int enable; ; int main() { ; } int add() { ; } bss段在elf中虽然size是4,但并不占filesize,节头表如下图所示 程序头中,项 ...

  7. ELF文件之六——使用链接脚本-2个函数-data-bss-temp

    main.c int enable; ; int main() { int temp; ; } int add() { ; } elf反汇编结果如下,可以看出main函数中的栈多开了8字节,虽然局部变 ...

  8. 四、u-boot 链接脚本

    4.1 C语言中的段 编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. 代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆 ...

  9. Linux之ELF文件初探

    对比windowsPE文件与概述 在windows中可执行文件是pe文件格式,Linux中可执行文件是ELF文件,其文件格式是ELF文件格式,在Linux下的ELF文件除了可执行文件(Excutabl ...

随机推荐

  1. idea 2019.3 最新版破解教程

    背景 最近,idea又被整治了,所以一大批激活码都失效了.我之前已经有2018版的永久激活了,所以非常淡定~,也没打算升级版本.但是,最近发现周围的人都在讨论这个问题.于是,我也找到了2019.3最新 ...

  2. 玩转Django2.0---Django笔记建站基础三(编写URL规则)

    第三章 编写URL规则 URL(Uniform Resource Locator,统一资源定位符)是对可以从互联网上得到的资源位置和访问方法简洁的表示,是互联网上标准资源的地址. 在App里由于Dja ...

  3. Processing 3!

    Welcome to Processing 3! Dan explains the new features and changes; the links Dan mentions are on th ...

  4. Frameworks.Entity.Core 1

    CommonEnums 1系统模块BlockType 2证件类型IDType 3在线支付类型OnLineType 4操作权限,支持位移运算OperatorAuthority 5订单状态: 1000-待 ...

  5. P1075,P1138(洛谷)

    今天难得做了做洛谷的题,而且还是两个! P1075:已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数.输入格式:一个正整数n.输出格式:一个正整数p,即较大的那个质数. 第一版代码: # ...

  6. git recommend(alive)

    初始化并跟踪远程分支: echo "# test" >> README.mdgit initgit add README.mdgit commit -m "f ...

  7. 团队项目-Beta冲刺(第一周)

    团队项目-Beta冲刺(第一周) 一. 作业描述 这个作业属于哪个课程 这个作业要求在哪里 团队名称 CTRL-IKun 这个作业的目标 合理安排时间完成接下来的任务,剩余任务预估,分配任务(开发,测 ...

  8. go编写简单接口的过程

    环境 系统 Windows server 2016 Datacener go version go1.13.3 windows/amd64 数据库 Microsoft SQL Server 2014( ...

  9. [JLOI2014]松鼠的新家(树链剖分)

    [JLOI2014]松鼠的新家(luogu) Description 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间 ...

  10. java web 项目中基础技术

    1. 选择版本控制器(git, svn) 2. 用户登录的时候, 你需要进行认证, 权限受理 可以使用 spring shiro 框架,进行上面的工作 3. 过滤器(filter),监听器(liste ...