【问题标题】:Symbols defined with defsym give incorrect address on Ubuntu 16.10用 defsym 定义的符号在 Ubuntu 16.10 上给出不正确的地址
【发布时间】:2016-10-17 20:36:54
【问题描述】:

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

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

【问题讨论】:

    标签: linux ubuntu linker


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢 - 我试过 --no-pie,但编译时出错!
    • 实际上是 -no-pie 而不是 --no-pie(单破折号)。假设您尝试过,您遇到的错误是什么?
    • 对不起 - 我之前的评论写得不好。我之前尝试过 --no-pie (有错误),但 -no-pie 确实有效。感谢您的帮助。
    猜你喜欢
    • 2017-03-18
    • 2014-07-29
    • 2015-06-13
    • 1970-01-01
    • 2018-03-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多