Re: Shared Library starter, ld.so

From: Richard B. Johnson (root@chaos.analogic.com)
Date: Fri Jun 06 2003 - 06:34:50 EST


On Fri, 6 Jun 2003, Richard Henderson wrote:

> On Thu, Jun 05, 2003 at 10:46:18AM -0400, Richard B. Johnson wrote:
> > The dynamic linker, provided with RedHat 9 no longer
> > compiles with the de facto standard of having register
> > EDX point to function to be called before exit.
>
> You're wrong. Indeed, the rh9 crt1.o still expects the value:
>
>
> 8: 50 push %eax
> 9: 54 push %esp
> a: 52 push %edx <<==== HERE
> b: 68 00 00 00 00 push $0x0
> c: R_386_32 __libc_csu_fini
> 10: 68 00 00 00 00 push $0x0
> 11: R_386_32 __libc_csu_init
> 15: 51 push %ecx
> 16: 56 push %esi
> 17: 68 00 00 00 00 push $0x0
> 18: R_386_32 main
> 1c: e8 fc ff ff ff call 1d <_start+0x1d>
> 1d: R_386_PC32 __libc_start_main
>
> and ld.so provides the value here:
>
> # Pass our finalizer function to the user in %edx, as per ELF ABI.\n\
> leal _dl_fini@GOTOFF(%ebx), %edx\n\
>

I am NOT wrong. I have crt startup code and if you actually CALL
the value in %edx, you __will__ segfault. So do a bit of research
before you claim that I'm wrong. Newer versions of the 'C' runtime
library simply fail to call that pointer in atexit(), before exit()
is called.

These things are so easily checked. Just assemble and link this code
against your favorite shared library.

#
# This is the entry point, usually the first thing in the text
# segment. The SVR4/i386 ABI (pages 3-31, 3-32) says that upon
# entry most registers' values are unspecified, except for:
#
# %edx Contains a function pointer to be registered with `atexit'.
# This is how the dynamic linker arranges to have DT_FINI
# functions called for shared libraries that have been loaded
# before this code runs.
#
# %esp The stack contains the arguments and environment:
# 0(%esp) argc
# 4(%esp) argv[0]
# ...
# (4*argc)(%esp) NULL
# (4*(argc+1))(%esp) envp[0]
# ...
# NULL
#

.section .text
.global _start
.type _start,@function
_start: call *%edx
        pushl $0
        call exit
.end

It works, i.e., exits without any errors with the ld-linux.so that
exists on all my systems except the Red Hat 9 system.

On the Red Hat 9 system, it will segfault.

Cheers,
Dick Johnson
Penguin : Linux version 2.4.20 on an i686 machine (797.90 BogoMips).
Why is the government concerned about the lunatic fringe? Think about it.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Jun 07 2003 - 22:00:30 EST