【问题标题】:understanding of addresses in dynamically loaded library了解动态加载库中的地址
【发布时间】:2015-05-04 16:50:13
【问题描述】:

我在foo.so中定义了一个foo2函数,当我动态加载到主程序中时,我尝试了解基地址和函数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不是常量?

$ ./a.out
base: 0x238c660, foo:0x2af0350ad860, diff: 0x2af032d21200
$ ./a.out
base: 0x1de4660, foo:0x2ac564cd7860, diff: 0x2ac562ef3200

更新:

关闭 ASLR 后,diff 是静态的,但也是base 地址。 .so 对象总是加载到主程序地址空间中的固定位置/部分是否正常?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我必须再问一个问题(在 OP 中也更新了):关闭 ASLR 后,差异是静态的,基地址也是如此。 .so 对象总是加载到主程序地址空间中的固定位置/部分是否正常?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 2023-03-26
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多