当从不同平台编译 c 函数并得到与 __kernel__ 不同的符号时

When compiled c function from different platforms and got symbols in difference with __kernel__

我尝试为 android 平台编译开源库 nmap

在ubuntu中,我使用ndk takechain构建libnetutil并得到libnetutil.a。 使用 nm,我查找功能符号: int mac_cache_get(const struct sockaddr_storage *ss, u8 *mac); 我得到符号 _Z13mac_cache_getPK25__kernel_sockaddr_storagePh.

但是在 Mac 上,我使用 Android Studio 编写了一个简单的 android c++ 演示并调用函数 mac_cache_get.

会报undefined reference to mac_cache_get(sockaddr_storage const*, unsigned char*) link错误。

对于nm .o 文件,它尝试调用带有符号的函数: _Z13mac_cache_getPK16sockaddr_storagePh.

所以符号与_Z13mac_cache_getPK25__kernel_sockaddr_storagePh_Z13mac_cache_getPK16sockaddr_storagePh的区别不大。

不知道是不是这个差异导致了link错误,如果是,如何解决这个差异?

我错误地使用了 linux 平台的编译器,它将为 sockaddr_storage 参数生成带有 kernel 前缀的符号。

android 平台的编译器将生成没有 kernel 前缀的符号。

谢谢大家。