如果我在Ubuntu 16.10上链接程序时定义了一个符号地址,那么在运行程序时似乎没有产生正确的地址。例如,采取以下计划
#include <stdio.h>
extern int mem_;
int main()
{
printf("%p\n", &mem_);
}
并使用
进行编译gcc example.c -o example -Xlinker --defsym=mem_=0x80
然后运行该程序在较旧的Ubuntu系统上打印0x80,但在Ubuntu 16.10上打印一个随机数。然而,0x80符号似乎进入了可执行文件,如nm程序所示。
任何想法导致了什么?我怀疑是一种安全功能。
答案 0 :(得分:1)
在ChangeLog的GCC部分(见https://wiki.ubuntu.com/YakketyYak/ReleaseNotes)
&#34;我们已经在amd64和ppc64el架构上将GCC修改为具有位置无关可执行支持的默认编译程序,以提高地址空间布局随机化提供的安全性优势。&#34;
要禁用此选项,只需将-no-pie添加到GCC的标记中即可。