当从不同平台编译 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 前缀的符号。
谢谢大家。
我尝试为 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 前缀的符号。
谢谢大家。