symbol

linux系统gcc编译动态库so中的attribute((weak))弱符号使用

首先说明下代码结构:一共三个源码,两个动态库so的源码:lib1.c和lib2.c,各导出一个库函数(gcc编译时默认导出,不像windows的msvc要明确指定导出dllexport),一个主执行程序源码:main.c,调用两个动态库的导出函数,如下:

lib1.c

#include <stdio.h>

void lib1_func(const char* from)
{
        printf("lib1 func from %s\n", from);
}

lib2.c

#include <stdio.h>

void lib2_func(const char* from)
{
        printf("lib2 func from %s\n", from);
}

main.c

#include <stdio.h>

void lib1_func(const char* from);
void lib2_func(const char* from);

int main()
{
        printf("hello from main\n");
        lib1_func("main");
        lib2_func("main");
        return 0;
}
Continue reading…

关于linux系系统的动态库全局函数重名问题

最近在使用某几个知名厂商的对象存储C SDK时,发现由于这些SDK的内部实现其实基本是一样的,进而导致了各个SDK的so中都或多或少有些被大家共同喜爱的全局函数(符号)名称,最后引发了在部分环境中出现了调用A厂商SDK的上传函数时崩溃在了B厂商SDK的同名全局函数中的问题,最开始感觉很是莫名其妙,后来查了资料发现,首先gcc编译时默认会将全局变量、函数等符号导出在都动态库中,而同时全局函数的加载又是抢占式的,这点通过如下简单试验便可验证:

Continue reading…

Android Studio通过CMake编译原生代码运行时符号(函数)丢失的问题

由于新版Android Studio的native调试功能实在是太好用了,所以试了下把旧版Cococs2d-x项目(大概是2.x版本吧)重建Android Studio项目。花了很长时间添加各种source,static library,prebuilt library以后,终于项目可以在Android Studio的cmake编译工具下成功编译链接并生成.so了,迫不及待的一运行,发现直接闪退,检查后发现是”Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeOnResume”这个cocos2d-x的jni函数没有找到!
初步检查了下,发现cmake编译出的cocos2d静态库.a中存在这个函数符号,但是最终生成的.so中确实是没有这个函数(使用ndk toolchain里面的nm),于是想到应该是链接时认为这个符号没有代码调用,被stripe掉了。
后来又仔细看了下Android.mk,发现玄机貌似在于

LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static

对cocos2dx的静态库使用了WHOLE的链接方式,于是开始查找同样功能在cmake中的实现方式,最后查的结果如下:
Continue reading…