理解动态加载库中的地址

时间:2015-05-04 16:50:14

标签: c dll shared-libraries dynamic-linking memory-layout

我在gdImageStringFT: No character set found while printing string mu with font Symbol 中定义了foo2函数,当我动态加载到主程序中时,我尝试理解基地址和函数foo.so的地址。代码如下:

foo

我希望void (* foo2)(void) = (void (*)(void))dlsym(loaded_so_handle, "foo2"); Dl_info info; dladdr(&foo2, &info); void * baseaddr = info.dli_fbase; printf("base:%p, foo:%p, diff: %p\n", baseaddr, foo2, (long)foo2 - (long)baseaddr); 打印输出也应该是常量(给定一个固定的共享对象diff)。但打印出来的情况如下;地址.so不是常数?

diff

更新

关闭ASLR后,差异是静态的,但也是$ ./a.out base: 0x238c660, foo:0x2af0350ad860, diff: 0x2af032d21200 $ ./a.out base: 0x1de4660, foo:0x2ac564cd7860, diff: 0x2ac562ef3200 地址。是否正常.so对象总是被加载到主程序的地址空间中的固定位置/部分?

1 个答案:

答案 0 :(得分:3)

动态加载库中包含的函数和变量的地址是随机的,以避免安全漏洞。