• R
    fix regression in mips dynamic linker · 2d8cc92a
    Rich Felker 提交于
    this issue caused the address of functions in shared libraries to
    resolve to their PLT thunks in the main program rather than their
    correct addresses. it was observed causing crashes, though the
    mechanism of the crash was not thoroughly investigated. since the
    issue is very subtle, it calls for some explanation:
    
    on all well-behaved archs, GOT entries that belong to the PLT use a
    special relocation type, typically called JMP_SLOT, so that the
    dynamic linker can avoid having the jump destinations for the PLT
    resolve to PLT thunks themselves (they also provide a definition for
    the symbol, which must be used whenever the address of the function is
    taken so that all DSOs see the same address).
    
    however, the traditional mips PIC ABI lacked such a JMP_SLOT
    relocation type, presumably because, due to the way PIC works, the
    address of the PLT thunk was never needed and could always be ignored.
    
    prior to commit adf94c19, the mips
    version of reloc.h contained a hack that caused all symbol lookups to
    be treated like JMP_SLOT, inhibiting undefined symbols from ever being
    used to resolve symbolic relocations. this hack goes all the way back
    to commit babf8201, when the mips
    dynamic linker was first made usable.
    
    during the recent refactoring to eliminate arch-specific relocation
    processing (commit adf94c19), this
    hack was overlooked and no equivalent functionality was provided in
    the new code.
    
    fixing the problem is not as simple as adding back an equivalent hack,
    since there is now also a "non-PIC ABI" that can be used for the main
    executable, which actually does use a PLT. the closest thing to
    official documentation I could find for this ABI is nonpic.txt,
    attached to Message-ID: 20080701202236.GA1534@caradoc.them.org, which
    can be found in the gcc mailing list archives and elsewhere. per this
    document, undefined symbols corresponding to PLT thunks have the
    STO_MIPS_PLT bit set in the symbol's st_other field. thus, I have
    added an arch-specific rule for mips, applied at the find_sym level
    rather than the relocation level, to reject undefined symbols with the
    STO_MIPS_PLT bit clear.
    
    the previous hack of treating all mips relocations as JMP_SLOT-like,
    rather than rejecting the unwanted symbols in find_sym, probably also
    caused dlsym to wrongly return PLT thunks in place of the correct
    address of a function under at least some conditions. this should now
    be fixed, at least for global-scope symbol lookups.
    2d8cc92a
dynlink.c 41.7 KB