c - 重新排列对齐对象的顺序以最小化空间使用

标签 c gcc x86 ld memory-alignment

我有一个需要 4-KiB 对齐的数据结构。我可以使用 __attribute__ ((aligned (4096))) 强制执行此操作。

问题是这种对齐要求导致内存被浪费。这是链接器放置符号的方式(pg_dir 是对齐的数据结构):

00011000 <cursor_loc>:
00012000 <pg_dir>:
00013000 <idt>:

cursor_loc 的大小只有四个字节。这样会更好:

00011000 <pg_dir>:
00012000 <cursor_loc>:
00012008 <idt>:

(idt 必须是 8 字节对齐。)


您可以像这样使用多个文件来重现它:

test1.c:

char aligned[4096] __attribute__ ((aligned (4096)));
int i;

test2.c:

int j;

int main(void) { }

然后构建它

gcc test1.c test2.c

objdump -D a.out 打印如下:

0000000000602004 <j>:
        ...

0000000000603000 <aligned>:
        ...

0000000000604000 <i>:

我如何移动 GNU ld 以重新排列符号以最小化空间浪费?我真的很奇怪为什么它没有自动完成。

最佳答案

有一些习语要求对象按照命令行指定对象的顺序排列(这就是为什么你的结果有点奇怪,可能是由于常用符号),并且对象内定义不是重新排序。要解决这个问题,您需要这样的东西:

gcc -fno-common -fdata-sections -Wl,--sort-section=alignment test1.c test2.c

-fno-common 禁用公共(public)符号,-fdata-sections 允许链接器对同一文件中的符号重新排序,-Wl,--sort -section=alignment 最终启用对齐排序。

关于c - 重新排列对齐对象的顺序以最小化空间使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45128717/

相关文章:

C 结构体声明

c - C 中的简单拍卖系统 - 提示?

c - GNU GCC 数学函数的精度要求?

assembly - 在汇编中获取字符串长度的短格式

assembly - cltq 在汇编中做什么?

c - 为什么 (-1)%(unsigned int) 不同于 (-1)%(int) +(它用 uint 计算什么并且转换为 int 是一个很好的解决方案)

c++ - 退回 VLA 安全吗?

python - 在 mac 上 easy_install lxml 不工作

c++ - 使用花括号初始化列表调用显式构造函数 : ambiguous or not?

GCC 生成的 asm::我在哪里分配给该寄存器?