GCC / LD链接JNA无法识别的变形符号

时间:2018-11-29 14:12:58

标签: java c gcc linker jna

奇怪的问题不是很确定该怎么问。

我正在为专有共享库编写一些JNA绑定。

库api具有几个名为km_open,km_close等的函数。 在c中,这些函数在头文件中的定义如下:

Komodo km_open (
    int port_number
);
int km_close (
    Komodo komodo
);

在Java中,我为它们定义了JNA绑定,如下所示:

public abstract Komodo km_open(int port_number);
public abstract int km_close(Komodo komodo);

但是JNA无法在库中找到这些符号。 当我将符号转储到二进制文件中时 我发现以下内容:

0000000000008e20 g    DF .text  0000000000000005  Base        net_km_open
0000000000007410 g    DF .text  0000000000000005  Base        c_km_open
0000000000008e40 g    DF .text  0000000000000005  Base        net_km_close
0000000000007430 g    DF .text  0000000000000005  Base        c_km_close

我猜测是因为.net和独立的c应用程序都打算使用该库,所以这些名称都经过修饰以提供该功能的替代版本。但是我在演示应用程序源代码中找不到任何将名称c_km_open映射到km_open的东西。但它可以在GCC中编译,并且代码可以正常工作。链接/加载二进制文件时,这些符号如何解析?JNA是否具有执行相同操作的方法?当前,如果我像这样修改绑定,则可以使JNA绑定起作用:

public abstract Komodo c_km_open(int port_number);
public abstract int c_km_close(Komodo komodo);

这是一个可以接受的解决方法,我只想了解这里的背景情况。

1 个答案:

答案 0 :(得分:0)

没关系,我找到了答案,这有点棘手,但是makefile并没有链接.so库文件本身,而是生成了一个与.so库同名的目标代码,该对象代码定义了包装方法,动态加载“ c_”函数。然后,它们链接到那段目标代码而不是库。它没有在搜索中出现,因为它是生成的文件。 然后,JNA的解决方案是通过使用简化名称创建包装类来模拟该行为,该包装类将回调JNA绑定