假设它是这样的: 在上面的例子中缺少“static int i”的情况下,.bss节的默认对齐大小为int,假设64b arch为8。bss_size=8。 当你添加“static int i”时,你得到了相同的bss_size=8,在这个例子中是这个static int。 如果添加“static int i[2]",则会显示bss_size=16 使用“static int i[3]":bss_size=24等等。 例如在x86_64 linux上:
$ cat a0.c
//static int i;
int main () { return 0; }
$ cat a1.c
static int i;
int main () { return 0; }
$ cat a3.c
static int i[3];
int main () { return 0; }
$ gcc -o a0 a0.c; gcc -o a1 a1.c; gcc -o a3 a3.c
$ size a0 a1 a3
text data bss dec hex filename
1228 544 8 1780 6f4 a0
1228 544 8 1780 6f4 a1
1228 544 24 1796 704 a3
如果我没有弄错话,默认的填充在ld的注解中:
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections.
FIXME: Why do we need it? When there is no .bss section, we do not
pad the .data section. */
. = ALIGN(. != 0 ? 64 / 8 : 1);
}
1条答案
按热度按时间nqwrtyyt1#
假设它是这样的:
在上面的例子中缺少“static int i”的情况下,.bss节的默认对齐大小为int,假设64b arch为8。bss_size=8。
当你添加“static int i”时,你得到了相同的bss_size=8,在这个例子中是这个static int。
如果添加“static int i[2]",则会显示bss_size=16
使用“static int i[3]":bss_size=24等等。
例如在x86_64 linux上:
如果我没有弄错话,默认的填充在ld的注解中: