关键字
ALIGN
在链接脚本中,ALIGN关键字:ALIGN(X)中的X表示多少个字节对齐。
在汇编文件中,是伪操作 .align x 实现的:表示2的x次幂个字节对齐;
2.X的取值也是有讲究的,必须是2的整数次幂。例如:填写1,2,4,8,16,32,64,....
3.在链接脚本当中,ALIGN主要是在程序链接时用来实现数据边界对齐功能:
什么是边界对齐,怎样对齐呢? 首先解释什么是边界对齐:
当有一块数据需要存放时,需要一个起始地址(存储空间的上边界),然后放数据,
放完后会有一个结束地址(存储空间的下边界);
然后是该怎样对齐?一般情况,上边界都是给定的,但是下边如何确定呢?
先看ALIGN(X)是多少字节对齐,再看上边界,然后就可以确定下边界。
下边界的确定有以下三种情况: (1).如果字节对齐数是ALIGN(X);并且上边界地址小于等于X, 则下边界为:基地址+X (2).如果字节对齐数是ALIGN(X);并且上边界地址大于X,则下边界为:
基地址+X*n ;n为多少呢?n=(上边界地址尾数%X的除数)+1
什么是基地址?其实是指链接脚本中最开始指定的地址的尾数变为零, 例如:0x33e0_0008 -> 基地址就是:0x33e0_0000 0x33e0_00F5 -> 基地址就是:0x33e0_00F0
PS:
ALIGN(X)中的X最好是大于等于4,因为32位的处理器最小就是4字节对齐;
如果X赋值为1,2,则也是使用的默认4字节对齐。
SECTIONS
SECTIONS{ *(.gnu.warning) *(.gnu.linkonce.t*) *(.ARM.extab* .gnu.linkonce.armextab.*) *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
.gun.warning
使用 GNU 工具链的您给自己的链接器警告
因此,当您尝试使用符号时,如果链接器看到名称与上述模式匹配的部分,则会发出相应的警告消息。
您可以将自己的链接器警告添加到源文件中:
linkwarn.c
void foo(void) { } static const char foo_warning[] __attribute__((section(".gnu.warning.foo"))) = "foo is deprecated, please use the shiny new foobar function";
linkwarnmain.c
void foo(void); int main() { foo(); return 0; }
然后,当你编译时,你会得到一个警告:
$ gcc -Wall -c linkwarn.c $ gcc -Wall -o linkwarnmain linkwarnmain.c linkwarn.o /tmp/ccyHLTw6.o: In function `main': linkwarnmain.c:(.text+0x1d): warning: foo is deprecated, please use the shiny new foobar function
.gnu.linkonce.t*
.gnu.linkonce 被 gcc 用于模糊链接。请参阅中的文档 为什么存在模糊链接的 gcc 手册。当 GNU 链接器看到两个 输入具有相同名称的部分,并且名称以 “.gnu.linkonce.”,链接器将只保留一份副本并丢弃 其他。.gcc_except_table 也是输入节名,gcc 使用 用于在发生异常时展开堆栈的信息。