From: Mark Shinwell Date: Wed, 13 Sep 2017 09:23:16 +0000 (+0100) Subject: arm64-hide-symbols-for-stricter-binutils X-Git-Tag: archive/raspbian/4.08.1-4+rpi1~3^2^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8e5923665b2b2b24834b02b5bb34d50b22edd667;p=ocaml.git arm64-hide-symbols-for-stricter-binutils AArch64 GOT fixed Gbp-Pq: Name 0011-arm64-hide-symbols-for-stricter-binutils.patch --- diff --git a/Changes b/Changes index cc59f635..4c0eac7a 100644 --- a/Changes +++ b/Changes @@ -135,6 +135,10 @@ OCaml 4.05.0 (13 Jul 2017): (Hannes Mehnert, Guillaume Bury, review by Daniel Bünzli, Gabriel Scherer, Damien Doligez) +- GPR#1330: when generating dynamically-linkable code on AArch64, always + reference symbols (even locally-defined ones) through the GOT. + (Mark Shinwell, review by Xavier Leroy) + ### Standard library: - MPR#6975, GPR#902: Truncate function added to stdlib Buffer module diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index f75646e1..729096c5 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -114,6 +114,7 @@ let emit_addressing addr r = | Iindexed ofs -> `[{emit_reg r}, #{emit_int ofs}]` | Ibased(s, ofs) -> + assert (not !Clflags.dlcode); (* see selection.ml *) `[{emit_reg r}, #:lo12:{emit_symbol_offset s ofs}]` (* Record live pointers at call points *) @@ -323,7 +324,7 @@ let emit_literals() = (* Emit code to load the address of a symbol *) let emit_load_symbol_addr dst s = - if (not !Clflags.dlcode) || Compilenv.symbol_in_current_unit s then begin + if not !Clflags.dlcode then begin ` adrp {emit_reg dst}, {emit_symbol s}\n`; ` add {emit_reg dst}, {emit_reg dst}, #:lo12:{emit_symbol s}\n` end else begin @@ -609,6 +610,7 @@ let emit_instr i = match addr with | Iindexed _ -> i.arg.(0) | Ibased(s, ofs) -> + assert (not !Clflags.dlcode); (* see selection.ml *) ` adrp {emit_reg reg_tmp1}, {emit_symbol_offset s ofs}\n`; reg_tmp1 in begin match size with @@ -636,6 +638,7 @@ let emit_instr i = match addr with | Iindexed _ -> i.arg.(1) | Ibased(s, ofs) -> + assert (not !Clflags.dlcode); ` adrp {emit_reg reg_tmp1}, {emit_symbol_offset s ofs}\n`; reg_tmp1 in begin match size with @@ -924,7 +927,15 @@ let fundecl fundecl = let emit_item = function | Cglobal_symbol s -> ` .globl {emit_symbol s}\n`; - | Cdefine_symbol s -> `{emit_symbol s}:\n` + | Cdefine_symbol s -> + if !Clflags.dlcode then begin + (* GOT relocations against non-global symbols don't seem to work + properly: GOT entries are not created for the symbols and the + relocations evaluate to random other GOT entries. For the moment + force all symbols to be global. *) + ` .globl {emit_symbol s}\n`; + end; + `{emit_symbol s}:\n` | Cint8 n -> ` .byte {emit_int n}\n` | Cint16 n -> ` .short {emit_int n}\n` | Cint32 n -> ` .long {emit_nativeint n}\n` diff --git a/asmcomp/arm64/selection.ml b/asmcomp/arm64/selection.ml index d8ea7f83..b714d003 100644 --- a/asmcomp/arm64/selection.ml +++ b/asmcomp/arm64/selection.ml @@ -82,8 +82,8 @@ let inline_ops = [ "sqrt"; "caml_bswap16_direct"; "caml_int32_direct_bswap"; "caml_int64_direct_bswap"; "caml_nativeint_direct_bswap" ] -let use_direct_addressing symb = - (not !Clflags.dlcode) || Compilenv.symbol_in_current_unit symb +let use_direct_addressing _symb = + not !Clflags.dlcode (* Instruction selection *)