Linux嵌入式基础——链接脚本


链接脚本

可执行程序基本包含的三大部分:

  • text段内容
  • data段内容
  • bss段内容

链接脚本的特点

  • 链接脚本文件以 .lds 后缀结尾,例如:shell.lds
  • 链接脚本文件用来指示可执行程序各个段包含的内容以及各个段的起始地址。
  • 链接脚本文件给链接器(arm…ld)使用,链接器根据链接脚本的规则进行连接。

链接脚本的语法

具体的链接脚本例子:

#指定最终的可执行程序的入口函数为main函数
ENTRY(main)
#指定最终的可执行程序的各个段的内容以及起始地址
SECTIONS 
{
	#指定所有段的起始地址为0x48000000
    . = 0x48000000;
	#指定最终可执行文件中text段的内容
    .text : 
    {
    	#将main.o中的text段添加进来
    	#切记,一定要指定链接和运行的第一个文件,此文件包含了程序的入口函数
        main.o(.text)
        #将剩余目标文件中所有的text段添加进来。
        *(.text)
    }
    #指定最终可执行文件中的data段的内容
    .data : 
    {
        *(.data)
    }
    #指定最终可执行文件中bss段的内容
    .bss : 
    {
        *(.bss)
    }
}

链接脚本的使用

在编译的时候通过指定 -Tshell.lds来高速链接器将来使用的链接规则,根据-T指定的链接脚本中的内容进行可执行文件的连接。

  • 注意:在编译成elf文件后,可以使用objdump来将二进制文件反编译来查看链接脚本是否生效
arm-cortex_a9-linux-gnueabi-objdump -D shell.elf > shell.dis
vim shell.dis //查看main函数对应的地址是否为0x48000000

切记:看链接脚本一定要获取以下三个内容

  • 通过链接脚本能够获取程序运行的起始地址
  • 通过链接脚本能够获取程序运行的第一个文件
  • 通过链接脚本能够获取程序运行的第一个入口函数
  • 将来遇到裸板代码能够通过链接脚本获取运行的第一个文件和入口函数,利用ctags或者sourceinsight来理顺代码。
  • 如果在编译时没有使用链接脚本,那么可以通过在编译选项中(Makefile)中的以下内容获取信息:
    • -Ttext=0x48000000 起始地址
    • obj=main.o uart.o … :参加编译的第一个文件main.o为程序运行的第一个文件
    • -emain :运行的入口函数为main
发布了78 篇原创文章 · 获赞 25 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_37596943/article/details/103882549