关于linux链接脚本的一些问题

原创 2012年03月30日 23:21:40

1.关于链接脚本格式语法这里不做介绍,强调一点的是,如果源文件中使用某些符号,但是没有定义,链接器会使用链接脚本中的定义

2.链接脚本只是指定相应的段放在指定位置,但是如何指定源码文件的“段属性”呢?如果是汇编就很好办,有直接定义段的符号,那么C语言呢,道理是一样的,只要通过约定的语法告诉编译器就可以了,这个就是__attribute__((section("section_name")))

3.__attribute__((section("section_name")))指定输入段的名称和内容,链接脚本指定输出段的内容

 

下面的是转载内容:

要了解Linux Kernel代码的分段信息,需要了解一下gcc的__attribute__的编绎属性或定义的函数或数,__attribute__主要用于改变所声明据的特性,它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。但这里我们比较感兴趣的是对代码段起作用子项section。

__attribute__的section子项的使用格式为:

__attribute__((section("section_name")))

其作或用是将作用的函数数据放入指定名为"section_name"输入段。

这里还要注意一下两个概念:输入段和输出段

输入段和输出段是相对于要生成最终的elf或binary时的Link过程说的,Link过程的输入大都是由源代码编绎生成的目标文件.o,那么这些.o文件中包含的段相对link过程来说就是输入段,而Link的输出一般是可执行文件elf或库等,这些输出文件中也包含有段,这些输出文件中的段就叫做输出段。输入段和输出段本来没有什么必然的联系,是互相独立,只是在Link过程中,Link程序会根据一定的规则(这些规则其实来源于Link Script),将不同的输入段重新组合到不同的输出段中,即使是段的名字,输入段和输出段可以完全不同。

其用法举例如下:

int  var __attribute__((section(".xdata"))) = 0;

这样定义的变量var将被放入名为.xdata的输入段,(注意:__attribute__这种用法中的括号好像很严格,这里的几个括号好象一个也不能少。)

static int __attribute__((section(".xinit"))) functionA(void)

{

.....
}

这个例子将使函数functionA被放入名叫.xinit的输入段。

需要着重注意的是,__attribute__的section属性只指定对象的输入段,它并不能影响所指定对象最终会放在可执行文件的什么段。

2. Linux Kernel源代码中与段有关的重要宏定义

A. 关于__init、__initdata、__exit、__exitdata及类似的宏

打开Linux Kernel源代码树中的文件:include/init.h,可以看到有下面的宏定议:

#define __init  __attribute__ ((__section__ (".init.text")))  __cold

#define __initdata    __attribute__ (( __section__ (".init.data")))

#define __exitdata   __attribute__ (( __section__ (".exit.data")))

#define __exit_call  __attribute_used__ __attribute__ (( __section__ (".exitcall.exit")))

#define __init_refok  oninline __attribute__ ((__section__ (".text.init.refok")))

#define __initdata_refok __attribute__ ((__section__ (".data.init.refok")))

#define __exit_refok noinline __attribute__ ((__section__ (".exit.text.refok")))

.........

#ifdef MODULE

#define __exit  __attribute__ (( __section__ (".exit.text"))) __cold

#else

#define __exit __attribute_used__ __attribute__ ((__section__ (".exit.text"))) __cold

#endif

对于经常写驱动模块或翻阅Kernel源代码的人,看到熟悉的宏了吧:__init, __initdata, __exit, __exitdata。

__init 宏最常用的地方是驱动模块初始化函数的定义处,其目的是将驱动模块的初始化函数放入名叫.init.text的输入段。当内核启动完毕后,这个段中的内存会被释放掉供其他使用。

__initdata宏用于数据定义,目的是将数据放入名叫.init.data的输入段。其它几个宏也类似。

另外需要注意的是,在以上定意中,用__section__代替了section。还有其它一些类似的宏定义,这里不一一列出,其作用都是类似的。

linux内核链接脚本详解

1. 什么是链接脚本 链接器主要有两个作用,一是将若干输入文件(.o文件)根据一定规则合并为一个输出文件(例如ELF格式的可执行文件);一是将符号与地址绑定(当然加载器也要完成这一部分工作)。关于链接...
  • skyflying2012
  • skyflying2012
  • 2013年07月10日 23:46
  • 6836

链接脚本语法

连接脚本连接脚本的一个主要目的是描述输入文件中的节如何被映射到输出文件中,并控制输出文件的内存排布. 几乎所有的连接脚本只做这两件事情. 但是,在需要的时候,连接器脚本还可以指示连接器执行很多其他的操...
  • abcamus
  • abcamus
  • 2016年12月07日 19:26
  • 2333

Linux连接脚本的格式

连接脚本的格式 ==================== 连接脚本是文本文件. 你写了一系列的命令作为一个连接脚本. 每一个命令是一个带有参数的关键字,或者是一个对符号的赋值. 你可 以用分号...
  • Linux_Learner_Lxz
  • Linux_Learner_Lxz
  • 2011年11月29日 11:38
  • 668

arm-linux-ld命令 ld链接脚本(不错,推荐可以学习一些lds链接脚本文件)

我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来;其次,这些.o文件存在相互调用的关系;再者,我们最后生成的bin文件是...
  • flytothesun
  • flytothesun
  • 2013年11月23日 14:34
  • 2535

Linux kernel 分析之七:内核启动-链接脚本

一般来说,用户是不需要关心section的具体位置的。在用户态,内核会解析elf可执行文件的各个section,然后把它映射到虚拟地址空间。然而,在内核启动时,一切得从  零开始。很多在用户态下应用程...
  • vanquishedzxl
  • vanquishedzxl
  • 2015年07月21日 22:20
  • 1563

ARM链接脚本分析

ARM链接脚本
  • huangbo201102
  • huangbo201102
  • 2014年03月28日 18:23
  • 1434

Linux LMA AND VMA 浅析

对于ROM来说,CPU 也是可以直接从ROM里面读取代码,然后运行的。为何还要前面提到的,弄个LMA 和VMA不同,搬来搬去的呢?因为ROM,顾名思义,是只读的,只能读取,不能写入的。 而程序中的代...
  • lianliange85
  • lianliange85
  • 2014年11月16日 13:14
  • 616

Flask mega tutorial 1.0 documentation错误

python flask 表单插件 flask-meta-tutorial 1.0 教程,发现一处错误:   执行会出现:  No module named flask....
  • cc7756789w
  • cc7756789w
  • 2015年04月09日 11:39
  • 614

Linux内核链接文件分析(zz)

实际上讲到linux的启动部分不得不会讲到linux的链接脚本部分,链接脚本指定了linux怎么链接程序并将特定的代码放到专门的段区间,因此我在这里再讲下vmlinux的链接过程的一些注意问题,以下均...
  • slj_win
  • slj_win
  • 2011年11月29日 14:53
  • 2406

JPA面试常见问题

这篇文章是摘自Patrick Linskey的一篇文章,主要是关于JPA相关内容的问答,相信JPA面试会碰到很多这里面的问题问题:EJB专家团队是如何摆脱事务描述符的?回答:在会话bean和消息驱动b...
  • hahalzb
  • hahalzb
  • 2010年11月02日 23:55
  • 2391
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于linux链接脚本的一些问题
举报原因:
原因补充:

(最多只允许输入30个字)