【问题标题】:shared library (PIC) returns a pointer to caller results SEGFAULT共享库 (PIC) 返回指向调用者结果 SEGFAULT 的指针
【发布时间】:2013-12-13 00:14:07
【问题描述】:

我在 Linux (test.so) 上使用 gcc 构建了一个共享库 代码当然是PIC。

其中一个 test.so API 调用返回一个指向共享库堆栈上的结构的指针和另一个调用 返回指向共享库数据段上结构的指针。

当我从共享库中获取这些指针后尝试访问它们时,我得到一个 SEGFAULT。

我的问题是:

  1. 堆栈地址应该始终有效(因为它们被计算为对 SP 的偏移量)那么为什么我会得到 SEGFAULT?

  2. 对于全局地址,如果我在库中访问它们,编译器会使用动态加载器给出的基值来解析它们,但是如果我这样做会发生什么:

    返回 &x

编译器是返回解析地址还是假设因为没有执行 LOAD/STORE 它可以保持未解析地址?

如果它没有解析地址,那么调用者可能会得到一个偏移地址而不是一个有效地址。这可能吗?

【问题讨论】:

  • 请贴一些代码。

标签: c linux pointers shared-libraries


【解决方案1】:

其中一个 test.so API 调用返回一个指向共享库堆栈上的结构的指针

没有“共享库堆栈”之类的东西。只有一个栈(每个线程),返回一个局部变量的地址几乎不是你想要的。

另一个调用返回一个指向共享库数据段上结构的指针。

没关系,只要您不dlclose() 相关库即可。

当我从共享库中获取这些指针后尝试访问这些指针时,我得到一个 SEGFAULT。

很可能您没有告诉我们整个故事,而您的问题出在其他地方。

无论如何,鉴于您提供的信息,不太可能提供好的答案。请使用更多详细信息编辑您的问题。一个可以构建并能证明您的问题的测试用例是最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2012-11-07
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多