main.c int enable; ; int main() { int temp; add(); ; } int add() { ; } o反汇编的地址都是0起始,elf的地址都是映射后的地址. 多了一个.rela.text,大小为12字节 偏移为4,什么意思? info的次高8位为重定位目标所在节符号表的索引为9,即为add,其数值为0x0000 0020,即第4列Sym.Value的数值. 低8位表示type,即R_SPARC_WDISP30(在ABI sparc supplement中…
main.c ; int main() { ; } int add() { ; } main.o 反汇编可以看到多了.text节的反汇编,存储的是全局变量的初始化数值 main.o对比,text段后面多了00 00 00 01,这是data段,文件偏移为0x5c 节头表的data节,偏移为5c,大小为4 symbol table多了test,节头表索引为2,即data节,数值为0(猜测该数值为地址,一会通过elf文件求证) main.elf data节大小变为4,bss仍然没有 程序头的项目2的…
gcc编译选项可以设置生成调试信息, debug信息格式有stabs,coff,xcoff,dwarf. 常用的有两种格式,stab和dwarf,stab较早,dwarf较新.两种格式介绍:https://www.ibm.com/developerworks/cn/opensource/os-debugging/ 单独-g可以生成只有gdb能识别的额外辅助信息,如果不想生成这些辅助信息,可以使用-gstabs等选项,只生成stabs调试信息,不生成额外辅助信息. 调试选项-g和优化选项-O一起使…
main.c int main() { ; } int add() { ; } main.o的比较 与之二相比,section header offset由0x90变为0xA4,增加0x14,即add函数的大小 需要注意的是,后面section header所有节的偏移都相应偏移0x14 readelf输出,text变为x28 symbol table增加add,数值为0x0000 0014,即增加了偏移:到elf文件时会再加上入口地址偏移. main.elf的比较 section header…
main.c int enable; ; int main() { int temp; ; } int add() { ; } elf反汇编结果如下,可以看出main函数中的栈多开了8字节,虽然局部变量只是int,占4字节 这是因为堆栈是要求8字节对齐的,为了能够使用更高效的LDD,STD指令,v8 manual,p191. The stack pointer %sp must always be doubleword-aligned. This allows window overflow a…
main.c int enable; ; int main() { ; } int add() { ; } bss段在elf中虽然size是4,但并不占filesize,节头表如下图所示 程序头中,项目2的文件大小为4(4字节data,0字节bss),内存大小为8(4字节data,4字节bss) section到segment的映射,有两个segment,推测为RO,RW?第一个包含的section有text,第二个包含的section有data和bss. 符号表中,bss在data后面,且占4…
main.c int enable; ; struct aaa { int membera; char memberb; }s_aaa; int main() { int temp; add(); del(); s_aaa.membera = ; s_aaa.memberb = ; ; } int add() { ; } int del() { ; } nm a *ABS* T main T add 7000005c T del D test B enable B s_aaa asm main.…
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~4095地址,在前4k地址里来初始化SDRAM,nandflash,初始化完成后,才能将nandflash的4096至后面的地址内容存放到SDRAM里去. 而裸板驱动的步骤如下所示: 1.写makefile 2.写lds链接脚本 (供makefile调用) 3.写真正要执行的文件代码,比如初始化nand…
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~4095地址,在前4k地址里来初始化SDRAM,nandflash,初始化完成后,才能将nandflash的4096至后面的地址内容存放到SDRAM里去. 而裸板驱动的步骤如下所示: 1.写makefile 2.写lds链接脚本 (供makefile调用) 3.写真正要执行的文件代码,比如初始化nand…
4.1 C语言中的段 编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. 代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的.代码段由程序中的各个函数产生,函数的每一个语句将最终经过编译和汇编生成二进制机器代码(具体生成哪种体系结构的机器代码由编译器决定). 有些特殊数据会被放到代码段 C 语言中使用 char *p = "linux" ;定义字符串时,字符串"linux"实际被分配…