[PATCH] ARC: Fix ld/pr24511 test

Claudiu Zissulescu Claudiu.Zissulescu@synopsys.com
Thu Jul 30 17:01:38 GMT 2020


It looks alright to me. I'll push it asap.

Thank you for your contribution,
Claudiu

> -----Original Message-----
> From: Shahab Vahedi [mailto:shahab.vahedi@gmail.com]
> Sent: Thursday, July 30, 2020 7:41 PM
> To: binutils@sourceware.org
> Cc: Shahab Vahedi <shahab.vahedi@gmail.com>; Shahab Vahedi
> <shahab@synopsys.com>; Claudiu Zissulescu <claziss@synopsys.com>;
> Claudiu Zissulescu <claziss@gmail.com>; Francois Bedard
> <fbedard@synopsys.com>
> Subject: [PATCH] ARC: Fix ld/pr24511 test
> 
> From: Shahab Vahedi <shahab@synopsys.com>
> 
> With this patch, ld/pr24511 test passes for ARC.
> 
> At first glance, the test was failing because the order of
> "__init_array_start" and "__fini_array_start" weak symbols were
> reversed:
> 
> $ nm -n dump.out
> 
>       expected output          |          real output
> 00002104 D __init_array_start  |  00002104 D __fini_array_start
> 0000210c D __fini_array_start  |  00002104 D __init_array_start
> 
> The order of the symbols are different as a side effect of both
> symbols being mapped to the _same_ address (0x2104).  Looking
> further into the mapping logs [1] revealed that the linker
> script must consider all instances of ".init_array" (in other
> words ".init_array.*") inside its relevant section. Same logic
> holds for ".fini_array".
> 
> Therefore, adding "KEEP (*(SORT(.init_array.*)))" to the linker
> script, along with the one for ".finit_array.*", resolved the
> problem.  While at it, I took the liberty of refactoring the
> script a little bit and made those pieces of script macros.
> 
> [1] Linker's mapping for the relevant part of the test
> ---------------------------------------------------------------
> .init_array     0x2104        0x0
>                 0x2104        PROVIDE (__init_array_start = .)
>  *(.init_array)
>                 [!provide]    PROVIDE (__init_array_end = .)
> 
> .fini_array     0x2104        0x0
>                 0x2104        PROVIDE (__fini_array_start = .)
>  *(.fini_array)
>                 [!provide]    PROVIDE (__fini_array_end = .)
> 
> .data           0x2104        0x0
>  *(.data .data.* .gnu.linkonce.d.*)
>  .data          0x2104        0x0 pr24511.o
> 
> .init_array.01000
>                 0x2104        0x8
>  .init_array.01000
>                 0x2104        0x8 pr24511.o
> 
> .fini_array.01000
>                 0x210c        0x8
>  .fini_array.01000
>                 0x210c        0x8 pr24511.o
> ---------------------------------------------------------------
> 
> ld:
> 	* scripttempl/elfarc.sc (.init_array): Keep ".init_array.*".
> 	  (.fini_array): Keep ".fini_array.*".
> ---
>  ld/scripttempl/elfarc.sc | 24 ++++++++++++++++--------
>  1 file changed, 16 insertions(+), 8 deletions(-)
> 
> diff --git a/ld/scripttempl/elfarc.sc b/ld/scripttempl/elfarc.sc
> index 8851c771f22..ebf40b84528 100644
> --- a/ld/scripttempl/elfarc.sc
> +++ b/ld/scripttempl/elfarc.sc
> @@ -118,6 +118,20 @@ if test -z "${NO_SMALL_DATA}"; then
>    REL_SBSS2=".rel.sbss2    ${RELOCATING-0} : { *(.rel.sbss2${RELOCATING+
> .rel.sbss2.* .rel.gnu.linkonce.sb2.*}) }
>    .rela.sbss2   ${RELOCATING-0} : { *(.rela.sbss2${RELOCATING+ .rela.sbss2.*
> .rela.gnu.linkonce.sb2.*}) }"
>  fi
> +INIT_ARRAY=".init_array   ${RELOCATING-0} :
> +  {
> +    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_start = .);}}
> +    KEEP (*(SORT(.init_array.*)))
> +    KEEP (*(.init_array))
> +    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_end = .);}}
> +  }"
> +FINI_ARRAY=".fini_array   ${RELOCATING-0} :
> +  {
> +    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_start = .);}}
> +    KEEP (*(SORT(.fini_array.*)))
> +    KEEP (*(.fini_array))
> +    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}}
> +  }"
>  CTOR=".ctors        ${CONSTRUCTING-0} :
>    {
>      ${CONSTRUCTING+${CTOR_START}}
> @@ -314,14 +328,8 @@ cat <<EOF
>    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_start = .);}}
>    .preinit_array   ${RELOCATING-0} : { *(.preinit_array) }
>    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_end = .);}}
> -
> -  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_start = .);}}
> -  .init_array   ${RELOCATING-0} : { *(.init_array) }
> -  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_end = .);}}
> -
> -  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_start = .);}}
> -  .fini_array   ${RELOCATING-0} : { *(.fini_array) }
> -  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}}
> +  ${RELOCATING+${INIT_ARRAY}}
> +  ${RELOCATING+${FINI_ARRAY}}
> 
>    .data         ${RELOCATING-0} :
>    {
> --
> 2.28.0



More information about the Binutils mailing list