GNU 汇编器支持将节与边界对齐。在此示例程序中可以看到此功能的使用:
// 测试.S .section foo,"aw" .p2对齐 20 .global foo_start foo_start: .ascii "A" // main.c #包括 extern char foo_start; 诠释主要(无效){ printf("%c\n", foo_start); // 强制加载 libtest.so printf("%p\n", &foo_start); }
当这个程序被静态链接时,我们看到该部分正确对齐:
ezyang@javelin:~/Dev/labs/reloc$ gcc test.S main.c -g && ./a.out 一个 0x700000
但是,当库是动态加载时,这不起作用:
ezyang@javelin:~/Dev/labs/reloc$ gcc test.S -shared -o libtest.so -fPIC ezyang@javelin:~/Dev/labs/reloc$ gcc -Wl,-R`pwd` -L. main.c -ltest -g -O0 -fPIC && ./a.out /usr/bin/ld:警告:动态符号“foo_start”的类型和大小不是 定义 一个 0x7f012f9e7000
有没有办法让动态链接器尊重比页面更大的对齐请求?也许使用大页面?