我在Linux上使用gcc构建了一个共享库(test.so) 代码当然是PIC。
test.so API调用之一返回指向共享库堆栈上的结构和另一个调用的指针 返回指向共享库数据段上的结构的指针。
当我从共享库中获取这些指针后尝试访问这些指针时,我得到了一个SEGFAULT。
我的问题是这些:
堆栈地址应该始终有效(因为它们是作为SP的offest计算的)所以为什么我得到了SEGFAULT?
对于全局地址,如果我在库中访问它们,编译器会使用动态加载程序给出的基值来解析它们,但是如果我这样做会发生什么:
return& x
编译器是否返回已解析的地址或者是否假设因为没有执行LOAD / STORE它可以保留未解析的地址?
如果它没有解析地址,则调用者可能会获得偏移地址而不是有效地址。这有可能吗?
答案 0 :(得分:1)
test.so API调用之一返回指向共享库堆栈上的结构的指针
没有这样的东西作为“共享库堆栈”。只有一个堆栈(对于每个线程),返回一个局部变量的地址几乎不是你想要的。
另一个调用返回指向共享库数据段上的结构的指针。
没关系,只要你没有dlclose()
有问题的图书馆。
当我从共享库中获取这些指针后尝试访问这些指针时,我得到了一个SEGFAULT。
您可能没有告诉我们整个故事,而且您的问题在其他地方。
无论如何,鉴于您提供的信息,不太可能获得良好答案。请更多详细信息编辑您的问题。可以构建并展示您的问题的测试用例是最好的。