Portál AbcLinuxu, 12. května 2025 05:18
lib.c
:
#include <stdio.h> void neco() { printf("Něco\n"); }Toto je první program
prog1.c
:
void neco(); int main() { neco(); return 0; }Toto je druhý program
prog2.c
:
#include <dlfcn.h> void (*neco)(); int main() { void *lib = dlopen("./lib.so", RTLD_NOW); neco = dlsym(lib, "neco"); neco(); dlclose(lib); return 0; }A teď k překladu:
gcc -fPIC -shared -o lib.so lib.c gcc -o prog1 prog1.c ./lib.so -ldl gcc -o prog2 prog2.c -ldlA teď k testování:
time { for i in `seq 1 1000`; do ./prog1 >& /dev/null; done; } time { for i in `seq 1 1000`; do ./prog2 >& /dev/null; done; }První program je uměle spojen s knihovnou
dl
, aby se zaváděla také a spušení brzdila. Můžete zkusit -ldl
vyhodit.
dlopen
a dlsym
.
$ more tst_so.c void dummy() {} $ more tst_main.c #include < dlfcn.h> #include < stdio.h> #include < stdlib.h> #include < asm/msr.h> #define TIME(x) { \ int b, e; rdtscl(b); x; rdtscl(e); \ printf (#x ": %d\n", e - b);} void dump (char *txt, unsigned char *p) { int i; printf("%s at %p:", txt, p); i = 10; do printf(" %02x", *p++); while (--i); printf("\n"); } extern int dummy (void); int main () { int i; dump("dummy", (unsigned char*)dummy); i = 10; do TIME(dummy()) while (--i); void *module = dlopen("./tst_so.so", RTLD_NOW); if (!module) { perror("dlopen"); exit(1); } int (*dummy_ptr)() = dlsym(module, "dummy"); if (!dummy_ptr) { perror("dlsym"); exit(1); } dump("dummy_ptr", (unsigned char*)dummy_ptr); i = 10; do TIME(dummy_ptr()) while (--i); } $ gcc -O -fomit-frame-pointer -fpic -shared tst_so.c -o tst_so.so $ gcc -O -fomit-frame-pointer tst_main.c tst_so.so -ldl $ LD_LIBRARY_PATH=. ./a.out dummy at 0x804851c: ff 25 d8 99 04 08 68 30 00 00 dummy(): 1358 dummy(): 49 dummy(): 70 dummy(): 38 dummy(): 38 dummy(): 38 dummy(): 38 dummy(): 38 dummy(): 38 dummy(): 38 dummy_ptr at 0xb7f804bc: c3 90 90 90 55 89 e5 56 53 e8 dummy_ptr(): 375 dummy_ptr(): 35 dummy_ptr(): 35 dummy_ptr(): 35 dummy_ptr(): 35 dummy_ptr(): 35 dummy_ptr(): 35 dummy_ptr(): 35 dummy_ptr(): 35 dummy_ptr(): 35
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.