gcc - LD:链接描述文件中的 ALIGN 与 SUBALIGN
问题描述
它们有何不同?
我读到 SUBALIGN() 以某种方式强制进行某种对齐。还有其他区别吗?
什么时候应该使用 ALIGN(),什么时候应该使用 SUBALIGN()?
解决方案
SUBALIGN
专门用于调整输出节中输入节的对齐方式。为了显示:
$ cat one.c
char a_one __attribute__((section(".mysection"))) = 0;
char b_one __attribute__((section(".mysection"))) = 0;
$ cat two.c
char a_two __attribute__((section(".mysection"))) = 0;
char b_two __attribute__((section(".mysection"))) = 0;
$ gcc -c one.c two.c
情况1
$ cat foo_1.lds
SECTIONS
{
. = 0x10004;
.mysection ALIGN(8) : {
*(.mysection)
}
}
$ ld -T foo_1.lds one.o two.o -o foo1.out
$ readelf -s foo1.out
Symbol table '.symtab' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000010008 0 SECTION LOCAL DEFAULT 1
2: 0000000000000000 0 SECTION LOCAL DEFAULT 2
3: 0000000000000000 0 FILE LOCAL DEFAULT ABS one.c
4: 0000000000000000 0 FILE LOCAL DEFAULT ABS two.c
5: 000000000001000b 1 OBJECT GLOBAL DEFAULT 1 b_two
6: 0000000000010008 1 OBJECT GLOBAL DEFAULT 1 a_one
7: 0000000000010009 1 OBJECT GLOBAL DEFAULT 1 b_one
8: 000000000001000a 1 OBJECT GLOBAL DEFAULT 1 a_two
$ readelf -t foo1.out | grep -A3 mysection
[ 1] .mysection
PROGBITS PROGBITS 0000000000010008 0000000000010008 0
0000000000000004 0000000000000000 0 1
[0000000000000003]: WRITE, ALLOC
这里,ALIGN(8)
与.mysection
0x10004 之后的下一个 8 字节边界 0x10008 对齐。
来自输入部分的char
符号
位于下一个字节 by的开头,也来自输入部分。在下一个字节,是,来自输入部分,然后,也来自。来自所有输入部分的所有 4 个对象只是从输出部分的开头端对端放置。a_one
one.o(.mysection)
.mysection
b_two
one.o(.mysection)
a_two
two.o(.mysection)
b_two
two.o(.mysection)
*(.mysection)
.mysection
案例2
$ cat foo_2.lds
SECTIONS
{
. = 0x10004;
.mysection ALIGN(8) : SUBALIGN(16) {
*(.mysection)
}
}
$ ld -T foo_2.lds one.o two.o -o foo2.out
$ readelf -s foo2.out
Symbol table '.symtab' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000010008 0 SECTION LOCAL DEFAULT 1
2: 0000000000000000 0 SECTION LOCAL DEFAULT 2
3: 0000000000000000 0 FILE LOCAL DEFAULT ABS one.c
4: 0000000000000000 0 FILE LOCAL DEFAULT ABS two.c
5: 0000000000010021 1 OBJECT GLOBAL DEFAULT 1 b_two
6: 0000000000010010 1 OBJECT GLOBAL DEFAULT 1 a_one
7: 0000000000010011 1 OBJECT GLOBAL DEFAULT 1 b_one
8: 0000000000010020 1 OBJECT GLOBAL DEFAULT 1 a_two
$ readelf -t foo2.out | grep -A3 mysection
[ 1] .mysection
PROGBITS PROGBITS 0000000000010008 0000000000010008 0
000000000000001a 0000000000000000 0 16
[0000000000000003]: WRITE, ALLOC
这一次, 的 8 字节对齐地址.mysection
不变。但效果是,来自输入部分的SUBALIGN(16)
符号被放置在下一个 16 字节边界0x10010 的开始之后,来自
同一输入部分的符号位于下一个字节。但是来自输入部分
的符号位于下一个16 字节边界 0x10020;并且,也来自,之后是 1 个字节。a_one
one.o(.mysection)
.mysection
b_one
a_two
two.o(.mysection)
b_two
two.o(.mysection)
推荐阅读
- c# - 阻止 NuGet 包
- node.js - 使用 Firebase 工具时的问题
- docker - 在 docker php:7.0-apache-stretch 中安装 php7.0-sybase
- angular - 使用 datatable.net 角度 6 更改检测
- php - 我希望应用于子页面正文的 css 样式不能影响父页面正文?
- python - 在读取特定行时不将输出打印到python中的文本文件
- javascript - 如何将此自定义对象添加到 firebase
- sql - 更新多个值 SQL,检查更新语句中的值
- android - 谷歌分析/活动测量
- angularjs - 离子网络性能分析 - 重复调用