Assembly 动态加载库的对齐部分

Assembly 动态加载库的对齐部分,assembly,ld,Assembly,Ld,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

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); } //测试 .第foo节,“aw” .P220 .global foo_start foo_start: .ascii“A” //main.c #包括 外部字符foo_启动; 内部主(空){ printf(“%c\n”,foo_start);//强制加载libtest.so printf(“%p\n”,&foo\u start); } 当此程序静态链接时,我们可以看到该部分已正确对齐:

ezyang@javelin:~/Dev/labs/reloc$ gcc test.S main.c -g && ./a.out A 0x700000 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 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”的类型和大小不正确 定义 A. 0x7f012f9e7000
有没有办法让动态链接器尊重比页面更大的对齐请求?可能使用大页面?

这可能是由于禁用ASLR造成的吗?禁用ASLR似乎没有什么不同。但我同意;必须将库与大的块偏移对齐会使ASLR变得更难。