public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
* How can I get a .dll to resolve at runtime ?
@ 1999-07-07 14:42 Robert Bresner
  1999-07-07 15:49 ` DJ Delorie
  1999-07-31 18:34 ` Robert Bresner
  0 siblings, 2 replies; 16+ messages in thread
From: Robert Bresner @ 1999-07-07 14:42 UTC (permalink / raw)
  To: cygwin

Howdy,

I have a .dll which wants to call functions in the .exe. When I 
try linking the .dll, I get unresolved externals. NT, you see, 
wants to resolve everything at link-time, unlike *nix which wants
to resolve at run-time.

Is there a way, on NT, to get a .dll to resolve externals 
at runtime, like *nix, instead of at link time?

I know I can rewrite a whole bunch of everything, and move
functions around and bluh bluh bluh and get a successful
resolve at link-time. That's not what I'm looking for, however. 

Any suggestions for this would certainly be appreciated.
Thanks in advance.

----------------------------------------
Robert Bresner          rbresner@olf.com
Open Link Financial    516-227-6600 x216
http://www.olf.com/    fax: 516-227-1799
----------------------------------------
Opinions expressed are explicitly my own
"No more talking!  Cerebus has a SWORD!"

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com

^ permalink raw reply	[flat|nested] 16+ messages in thread
* Re: How can I get a .dll to resolve at runtime ?
@ 1999-07-08  4:50 Emanuele ALIBERTI
  1999-07-31 18:34 ` Emanuele ALIBERTI
  0 siblings, 1 reply; 16+ messages in thread
From: Emanuele ALIBERTI @ 1999-07-08  4:50 UTC (permalink / raw)
  To: dj, rbresner; +Cc: cygwin

>I don't think so.  What you'd normally do is have the exe call the dll
>at startup and pass it pointers to its functions, which the dll would
>store in per-process memory (remember that dlls are shared among many
>executables).

The DLL image is actually loaded once and memory mapped n-times in the 
address space of each process that imports from it.

>One thing to try is to export the function with a .DEF file, and see
>if that works.  You'd have to build an import library for your
>executable and link the dll against that, but I'm not sure if NT would
>even *allow* such a hack.

Yes, it works. That is actually a quasi-static linking, because the loader 
fails to initialize a porcess if it does not find each DLL in the process 
image's imports table. You can also call an exported function by calling at 
run-time LoadLibrary() and asking for an entry point with GetProcAddress().


______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com

^ permalink raw reply	[flat|nested] 16+ messages in thread
* Re: How can I get a .dll to resolve at runtime ?
@ 1999-07-08  4:54 Emanuele ALIBERTI
  1999-07-31 18:34 ` Emanuele ALIBERTI
  0 siblings, 1 reply; 16+ messages in thread
From: Emanuele ALIBERTI @ 1999-07-08  4:54 UTC (permalink / raw)
  To: rbresner, dj; +Cc: cygwin

>I'll actually have function foo() statically linked in
>a.exe and b.exe ( from another library static library).
>And, a.exe and b.exe would be linking to the
>dll. This throws a bone in the works, doesn't it?
>
>If a.exe and b.exe were both running...
>and both load the .dll... which become part of
>the process's address space... Does this mean
>the .dll is 'loaded' twice? Such that

No, it doesn't. Only the internal module reference count is set to two.

>	a.exe->dll->foo()->a.exe
>and
>	b.exe->dll->foo()->b.exe
>If that makes sense? The .exe calls a function in
>the dll, which is calling a function back in the exe.
>So, if a.exe calls the dll, does the dll go back to a.exe
>for the foo()... and if b.exe calls the dll function,
>does the dll go back to b.exe for foo()...?

DLLs (for EXEs it is the same) are memory mapped in the importing process 
address space, not shared.


______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com

^ permalink raw reply	[flat|nested] 16+ messages in thread
* Re: How can I get a .dll to resolve at runtime ?
@ 1999-07-08  4:57 Emanuele ALIBERTI
  1999-07-31 18:34 ` Emanuele ALIBERTI
  0 siblings, 1 reply; 16+ messages in thread
From: Emanuele ALIBERTI @ 1999-07-08  4:57 UTC (permalink / raw)
  To: dj, rbresner; +Cc: cygwin

>Aye, there's the rub.  It depends on whether NT considers the import
>address table to be a shared resource, or a per-process one.  One can
>only try and see.

I guess: since the imports table is patched by the loader, it should be 
per-process.


______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~1999-07-31 18:34 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-07-07 14:42 How can I get a .dll to resolve at runtime ? Robert Bresner
1999-07-07 15:49 ` DJ Delorie
1999-07-07 16:13   ` Tor Lillqvist
1999-07-31 18:34     ` Tor Lillqvist
1999-07-07 17:01   ` Robert Bresner
1999-07-07 17:33     ` DJ Delorie
1999-07-31 18:34       ` DJ Delorie
1999-07-31 18:34     ` Robert Bresner
1999-07-31 18:34   ` DJ Delorie
1999-07-31 18:34 ` Robert Bresner
1999-07-08  4:50 Emanuele ALIBERTI
1999-07-31 18:34 ` Emanuele ALIBERTI
1999-07-08  4:54 Emanuele ALIBERTI
1999-07-31 18:34 ` Emanuele ALIBERTI
1999-07-08  4:57 Emanuele ALIBERTI
1999-07-31 18:34 ` Emanuele ALIBERTI

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).