使用defsym定义的符号在Ubuntu 16.10上提供了错误的地址

时间:2016-10-17 20:36:55

标签: linux ubuntu linker

如果我在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程序所示。

任何想法导致了什么?我怀疑是一种安全功能。

1 个答案:

答案 0 :(得分:1)

在ChangeLog的GCC部分(见https://wiki.ubuntu.com/YakketyYak/ReleaseNotes

&#34;我们已经在amd64和ppc64el架构上将GCC修改为具有位置无关可执行支持的默认编译程序,以提高地址空间布局随机化提供的安全性优势。&#34;

要禁用此选项,只需将-no-pie添加到GCC的标记中即可。