file tree
code
libfun1.c
int add(int x, int y) {
return x+y;
}
libfun2.c
int add(int x, int y) {
return x+y;
}
main1.c
#include <stdio.h>
extern int add(int x, int y);
int main(int argc, char** argv) {
fprintf(stdout, "%d\n", add(111, 222));
return 0;
}
main2.c
#include <stdio.h>
extern int add(int x, int y);
int main(int argc, char** argv) {
fprintf(stdout, "%d\n", add(111, 222));
return 0;
}
makefile
default:
gcc -c libfun1.c -o libfun1.o
gcc -c libfun2.c -o libfun2.o
gcc -c main1.c -o main1.o
gcc -c main2.c -o main2.o
ar -crs libfun1.a libfun1.o
gcc -fPIC -shared libfun2.o -o libfun2.so
export LD_LIBRARY_PATH=.
gcc main1.o -L. -lfun1 -o main1.exe
gcc main2.o -L. -lfun2 -o main2.exe
objdump -S main1.exe > main1.dis
objdump -S main2.exe > main2.dis
.PHONY:clean
clean:
rm *.o *.exe *.so *.a *.dis
test
1.
上面为静态链接程序的符号表,下面为动态链接程序的符号表
对比发现,静态链接符号add类型为T,动态链接符号add类型U
2.
左边为动态链接库汇编源码,右边为静态链接库汇编源码;对比发现:静态链接库汇编源码中有add函数实现过程,而动态链接库没有,且采用了fprintf一样的标记方式