Ubuntu 18.04中的printf函数的地址为什么是变动的?

本人代码如下:

#include<stdio.h>

int main()
{
        int (* myshow)(const char *,...);
        printf("HI!,printf'address is %#x\n",printf);
        //把一个地址强制类型转换成函数
        //myshow=(int (*)(const char *,...))0x8048300;
        //myshow("123\n");
        return 0;
}

(Ubuntu18.04)运行结果:
clipboard.png

(Ubuntu12.04)运行结果:
clipboard.png

由以上两图得,Ubuntu 18.04中的printf函数的地址是变动的,而Ubuntu 12.04中的printf函数的地址是不变的为什么哦?printf这个函数不应该在代码段中吗?怎么地址总会变哦?

2019.5.29 13:49
通过

cat /proc/sys/kernel/randomize_va_space

查看发现:
clipboard.png

经过echo 0 > /proc/sys/kernel/randomize_va_space操作
且把//myshow=(int (*)(const char *,...))0x8048300;//myshow("123\n");这两句的屏蔽去掉后:
clipboard.png

虽然地址没改变了,但不能使用地址访问的方式实现printf,这又是为什么哦?

另外,在Ubuntu12.04,查看/proc/sys/kernel/randomize_va_space文件,它显示的是2,但
能正常以地址访问的方式实现printf,且printf函数的地址不会改变。
clipboard.png
clipboard.png

阅读 1.8k
1 个回答

我猜应该是地址空间随机化(ASLR)的原因吧

看一下随机化开关是不是打开了

cat /proc/sys/kernel/randomize_va_space

如果不是0的话,你把它关掉,应该每次就是一样的结果了

echo 0 > /proc/sys/kernel/randomize_va_space
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题