AIX 7.1下编译自定义C共享库的方法(Linux编译已成功)
在AIX 7.1环境下编译你的C共享库
先确认你的代码没问题,我把它整理成清晰的格式:
#include <stdio.h> #include <stdlib.h> #include <string.h> void sh(char *); int sh2(char *); void sh( char *cmd ) { int num; num = system(cmd); } int sh2( char *cmd ) { int num; num = system(cmd); return num; }
你在Linux下的编译命令是:
gcc -fPIC -c extprocsh.c gcc -shared -static-libgcc -o extprocsh.so extprocsh.o
放到AIX 7.1环境下用gcc编译,大部分参数可以复用,但要注意AIX链接器的符号导出规则,具体步骤如下:
步骤1:编译生成位置无关的目标文件
这一步和Linux完全一致,-fPIC是gcc生成位置无关代码的标准参数,AIX的gcc同样支持:
gcc -fPIC -c extprocsh.c
步骤2:链接生成共享库
AIX下gcc生成共享库依然用-shared,但默认情况下AIX链接器不会导出所有全局符号,这会导致外部程序无法调用你的sh和sh2函数。所以需要添加链接器参数-bexpall来导出所有全局符号。另外-static-libgcc参数在AIX下同样有效,用来静态链接libgcc库,减少运行时依赖:
gcc -shared -static-libgcc -Wl,-bexpall -o extprocsh.so extprocsh.o
补充小技巧:
- 如果你的gcc版本较旧,或者遇到链接错误,可以尝试替换
-shared为AIX传统的生成共享库链接器参数-Wl,-G,命令变为:gcc -Wl,-G -static-libgcc -Wl,-bexpall -o extprocsh.so extprocsh.o - 编译完成后,可以用AIX自带的
dump命令检查共享库的导出符号,确认sh和sh2是否被正确导出:
如果能看到这两个函数的条目,说明符号导出正常。dump -Tv extprocsh.so | grep -E 'sh$|sh2$'
内容的提问来源于stack exchange,提问作者Adam Gawlik
相关产品推荐
相关产品推荐

