????????????????C/C++?????к?????????????????????????г???????????????????????г?????????С???????????????????±??????г????????????????????Linux???????????Щ?????????????????????????????????????????????????????Linux???μ?????
?????????????
????????????????С???????????????????????????????ELFhash???????????????????????????????????
//elfhash.h
#include
unsigned long  ELFhash(const char* key);
//elfhash.c
#include "elfhash.h"
unsigned long ELFhash(const char* key)
{
unsigned long h = 0?? g;
while( *key ) {
h = ( h > 24;
h &= ~g;
}
return h;
}
?????????????gcc???????????????ld??????????????????????
????gcc -fPIC -c -Wall elfhash.c
????ld  -shared elfhash.o -o libelfhash.so
????????-fPIC?????????λ?????????(Position Independent Code)?????????????????????й???????????????ld??-shared????????????????????????gcc??????????ld????????
????gcc -fPIC -shared -Wall -o libelfhash.so elfhash.c
???????????
????????????÷?????????????????????????????????á????????????????
????#include "elfhash.h"
????int main()
????{
????printf("%ldn"?? ElfHash("key-for-test"));
????return 0;
????}
????????????????????????????????
#include
void *dlopen(const char *filename?? int flag);
//flag??????RTLD_LAZY????й?????е????????δ????????RTLD_NOW????dlopen????????δ????????
char *dlerror(void);
//???????????????????????
void *dlsym(void *handle?? const char *symbol);
//???????
int dlclose(void *handle);
//???
??????????漸????????????ELFhash???????????????????
#include "elfhash.h"
#include
#include
int main() {
void *handle;
unsigned long (*hash)(const char*);
char *error;
handle = dlopen ("./libelfhash.so"?? RTLD_LAZY);
if (!handle) {
fputs (dlerror()?? stderr);
exit(1);
}
hash = dlsym(handle?? "ElfHash");
if ((error = dlerror()) != NULL)  {
fputs(error?? stderr);
exit(1);
}
printf ("%ldn"?? (*hash)("key-for-test"));
dlclose(handle);
}
????????????????????????????????????? ????????????????????????Щ????