Makefile学习(1) arm-linux-ld arm-linux-objcopy arm-linux-objdump

记录自己所学的点点滴滴O(∩_∩)O哈哈~

makefile:  

link.bin: start.o main.o
arm-linux-ld -Tlink.lds -o link.elf $^
arm-linux-objcopy -O binary link.elf link.bin
arm-linux-objdump -D link.elf > link_elf.dis
gcc mkv210_image.c -o mkmini210
./mkmini210 link.bin 210.bin

%.o : %.S
arm-linux-gcc -o [email protected] $< -c

%.o : %.c
arm-linux-gcc -o [email protected] $< -c

clean:
rm *.o *.elf *.bin *.dis mkmini210 -f

解释:

ld:

GNU的链接器.

用来把一定量的目标文件跟档案文件链接在一起,并重新定位它们的数据,链接符号引用.

一般编译一个程序时,最后一步就是运行ld进行链接

每一个链接都被一个链接脚本所控制,这个脚本是用链接命令语言书写的.

二、链接脚本

链接脚本的一个主要目的是描述输入文件中的各个段(数据段,代码段,堆,栈,bss)如何被映射到输出文件中,并控制输出文件的内存排布.

链接器总是使用链接脚本的,如果你不提供,则链接器会使用一个缺省的脚本,这个脚本是被编译进链接器可执行文件的.

可以使用--verbose命令行显示缺省的链接器脚本的内容.

你可以使用-T命令行来提供你自己的链接脚本来替换缺省的链接脚本.

三、简单的链接脚本示例.

许多脚本是相当简单的.

可能最简单的脚本只含有一个命令:’SECTIONS’.

你可以使用’SECTIONS’来描述输出文件的内存布局.

‘SECTIONS’是一个功能很强大的命令.

假设你的程序只有代码段,初始化过的数据段,和未初始化过的数据段.这些会存在于’.text’,’data’,’bss’段中.

对于这个例子,假设代码应该被载入到地址0x1000处,而数据应该从0x8000000开始,如下是实现这个功能的脚本:

SECTIONS

{

.=0x1000;

.text:{*(.text)}

.=0x8000000;

.data:{*(.data)}

.bss:{*(.bss)}

}

具体分析:

关键字’SECTIONS’开始于这个配置.后面跟有一串放在花括号中的符号赋值和输出端描述的内容.

第一行是对一个特殊的符号’.’赋值,这是一个定位标识器.如果你没有以其他的方式制定输出段的地址,那地址值就会被设为定位标识器的现有值,即0x1000.

第二行定义一个输出段,’.text’.冒号’:’是语法需要,现在可以被忽略.段后面的花括号中,应该列出所有应该放入这个输出段中的输入端的名字.’*’是通配符,匹配所有文件名.即将所有输入文件中的.text段都保存在此段中.

余下的是.data和.bss段,同理,链接器会把所有.data段从地址0x8000000开始处放置.

最后,定位标识器的值变为0x8000000加上所有.data段的地址.此时链接器把所有.bss放在此处开始的地址.

四、简单的链接脚本命令

设置入口点

在运行一个程序时,第一个被执行到的指令成为”入口点”.你可以使用”ENTRY”链接脚本命令来设置入口点.参数是一个符号名,如下:

ENTRY(SYMBOL)

有很多不同的方法来设置入口点.链接器会通过按顺序尝试一下方法来设置入口点,如果成功了,就会停止.

1,’-e’ 入口命令行选项

2,链接脚本中的ENTRY(SYMBOL)命令

3,如果定义了start,就使用start的值

4,如果存在就使用’.text’段的首地址

5,地址’0’

五、命令行设置链接地址

ld用于将多个obj或者so(库)文件链接成可执行文件.

使用-T选项可以指定数据段,代码段,bss段起始位置.(-T只用于链接bootloader、内核等没有底层软件支持的软件.链接运行于操作系统之上的应用程序时,一般使用默认方式链接).

1,直接指定代码段、数据段、bss段起始地址

如下:

-Ttext startaddr

-Tdata startaddr

-Tbss startaddr

例如:

ld –Ttext 0x00000000 –g led_on.o –o led_on_elf

2,直接使用链接脚本来设置起始地址

ld –Ttimer.lds –o timer_elf a.o b.o

链接脚本timer.lds内容如下:

SECTIONS{

.=0x30000000;

.text : {*(.text)}

.rodata ALIGN(4) : {*(.rodata)}

.data ALIGN(4) : {*(.data)}

.bss ALIGN(4) : {*(.bss) *(COMMON)}

}

一个SECTIONS命令内部包含一个或多个段,段(section)是连接脚本的基本单元,它表示输入文件中的某部分怎么放置.

完整的链接脚本

arm-linux-ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。

arm-linux-gcc -wall -O2 -c -o [email protected] $<
-o 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
-Wall 指定产生全部的警告信息
-O2 编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高
-c 表示只要求编译器进行编译,而不要进行链接,生成以源文件的文件名命名但把其后缀由 .c 或 .cc 变成 .o 的目标文件
-S 只激活预处理和编译,就是指把文件编译成为汇编代码
arm-linux-ld 直接指定代码段,数据段,BSS段的起始地址
-Tbss ADDRESS Set address of .bss section

-Tdata ADDRESS Set address of .data section

-Ttext ADDRESS Set address of .text section
示例:
${CROSS}ld -Ttext=0x33000000 led.o -o led.elf
使用连接脚本设置地址:
arm-linux-ld -Tbeep.lds start.o beep.o -o beep.elf
其中beep.lds 为连接脚本如下:
arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换
示例:
arm-linux-objcopy –o binary –S elf_file bin_file
常用的选项:
input-file , outflie
输入和输出文件,如果没有outfile,则输出文件名为输入文件名
2.-l bfdname或—input-target=bfdname
用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-objcopy自己分析
3.-O bfdname 输出的格式
4.-F bfdname 同时指明源文件,目的文件的格式
5.-R sectionname 从输出文件中删除掉所有名为sectionname的段
6.-S 不从源文件中复制重定位信息和符号信息到目标文件中
7.-g 不从源文件中复制调试符号到目标文件中

arm-linux-objdump
查看目标文件(.o文件)和库文件(.a文件)信息
arm-linux-objdump -D -m arm beep.elf > beep.dis
-D 显示文件中所有汇编信息
-m machine

时间: 2024-08-27 17:09:47

Makefile学习(1) arm-linux-ld arm-linux-objcopy arm-linux-objdump的相关文章

【转帖】Linux系统上面qemu 模拟arm

零基础在Linux系统搭建Qemu模拟arm https://blog.csdn.net/weixin_42489042/article/details/81145038 自己没搞定 改天再试试 感谢原作者. 由于最近的一个项目,需要用到qemu模拟arm系统跑程序,所以做了一次搭建,在网上找到了两篇文章,写得都很详细,其中一篇文章是对另外一篇文章进行的修改和添加,但是基于自己系统去做,还是发现了最新修改的文章过程中的一些错漏,加之想记录下此次自己的搭建,所以写下这篇博客. 参考博客文章(1):

【Linux学习】Makefile学习(二)

FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 40975    Accepted Submission(s): 13563 Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats g

(笔记) (ARM) QQ2440 开发板改为 GT2440 (Linux) (开发板)

QQ2440改 GT24401跟换Nand Flash   将QQ2440的Nand Flash k9f1208u0b (64M)焊接取下来,换上k9f2g08u0a 或k9f2g08u0b (256M)2.去掉QQ2440板上右边靠中间的电阻 NR5,不去掉无法从Nand Flash 启动 这里去掉电阻配置 Nand Flash Memory Configuration Table 对应的管脚 NCON0,      GPG13,    GPG14,    GPG15            

嵌入式Linux ARM汇编(六)——GNU ARM汇编编程

嵌入式Linux ARM汇编(六)--GNU ARM汇编编程 不同的汇编器对汇编语言的语法要求不一样.目前常用的ARM汇编环境有以下两种: A.ARM ASM:ARM公司的汇编器,适合在Windows平台下使用 B.GNU ARM ASM:GNU交叉编译工具链中的汇编器,适合于Linux开发平台. GNU汇编器是GNU工具集的一部分,用于将汇编语言文件转化为二进制obj文件.GNU汇编器针对的是多种处理器架构,这意味着GNU汇编器的语法不同于ARM工具链的汇编器. 一.GUN ARM汇编指令格式

如何在linux主机上运行/调试 arm/mips架构的binary

如何在linux主机上运行/调试 arm/mips架构的binary 原文链接[email protected]0.0.0.55 本文中用于展示的binary分别来自Jarvis OJ上pwn的add,typo两道题 写这篇教程的主要目的是因为最近想搞其他系统架构的pwn,因此第一步就是搭建环境了,网上搜索了一波,发现很多教程都是需要树莓派,芯片等硬件,然后自己编译gdb,后来实践的过程中发现可以很简单地使用qemu实现运行和调试异架构binary,因此在这里分享一下我的方法. 主机信息: 以一

Linux mkisofs 创建光盘镜像文件(Linux指令学习笔记)

mkisofs命令 创建光盘文件的系统的命令是mkisofs.光盘系统有多种格式,利用Linux系统提供的光盘文件系统创建 命令mkisofs,可以创建多种iso9660文件系统. 我们一般不用mkisofs直接刻录光盘,而常用它创建一个光盘映像文件. mkisofs用法如下: mkisofs  [options] [-o filename] pathspec[pathspec...] -o filename :光盘映像文件名. pathspec:    要刻录的文件名,目录或者树目录. opt

为学习Hadoop使用VMware准备3台一模一样的Linux虚拟机的详细搭建过程

? 简介:VMware可以在个人本地一台笔记本机器上同时运行二个或更多Windows.DOS.LINUX系统.与"多启动"系统相比,VMWare采用了完全不同的概念.多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器.VMWare是真正"同时"运行,多个操作系统在主系统的平台上,就象标准Windows应用程序那样切换.而且每个操作系统你都可以进行虚拟的分区.配置而不影响真实硬盘的数据,你甚至可以通过网卡将几台虚拟机用网卡连接为一个局域网,极其方便.安

linux上安装nodejs(想在linux上学习nodejs的可以来看看)

说明: 使用CentOS系统,进行nodejs安装,nodejs版本-v0.8.7. 1,先下载nodejs: # wget http://nodejs.org/dist/v0.8.7/node-v0.8.7.tar.gz 2,解压文件 # tar xvf node-v0.8.7.tar.gz 3,进入解压目录 # cd node-v0.8.7 4,检查所需要配置 # ./configure 出现错误提示: Exception: Call to '(echo | $(echo ${CXX_hos

《Linux学习并不难》用户管理(1):Linux用户账户分类

9.1  <Linux学习并不难>用户管理(1):Linux用户账户分类 用户账户在Linux系统中是分角色的,由于角色不同,每个用户的权限和所能执行的工作任务也不同.在实际的管理中,用户的角色是通过UID(用户ID号)来标识的,每个用户的UID都是不同的. 在Linux系统中有三大类用户,分别是root用户.系统用户和普通用户. 1.root用户 在Linux系统中,root用户UID为0,root用户的权限是最高的,普通用户无法执行的操作,root用户都能完成,所以也被称为超级用户.在Li

大数据学习之_01_Linux学习_02_组管理和权限管理+定时任务调度+linux磁盘分区、挂载+linux的网络配置+进程管理(重点)+软件包管理+大厂面试题+感悟分享+资料附录

10 组管理和权限管理10.1 Linux组的基本介绍10.2 文件/目录的所有者10.3 文件/目录的所在组10.4 权限的基本介绍10.5 rwx权限详解10.6 修改权限指令-chmod10.7 修改文件所有者-chown10.8 修改文件所在组-chgrp10.9 最佳实践-警察和土匪游戏11 定时任务调度11.1 crond任务调度12 linux磁盘分区.挂载12.1 分区的基本知识12.2 Linux分区12.3 挂载的经典案例12.4 查询系统整体磁盘使用情况12.5 查询指定目