Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 理解动态加载库中的地址_C_Dll_Shared Libraries_Dynamic Linking_Memory Layout - Fatal编程技术网

C 理解动态加载库中的地址

C 理解动态加载库中的地址,c,dll,shared-libraries,dynamic-linking,memory-layout,C,Dll,Shared Libraries,Dynamic Linking,Memory Layout,我在foo中定义了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

我在
foo中定义了
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是静态的,但也是
基地址。因此对象总是加载到主程序地址空间中的固定位置/部分,这是正常的吗?

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

不过我还要问一个问题(OP中也有更新):关闭ASLR后,差异是静态的,基址也是静态的。所以对象总是加载到主程序地址空间中的固定位置/部分,这正常吗?