• R
    dynamic linker bootstrap overhaul · f3ddd173
    Rich Felker 提交于
    this overhaul further reduces the amount of arch-specific code needed
    by the dynamic linker and removes a number of assumptions, including:
    
    - that symbolic function references inside libc are bound at link time
      via the linker option -Bsymbolic-functions.
    
    - that libc functions used by the dynamic linker do not require
      access to data symbols.
    
    - that static/internal function calls and data accesses can be made
      without performing any relocations, or that arch-specific startup
      code handled any such relocations needed.
    
    removing these assumptions paves the way for allowing libc.so itself
    to be built with stack protector (among other things), and is achieved
    by a three-stage bootstrap process:
    
    1. relative relocations are processed with a flat function.
    2. symbolic relocations are processed with no external calls/data.
    3. main program and dependency libs are processed with a
       fully-functional libc/ldso.
    
    reduction in arch-specific code is achived through the following:
    
    - crt_arch.h, used for generating crt1.o, now provides the entry point
      for the dynamic linker too.
    
    - asm is no longer responsible for skipping the beginning of argv[]
      when ldso is invoked as a command.
    
    - the functionality previously provided by __reloc_self for heavily
      GOT-dependent RISC archs is now the arch-agnostic stage-1.
    
    - arch-specific relocation type codes are mapped directly as macros
      rather than via an inline translation function/switch statement.
    f3ddd173
dynlink.c 43.2 KB