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 反汇编可以看到多了.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的…
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的比较 与之二相比,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"实际被分配…
0 运行环境 本机系统:Windows 10 虚拟机软件:Oracle VM VirtualBox 6 虚拟机系统:Ubuntu 18 1 引言 - 编译过程 我们知道在 CPU 上执行的是低级别的机器语言,从高级语言到低级别的机器语言是要经过 4 个编译过程,以 Linux 下 GCC 编译 C 语言程序的过程为例, 如下图所示: 预处理:编译器将 C 源代码中的包含的头文件如stdio.h编译进来,替换宏. gcc -E hello.c -o hello.i 编译:GCC 首先要检查代码的规…
0X01  ELF初认识 elf文件是linux下的二进制文件,相当于windows下的PE文件,Android系统里的dll. 解析elf文件两个用处:1.so加固:2.frida(xposed)检测: 0X02 so文件格式 SO文件格式,即ELF文件格式.它是Linux下可执行文件,共享库文件和目标文件的统一格式. 根据看待ELF文件的不同方式,ELF文件可以分为链接视图和装载视图. so文件大体上可分为四部分,一般来说从上往下是ELF头部->Pargarm头部->节区(Section)…
main.c int main() { ; } 编译:sparc-elf-gcc.exe -c main.c -o main.o 链接:sparc-elf-ld.exe main.o -nostartfiles -script=linkerscript.ld -o main.elf linkerscript.ld SECTIONS { . = 0x08000000; .text : { *(.text) } . = 0x70000000; .data : { *(.data) } .bss :…
在嵌入式开发过程中常常遇到将axf或elf文件转换成bin的情况,大家都知道通过gnu toolchain中的objcopy和keil中的fromelf能做到.可是为了这么一个小事而记住复杂的选项以及打开IDE实在说只是去,以下是两个脚本工具,用来转换. 每一个工具都有相应下载链接哦 1.elf2bin elf2bin工具下载后解压,将须要转换的elf文件改名为test.elf放在目录下.然后执行里面的elf2bin.bat就可以.能够看到一个名为test.bin的文件已经生成. 2.axf2b…
参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第6章 可执行文件的装载与进程 第7章 动态链接 <Linux GOT与PLT> 开发平台: [root@tanghuimin dynamic_link]# uname -a Linux tanghuimin -.el6.x86_64 # SMP Fri Feb :: UTC x86_64 x86_64 x86_64 GNU/Linux 实例讲解之前先来一段理论铺垫,文字很繁琐但很必要事先了解.…
参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第4章 静态链接 开发平台: [thm@tanghuimin static_link]$ uname -a Linux tanghuimin -.el6.x86_64 # SMP Fri Feb :: UTC x86_64 x86_64 x86_64 GNU/Linux 1.ELF文件格式概貌…
关于ELF文件的详细介绍,推荐阅读: ELF文件格式分析 —— 滕启明.ELF文件由ELF头部.程序头部表.节区头部表以及节区4部分组成. 通过objdump工具和readelf工具,可以观察ELF文件详细信息. ELF文件加载过程分析 从编译.链接和运行的角度,应用程序和库程序的链接有两种方式.一种是静态链接,库程序的二进制代码链接进应用程序的映像中:一种是动态链接,库函数的代码不放入应用程序映像,而是在启动时,将库程序的映像加载到应用程序进程空间. 在动态链接中,GNU将动态链接ELF文件的…
GOT应该保存的是puts函数的绝对虚地址,这里为什么保存的却是puts@plt的第二条指令呢? 原来“解释器”将动态库载入内存后,并没有直接将函数地址更新到GOT表中,而是在函数第一次被调用时,才会进行函数地址的重定位,这样做的好处是可以加快程序加载速度,尤其对大型程序来说.有关这方面的更详细的信息,可以搜索“动态链接库的延迟绑定技术”. 继续看第二条指令,pushq $0x0代表什么? 查看Hello world程序的重定位节: ezreal@ez:~/workdir$ readelf -a…
转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml     一. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情. 连接器有个默认的内置连接脚本, 可用ld –verbose查看. 连接选项-r和-…
转载:http://soft.chinabyte.com/os/104/12255104.shtml   今天在看uboot引导Linux部分,发现要对链接脚本深入了解,才能知道各个目标文件的内存分布映像,下面是我看到的一些资料 0. Contents 1. 概论 2. 基本概念 3. 脚本格式 4. 简单例子 5. 简单脚本命令 6. 对符号的赋值 7. SECTIONS命令 8. MEMORY命令 9. PHDRS命令 10. VERSION命令 11. 脚本内的表达式 12. 暗含的连接脚…
转载:http://hubingforever.blog.163.com/blog/static/171040579201192472552886/   一. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情. 连接器有个默认的内置连接脚本, 可用ld –verbose查看. 连接选项-r和-…
1.前言 本章继续讲述简单脚本命令的后半部分 2.Assigning Values to Symbols 你可以给一个符号(symbol)赋值,它会把这些定义的符号放入全局符号表(symbols table)中 2.1 Assigning Values to Symbols 可以使用下面的C操作为一个符号指定值: symbol = expression ;symbol += expression ;symbol -= expression ;symbol *= expression ;symbo…
1.前言 这个部分我们描述了简单的链接脚本命令 2.设置entry point 程序中第一条运行的指令被称为入口点entry point,可以使用ENTRY链接脚本命令设置entry point,参数是一个符号名: ENTRY(symbol) 有几种方法可以设置entry point,链接器会按照如下的顺序来try各种方法,只要任何一种方法成功则会停止: the ‘-e’ entry command-line option; the ENTRY(symbol) command in a link…
[转]http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 1. 前言 (1)每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局.但你也可以用连接命令做一些其他事情. 连接器有个默认的内置连接脚本, 可用ld –verbose查看. 连接选项-r和-N可以…
转自:http://www.cnblogs.com/li-hao/p/4107964.html 转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml     一. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一…
1. 概论2. 基本概念3. 脚本格式4. 简单例子5. 简单脚本命令6. 对符号的赋值7. SECTIONS命令8. MEMORY命令9. PHDRS命令10. VERSION命令11. 脚本内的表达式12. 暗含的连接脚本 1. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情. 连接器有…
转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 一. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情. 连接器有个默认的内置连接脚本, 可用ld –verbose查看. 连接选项-r和-N可以影…
十一. 表达式 lds中表达式的文法与C语言的表达式文法一致,表达式的值都是整型,如果ld的运行主机和生成文件的目标机都是32位,则表达式是32位数据,否则是64位数据. 以下是一些常用的表达式: _fourk_1 = 4K; /* K.M单位 */ _fourk_2 = 4096; /* 整数 */ _fourk_3 = 0×1000; /* 16 进位 */ _fourk_4 = 01000; /* 8 进位 */ 注意:1K=1024 1M=1024*1024 11.1.符号名 没有被引号…
七. SECTIONS命令 SECTIONS命令告诉ld如何把输入文件的sections映射到输出文件的各个section: 如何将输入section合为输出section; 如何把输出section放入程序地址空间(VMA)和进程地址空间(LMA). 该命令格式如下: SECTIONS { SECTIONS-COMMAND SECTIONS-COMMAND - } SECTION-COMMAND有四种: (1) ENTRY命令 (2) 符号赋值语句 (3) 一个输出section的描述(out…
https://blog.csdn.net/itxiebo/article/details/50937412 https://blog.csdn.net/itxiebo/article/details/50938753 [随笔]GNU linker script,ld script,GNU链接脚本 一.什么是GNU linker script?作用是什么? .lds文件,即linker script,决定了可执行映像(image)的链接方式,以及各个段的装载地址(装载域)和执行地址(运行域).…