|
![](/i/fill.gif) |
On Thu, 22 Apr 1999 00:44:01 +0200, Kenneth Johansson <ken### [at] canit se> wrote:
>You know that a shared lib is slower than statically linked code. well now you
>do :)
You must be kidding. If it is slower (and it doesn't have to be) it is only
by a few cycles per function call.
On a 386, a direct intrasegment call takes 7+m cycles, where m is a
characteristic of the first instruction at the called address and is a constant
for our purposes. An indirect intrasegment (all 32-bit flat-model calls are
intrasegment) call takes either 7+m or 10+m cycles. Let's be pessimists and
say that it will take the three extra cycles in every case (as it likely will
if the address of the target address is specified directly rather than as a
register.) On a 33 MHz machine, then, it will take an extra tenth of a
microsecond to make the indirect call. If we have to call that function for
every pixel of an 800x600 image, it will take a whole 48 milliseconds longer to
use the shared library. Most of us have faster processors than a 386/33,
though, so we won't have to wait that long. If you do have a 386/33, and you
don't have the 48 milliseconds to spare, just write self-modifying code that
'fixes up' the dynamic library call to a direct call at bind time.
>Also it can be quite hard to support this in a generic way. But I could be
>done I think if the build system is converted to gnu autoconf/libtool. Libtool
>take care of all the hairy things involving dll's
Keep in mind that autoconf and libtool are both very Unix-centric. Autoconf
generates shell scripts. Hands up all you Mac and Windows users who have a
fully-compatible copy of bash. Thought so. Libtool supports the following
build environments. Note that Windows, MS-DOS, and MacOS are all missing.
------ quoted from http://www.fsf.org/software/libtool/libtool.html
Libtool supports building static libraries on all platforms.
Shared library support has been implemented for these platforms:
AIX 3.x (*-*-aix3*)
AIX 4.x (*-*-aix4*)
AmigaOS (*-*-amigaos*)
BSD/OS 4.x (*-*-bsdi4*)
Digital/UNIX 3.x, 4.x, a.k.a. OSF/1 (*-*-osf3*, *-*-osf4*)
DG/UX R4.11, R4.12, R4.20 (*-*-dguxR411*, *-*-dguxR412*, *-*-dguxR420*)
FreeBSD 2.x, 3.x (*-*-freebsd2*, *-*-freebsd3*)
GNU/Linux ELF (*-*-linux-gnu*, except aout, coff, and oldld)
HP-UX 9.x, 10.x, 11.x (*-*-hpux9*, *-*-hpux10*, *-*-hpux11*) [see note]
IRIX 5.x, 6.x (*-*-irix5*, *-*-irix6*)
NetBSD 1.x (*-*-netbsd*)
OpenBSD 2.x (*-*-openbsd*)
OS/2 using EMX (*-*-os2*)
SCO OpenServer 5.x (*-*-sco3.2v5*)
SCO UnixWare 7.x (*-*-sysv5*)
Solaris 2.x (*-*-solaris2*)
SunOS 4.x, a.k.a. Solaris 1.x (*-*-sunos4*)
UnixWare 2.x (*-*-sysv4.2uw2*)
UTS 4.x (*-*-uts4*)
All ELF targets that use both the GNU C compiler (gcc) and GNU ld
Post a reply to this message
|
![](/i/fill.gif) |