Alexandre Julliard writes:
> The dll init routine needs to be in the .init section in order to be
> called first,
Isn't that what attribute((constructor)) does? It places a call to the
routine in the .so's initialization section, whatever that section is,
so that the routine gets invoked during dlopen(). As far as I know, it's
equivalent to the asm() sections it replaces. For example, see the code
emitted by BuildDebugFile() in spec32.c ...
> attribute((constructor)) is not good enough.
I'm perplexed. What is it that attribute((constructor)) does not do?
Perhaps it has a different effect on OBSD than on other systems?
How can I test whether it, or whatever asm code I replace it with,
is doing the right thing?
> Why doesn't it work on OpenBSD? Is the section name different?
AFAICT, OpenBSD uses a section named .ctors containing function
pointers, rather than a section containing 'call' opcodes. At least,
that's what attribute((constructor)) emits, and looking through the
dlfcn and C runtime sources I don't see any other initialization
hooks being called.
There *is* a section named .init, but any code placed there will
be linked after the C function __init() in crtbeginS.c, and will not be
executed because that C function returns normally. But the only
thing that __init() does is invoke the functions pointed to
by .ctors, and add a hook to make sure that the .dtors are called.
Wim.