main.c
-------------------
#include <dlfcn.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
extern void defsym(void);
int main( int argc, char** argv )
{
void* handle;
void* symptr;
/*** load the shared object containing the definition of the ***/
/*** function defsym. ***/
if ( NULL == ( handle = dlopen( "./libdefsym.so", RTLD_NOW ) ) ){
perror( dlerror() );
exit( 1 );
}
/*** The deferred resolution of the func defsym should have ***/
/*** been resolved by the abve load. ***/
defsym();
/*** Unload the previously loaded shared object. ***/
if ( 0 != ( dlclose( handle ) ) ) {
perror( dlerror() );
exit( 1 );
}
exit( 0 );
}
defsym.c
-----------------
#include <stdio.h>
#include <stdlib.h>
void defsym(){
printf( "defsym called.\n" );
}
defsym.imp
-----------------
#!
defsym
Makefile
-----------------
CC=gcc -maix64
all: main libdefsym.so
main: main.o
$(CC) -o main -Wl,-bI:defsym.imp main.o
main.o: main.c
$(CC) -c main.c
libdefsym.so: defsym.o
#ld -b64 -G -bnoentry -bexpall -o libdefsym.so defsym.o -lc
$(CC) -Wl,-G -Wl,-bnoentry -Wl,-bexpall -o libdefsym.so defsym.o -lc
defsym.o: defsym.c
$(CC) -c defsym.c
.PHONY: clean
clean:
rm *.o *.so main
如果想用.a的库,只需做如下修改:
修改main.c中的dlopen
dlopen( "./libdefsym.a(libdefsym.so)", RTLD_NOW | RTLD_MEMBER )
修改Makefile
CC=gcc -maix64
all: main libdefsym.a
main: main.o
$(CC) -o main -Wl,-bI:defsym.imp main.o
main.o: main.c
$(CC) -c main.c
libdefsym.so: defsym.o
#ld -b64 -G -bnoentry -bexpall -o libdefsym.so defsym.o -lc
$(CC) -Wl,-G -Wl,-bnoentry -Wl,-bexpall -o libdefsym.so defsym.o -lc
libdefsym.a: libdefsym.so
ar -X64 -v -q libdefsym.a libdefsym.so
defsym.o: defsym.c
$(CC) -c defsym.c
.PHONY: clean
clean:
rm *.o *.so main *.a