Mail Archives: cygwin-developers/1998/04/15/13:22:55
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
- Raw text -