nm输出和运行时中的C函数地址 #包括 无效测试() { printf(“你好,世界!\r\n”); } void main() { test(); printf(“%p\r\n”,测试); }

nm输出和运行时中的C函数地址 #包括 无效测试() { printf(“你好,世界!\r\n”); } void main() { test(); printf(“%p\r\n”,测试); },c,linux,C,Linux,在Ubuntu 18.04上运行此代码时,测试的函数地址为0x565785b0,nm命令给出测试的地址0x000005b0。但是在Ubuntu 16.04上,测试的函数地址总是相同的 Ubuntu 18.04:gcc版本5.5,NM2.30,内核4.15.0-33 Ubuntu 16.04:gcc版本5.4,nm 2.26.1,内核4.15.0-33 请任何人解释一下这些地址什么时候相同,什么时候不同?有没有可能让它们总是一样的?你确定Ubuntu 16.04的内核版本吗?您引用的18.04是正

在Ubuntu 18.04上运行此代码时,测试的函数地址为0x565785b0,nm命令给出测试的地址0x000005b0。但是在Ubuntu 16.04上,测试的函数地址总是相同的

Ubuntu 18.04:gcc版本5.5,NM2.30,内核4.15.0-33
Ubuntu 16.04:gcc版本5.4,nm 2.26.1,内核4.15.0-33


请任何人解释一下这些地址什么时候相同,什么时候不同?有没有可能让它们总是一样的?

你确定Ubuntu 16.04的内核版本吗?您引用的18.04是正确的,但我认为16.04使用的是旧内核。为什么这对您很重要?你希望利用这些地址的知识做什么?有一种东西叫做ASLR(地址空间布局随机化)。我不确定这是否是地址变化的一个因素,但可能是。是的,这与ASLR有关。在Ubuntu18.04中,gcc默认配置为--enablefaultpie选项。当使用gcc-no pie编译时,地址总是相同的。Thanks@JonathanLeffler.
#include <stdio.h>

void test()
{
    printf("hello, world!\r\n");
}

void main()
{
    test();
    printf("%p\r\n", test);
}