• Russ Cox's avatar
    cmd/5l, cmd/6l, cmd/8l: fix nacl binary corruption bug · a9b2651a
    Russ Cox authored
    NaCl requires the addition of a 32-byte "halt sled" at the end
    of the text segment. This means that segtext.len is actually
    32 bytes shorter than reality. The computation of the file offset
    of the end of the data segment did not take this 32 bytes into
    account, so if len and len+32 rounded up (by 64k) to different
    values, the symbol table overwrote the last page of the data
    segment.
    
    The last page of the data segment is usually the C .string
    symbols, which contain the strings used in error prints
    by the runtime. So when this happens, your program
    probably crashes, and then when it does, you get binary
    garbage instead of all the usual prints.
    
    The chance of hitting this with a randomly sized text segment
    is 32 in 65536, or 1 in 2048.
    
    If you add or remove ANY code while trying to debug this
    problem, you're overwhelmingly likely to bump the text
    segment one way or the other and make the bug disappear.
    
    Correct all the computations to use segdata.fileoff+segdata.filelen
    instead of trying to rederive segdata.fileoff.
    
    This fixes the failure during the nacl/amd64p32 build.
    
    TBR=iant
    CC=golang-codereviews
    https://golang.org/cl/135050043
    a9b2651a
asm.c 18 KB