GNU汇编程序支持将节对齐到边界。在此示例程序中可以看到此功能的使用:
// test.S .section foo,"aw" .p2align 20 .global foo_start foo_start: .ascii "A" // main.c #include extern char foo_start; int main(void) { printf("%c\n", foo_start); // force libtest.so to be loaded printf("%p\n", &foo_start); }
当此程序静态链接时,我们会看到该部分已正确对齐:
ezyang@javelin:~/Dev/labs/reloc$ gcc test.S main.c -g && ./a.out A 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: warning: type and size of dynamic symbol `foo_start' are not defined A 0x7f012f9e7000
有没有办法让动态链接器尊重对齐请求大于页面?也许使用大页面?