• R
    work around nasty gcc bug in the i386 syscall asm · 5bd0ab8a
    Rich Felker 提交于
    when the "r" (register) constraint is used to let gcc choose a
    register, gcc will sometimes assign the same register that was used
    for one of the other fixed-register operands, if it knows the values
    are the same. one common case is multiple zero arguments to a syscall.
    this horribly breaks the intended usage, which is swapping the GOT
    pointer from ebx into the temp register and back to perform the
    syscall.
    
    presumably there is a way to fix this with advanced usage of register
    constaints on the inline asm, but having bad memories about hellish
    compatibility issues with different gcc versions, for the time being
    i'm just going to hard-code specific registers to be used. this may
    hurt the compiler's ability to optimize, but it will fix serious
    miscompilation issues.
    
    so far the only function i know what compiled incorrectly is
    getrlimit.c, and naturally the bug only applies to shared (PIC)
    builds, but it may be more extensive and may have gone undetected..
    5bd0ab8a
syscall.h 26.0 KB