From: sos AT buggy DOT prospect DOT com DOT ru (Sergey Okhapkin) Subject: New import library format proposal. 15 Apr 1998 13:22:55 -0700 Message-ID: <01BD68CB.224726A0.cygnus.cygwin32.developers@sos> To: "'cygwin32-developers AT cygnus DOT com'" Hi! I designed this import library format to speed-up process startup. No exports are linked statically, all dll symbols (except LoadLibrary() and GetProcAddres() in libkernel32.a) are resolved dynamically on demand. I hope this should speed-up the startup time of a process. Actual linking is performed only on the first call of dll-exported function, the next calls are a bit faster than in a current implementation (direct jump instead of indirect jump). Dll-exported datas should be accessed/imported in a old (current) way. Library files will have a smaller size than now. New format is compatible with old object files. Every import library module have the following structure: Library module 1: .data_cygwin_nocopy // The section must not be copied on fork. .align 4 _entry1 AT N: // Called function call do_call$dllname // Call dynamic linker .asciz "entry1" // Name of dll's export Library module 2: .data_cygwin_nocopy .align 4 _entry2: call do_call$dllname .asciz "entry2" ..... Main library module - dynamic linker (C-like pseudocode): static NO_COPY HANDLE dll=NULL; do_call$dllname() { unsigned *ptr; FARPROC addr; .asm "pop ptr"; // pop return addr from stack, remember it in ptr. // ptr points now to required export name. if (dll == NULL) if ((dll = LoadLibrary("dllname.dll")) == NULL) exit process or raise an exception "DLL NOT FOUND"; if ((addr = GetProcAddress(dll, ptr)) == NULL) exit process or raise an exeption "DLL ENTRY POINT NOT FOUND"; ptr[-1] = addr; // Store entry address for next library calls ptr[-2] = jmp instruction opcode; // replace "call" instruction with "jmp" .asm "jmp addr" // Actual call to requested function } What do you think about? And... Do we need it?-) -- Sergey Okhapkin, http://www.lexa.ru/sos Moscow, Russia