• Martin Storsjö's avatar
    winebuild: Fix relay entry points in Thumb mode with binutils/ELF and LLVM/PE. · 9e9509f3
    Martin Storsjö authored
    b1fe783a fixed relay entry points
    in Thumb mode when assembled with Clang/LLVM in ELF mode, but broke
    them when assembled with binutils as (and PE mode with LLVM didn't
    work either before or after).
    
    When/where the thumb bit is applied on symbols varies a lot between
    assemblers; this is a notoriously vague and undocumented area.
    
    After a .thumb_func directive, binutils as considers the next
    non-local symbol as a thumb symbol, to have the thumb bit set.
    LLVM's built-in assembler considers the next symbol, local or not,
    to be a thumb symbol. (Just noting for reference for possible
    solutions, this particular difference didn't play a role so far.)
    
    Secondly, in a symbol difference expression like this:
    
        .long symbol1 - symbol2
    
    Binutils as ignores the potential thumb state for both symbols and
    just calculates the raw distance. LLVM does include the thumb bit
    in symbol1 but ignores it in symbol2.
    
    Finally, for PE targets, the linker sets the thumb bit on all
    absolute addresses pointing to the text section, regardless of any
    .thumb_func directives at assembly time. (I.e., the
    __wine_spec_relay_entry_points entry in .L__wine_spec_relay_descr
    gets the bit set even if it wasn't marked as .thumb_func.)
    
    Therefore, mark __wine_spec_relay_entry_points as .thumb_func, as
    the absolute address to it will end up with the thumb bit set in
    PE builds in any case.
    
    Don't mark the individual relay entry pointers as thumb functions
    (the code still is generated as thumb as there hasn't been any
    mode switch back to arm mode); this makes the differences calculated
    correctly (both LLVM and binutils ignore the thumb state of the
    subtracted label).
    
    If desired, one could change __wine_spec_relay_entry_point_%d into
    local labels with a .L prefix, just as before
    b1fe783a again, it doesn't make
    any difference in this form.
    Signed-off-by: 's avatarMartin Storsjö <martin@martin.st>
    Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
    9e9509f3
Name
Last commit
Last update
..
Makefile.in Loading commit data...
build.h Loading commit data...
import.c Loading commit data...
main.c Loading commit data...
parser.c Loading commit data...
relay.c Loading commit data...
res16.c Loading commit data...
res32.c Loading commit data...
spec16.c Loading commit data...
spec32.c Loading commit data...
utils.c Loading commit data...
winebuild.man.in Loading commit data...