linux - 使用 defsym 定义的符号在 Ubuntu 16.10 上给出了错误的地址

标签 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 程序所示。

知道是什么原因造成的吗?我怀疑有安全功能。

最佳答案

在 ChangeLog 的 GCC 部分下(可在此处找到:https://wiki.ubuntu.com/YakketyYak/ReleaseNotes)

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

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

关于linux - 使用 defsym 定义的符号在 Ubuntu 16.10 上给出了错误的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40095236/

相关文章:

ubuntu - 在 100% 时停止为电池充电,反之亦然

ubuntu - 代客状态显示 "is stopped"

c++ - 使用 C++ 标准库避免共享库中的符号冲突

c - 如何在库本身不冲突的情况下强制链接器拒绝特定库?

python - “设置”对象没有属性 'RECAPTCHA_SECRET_KEY'

c - 如何在 ftrace 中打印 trace_printk 的完整跟踪文件?

linux - 如何为 Linux : KDE, Gnome 等设置我的应用程序桌面图标?

linux - 如何使 Windows 成为开箱即用的 POSIX 兼容操作系统?

java - Netbeans 7.3.1 损坏

c++ - 访问注册表数据以设置链接器和包含路径