- 论坛徽章:
- 3
|
3.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <dlfcn.h>
- #include "funcname.h"
- int main()
- {
- int i;
- void* p;
- char*error;
- int (*f)(int);
- char so_name[256];
- getcwd(so_name,256);
- strcat(so_name,"/1.so");
- p=dlopen(so_name,RTLD_LAZY);
- if(p==NULL) {
- fprintf(stderr,"dlopen error:%s\n",dlerror());
- exit(1);
- }
- f=dlsym(p,myfunc);
- error=dlerror();
- if(error!=NULL) {
- fprintf(stderr,"dlsym:%s\n",error);
- exit(1);
- }
- i=f(1);
- printf("%d\n",i);
- return 0;
- }
复制代码
Makefile
- CC=gcc
- CXX=g++
- CPPFLAGS=-fPIC
- SO_SRC=1.cc 2.cc
- FUNCNAME_H=funcname.h
- FUNC=myfunc
- SRC=3.c
- OBJ:=$(SRC:.c=.o)
- CFLAGS=
- SO=1.so
- EXC=a.out
- .PHONY : all clean
- all:$(SO) $(EXC)
- $(SO):$(SO_SRC:.cc=.o)
- $(CXX) -shared -Wl,-soname,$(SO) -o $(SO) $^
- $(EXC):$(FUNCNAME_H) $(OBJ)
- $(CC) $(OBJ) -ldl -o $(EXC)
- $(FUNCNAME_H):$(SO)
- echo '#ifndef FUNCNAME_H' >$(FUNCNAME_H)
- echo '#define FUNCNAME_H' >>$(FUNCNAME_H)
- for func in $(FUNC) ;\
- do\
- echo -n '#define ' $$func '"' >>$(FUNCNAME_H);\
- nm $(SO) | grep $$func |grep -w T| awk '{printf "%s",$$3}'>>$(FUNCNAME_H);\
- echo '"' >>$(FUNCNAME_H);\
- done
- echo '#endif' >>$(FUNCNAME_H)
- .c.o:
- $(CC) -c $(CFLAGS) $< -o $@
- .cc.o:
- $(CXX) -c $(CPPFLAGS) $< -o $@
- clean:
- rm -f *.o $(SO) $(EXC) $(FUNCNAME_H)
复制代码 |
|