tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Using hidden visibility in ld.elf_so



On Sat, Dec 04, 2010 at 12:45:34AM +0100, Joerg Sonnenberger wrote:

> Hi all,
> attached patch marks ld.elf_so as using hidden visibility by default and
> the exported functions explicitly as public. It also changes i386 and
> x86_64 to exploit this by using relative calls to avoid the PLT. This
> slightly reduces the number of relocations and decreases size as well.
> 
> Comments?

Thank you. :-).  Should have an excellent impact on some workloads.
Are there many relocs left?  On x86 at least a really dumb prelinker
could eliminate an awful lot of them.  When I looked at this I wondered
if it might be worth adding a script that causes the build to fail if
certain kinds of relocs are introduced.  Might be more trouble than
it's worth, just a thought.

> Joerg

> Index: Makefile
> ===================================================================
> RCS file: /home/joerg/repo/netbsd/src/libexec/ld.elf_so/Makefile,v
> retrieving revision 1.98
> diff -u -p -r1.98 Makefile
> --- Makefile  29 Oct 2010 15:08:17 -0000      1.98
> +++ Makefile  3 Dec 2010 23:12:14 -0000
> @@ -40,6 +40,7 @@ M=          ${.CURDIR}/arch/${ARCHSUBDIR}
>  
>  LDFLAGS+=    -shared -symbolic -nostartfiles
>  LDFLAGS+=    -Wl,-static
> +CFLAGS+=     -fvisibility=hidden
>  
>  # Adds SRCS, CPPFLAGS, LDFLAGS, etc.  Must go first so MD startup source
>  # is first.
> Index: rtld.h
> ===================================================================
> RCS file: /home/joerg/repo/netbsd/src/libexec/ld.elf_so/rtld.h,v
> retrieving revision 1.95
> diff -u -p -r1.95 rtld.h
> --- rtld.h    16 Oct 2010 10:27:07 -0000      1.95
> +++ rtld.h    3 Dec 2010 23:05:11 -0000
> @@ -254,13 +254,13 @@ extern Elf_Sym _rtld_sym_zero;
>  /* rtld.c */
>  
>  /* We export these symbols using _rtld_symbol_lookup and is_exported. */
> -char *dlerror(void);
> -void *dlopen(const char *, int);
> -void *dlsym(void *, const char *);
> -int dlclose(void *);
> -int dladdr(const void *, Dl_info *);
> -int dlinfo(void *, int, void *);
> -int dl_iterate_phdr(int (*)(struct dl_phdr_info *, size_t, void *),
> +__dso_public char *dlerror(void);
> +__dso_public void *dlopen(const char *, int);
> +__dso_public void *dlsym(void *, const char *);
> +__dso_public int dlclose(void *);
> +__dso_public int dladdr(const void *, Dl_info *);
> +__dso_public int dlinfo(void *, int, void *);
> +__dso_public int dl_iterate_phdr(int (*)(struct dl_phdr_info *, size_t, void 
> *),
>      void *);
>  
>  /* These aren't exported */
> Index: arch/i386/rtld_start.S
> ===================================================================
> RCS file: 
> /home/joerg/repo/netbsd/src/libexec/ld.elf_so/arch/i386/rtld_start.S,v
> retrieving revision 1.10
> diff -u -p -r1.10 rtld_start.S
> --- arch/i386/rtld_start.S    28 Apr 2008 20:23:03 -0000      1.10
> +++ arch/i386/rtld_start.S    3 Dec 2010 23:18:04 -0000
> @@ -34,6 +34,7 @@
>       .text
>       .align  4
>       .globl  .rtld_start
> +     .hidden .rtld_start
>       .type   .rtld_start,@function
>  .rtld_start:
>       subl    $8,%esp                 # make room of obj_main and exit proc
> @@ -48,12 +49,12 @@
>  
>       pushl   %ebx                    # relocbase
>       pushl   %ecx                    # &_DYNAMIC
> -     call    _rtld_relocate_nonplt_self@PLT
> +     call    _rtld_relocate_nonplt_self
>  
>       leal    12(%esp),%eax           # &cleanup
>       pushl   %ebx                    # relocbase
>       pushl   %eax                    # sp
> -     call    _rtld@PLT               # _rtld(sp, relocbase)
> +     call    _rtld                   # _rtld(sp, relocbase)
>  
>       addl    $16,%esp                # pop args
>  
> @@ -64,6 +65,7 @@
>  
>       .align  4
>       .globl  _rtld_bind_start
> +     .hidden _rtld_bind_start
>       .type   _rtld_bind_start,@function
>  _rtld_bind_start:    # (obj, reloff)
>       pushf                           # save registers
> @@ -73,7 +75,7 @@ _rtld_bind_start:   # (obj, reloff)
>  
>       pushl   20(%esp)                # Copy of reloff
>       pushl   20(%esp)                # Copy of obj
> -     call    _rtld_bind@PLT          # Call the binder
> +     call    _rtld_bind              # Call the binder
>       addl    $8,%esp                 # pop binder args
>       movl    %eax,20(%esp)           # Store function to be called in obj
>  
> Index: arch/x86_64/rtld_start.S
> ===================================================================
> RCS file: 
> /home/joerg/repo/netbsd/src/libexec/ld.elf_so/arch/x86_64/rtld_start.S,v
> retrieving revision 1.7
> diff -u -p -r1.7 rtld_start.S
> --- arch/x86_64/rtld_start.S  3 Dec 2010 22:48:25 -0000       1.7
> +++ arch/x86_64/rtld_start.S  3 Dec 2010 23:15:23 -0000
> @@ -1,4 +1,4 @@
> -/*   $NetBSD: src/libexec/ld.elf_so/arch/x86_64/rtld_start.S,v 1.7 
> 2010-12-03 22:48:25 joerg Exp $   */
> +/*   $NetBSD: rtld_start.S,v 1.7 2010/12/03 22:48:25 joerg Exp $     */
>  
>  /*
>   * Copyright (c) 2001 Wasabi Systems, Inc.
> @@ -40,6 +40,7 @@
>       .text
>       .align  16
>       .globl  .rtld_start
> +     .hidden .rtld_start
>       .type   .rtld_start,@function
>  .rtld_start:
>       subq    $16,%rsp                # make room of obj_main and exit proc
> @@ -52,11 +53,11 @@
>       subq    (%rax),%rbx             # relocbase
>  
>       movq    %rbx,%rsi
> -     call    _rtld_relocate_nonplt_self@PLT
> +     call    _rtld_relocate_nonplt_self
>  
>       movq    %r12,%rdi
>       movq    %rbx,%rsi
> -     call    _rtld@PLT               # _rtld(sp, relocbase)
> +     call    _rtld                   # _rtld(sp, relocbase)
>  
>       popq    %rbx                    # %rbx = ps_strings
>       popq    %rdx                    # %rdx = cleanup
> @@ -65,6 +66,7 @@
>  
>       .align  4
>       .globl  _rtld_bind_start
> +     .hidden _rtld_bind_start
>       .type   _rtld_bind_start,@function
>  _rtld_bind_start:    # (obj, reloff)
>       # This function is called with a misaligned stack from the PLT
> @@ -84,7 +86,7 @@ _rtld_bind_start:   # (obj, reloff)
>       movq    80(%rsp),%rdi
>       movq    88(%rsp),%rsi
>  
> -     call    _rtld_bind@PLT          # call the binder
> +     call    _rtld_bind              # call the binder
>       movq    %rax,88(%rsp)           # store function in obj
>  
>       popq    %r11



Home | Main Index | Thread Index | Old Index