0

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

有没有办法让动态链接器尊重比页面更大的对齐请求?也许使用大页面?

4

0 回答 0