3

我有一个要与共享库一起使用的程序。

我有一个库(1),它是用充满代码的方法编译的,即

class A
{
public:
    int* funcA(int a, int b)
    {
        int* pInt = new int;
        *pInt = a + (b * 20);
        return pInt;
    }
};

然后我有另一个库(2) ,名称和接口完全相同,方法中没有任何内容,即虚拟类

class A
{
public:
    int* funcA(int a, int b)
    {
        return 0;
    }
};

(注意:代码只是用来说明我的问题)

如果我针对库 1进行编译,然后在运行时使用库 1 ,那么一切都会按预期工作。

如果我针对库 2进行编译,然后在运行时使用库 1,则第一次调用 funcA 会死掉。

如果我使用 nm -D libMy.so 并在运行时查看 funcA 的偏移量,情况会有所不同。这是否包含在二进制文件中?

我已经阅读了各种手册和教程,但对于编译和运行时方面如何导致此故障一无所知。我会认为接口是相同的,所以方法会成功。

谢谢。

4

3 回答 3

2

失败的原因是您已链接到不同的库,因此(如您所见)函数偏移量不同。链接器已将偏移量放入已编译的二进制文件中,因此它只会针对该库运行。为了完成您在此处尝试的操作,您将需要使用动态库加载,请参阅 SO 问题以获取更多信息。

编辑:
通过进一步阅读,我发现了这个PDF,您可能会发现它很有帮助。

于 2012-08-30T15:22:42.457 回答
0

(我没有足够的代表在您的问题下方发表评论)

这可能是因为程序是预链接的 (Linux) 或预绑定的 (MacOS),尽管我不确定 100%。下面的维基百科上有一些关于它的基本信息。您在通过手册进行搜索时遇到过这种情况吗?

http://en.wikipedia.org/wiki/Prelink

http://en.wikipedia.org/wiki/Prebinding

于 2012-08-30T15:03:38.963 回答
0

您在编译库时是否忘记了 -fPIC 选项?请添加编译命令。

于 2012-08-31T05:57:00.543 回答