[PATCH] LoongArch: Not alloc dynamic relocs if symbol is absolute

Fangrui Song i@maskray.me
Sat Jul 6 16:31:20 GMT 2024


On Sat, Jul 6, 2024 at 12:59 AM Jinyang He <hejinyang@loongson.cn> wrote:
>
> The absolute symbol should be resolved to const when link to dso or exe.
> Alloc dynamic relocs will cause extra space and R_LARCH_NONE finally.
> ---
>  bfd/elfnn-loongarch.c                              | 14 +++++++-------
>  ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp |  2 ++
>  ld/testsuite/ld-loongarch-elf/script_abssym.s      |  3 +++
>  ld/testsuite/ld-loongarch-elf/script_abssym_pie.d  |  6 ++++++
>  .../ld-loongarch-elf/script_abssym_shared.d        |  6 ++++++
>  5 files changed, 24 insertions(+), 7 deletions(-)
>  create mode 100644 ld/testsuite/ld-loongarch-elf/script_abssym.s
>  create mode 100644 ld/testsuite/ld-loongarch-elf/script_abssym_pie.d
>  create mode 100644 ld/testsuite/ld-loongarch-elf/script_abssym_shared.d
>
> diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
> index 06eec0ded6e..d2ce39359ba 100644
> --- a/bfd/elfnn-loongarch.c
> +++ b/bfd/elfnn-loongarch.c
> @@ -899,6 +899,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
>        unsigned int r_type;
>        unsigned int r_symndx;
>        struct elf_link_hash_entry *h;
> +      bool is_abs_symbol = false;
>        Elf_Internal_Sym *isym = NULL;
>
>        r_symndx = ELFNN_R_SYM (rel->r_info);
> @@ -917,6 +918,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
>           if (isym == NULL)
>             return false;
>
> +         is_abs_symbol = isym->st_shndx == SHN_ABS;
>           if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
>             {
>               h = elfNN_loongarch_get_local_sym_hash (htab, abfd, rel, true);
> @@ -935,6 +937,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
>           while (h->root.type == bfd_link_hash_indirect
>                  || h->root.type == bfd_link_hash_warning)
>             h = (struct elf_link_hash_entry *) h->root.u.i.link;
> +         is_abs_symbol = bfd_is_abs_symbol (&h->root);
>         }
>
>        /* It is referenced by a non-shared object.  */
> @@ -1142,13 +1145,6 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
>               && bfd_link_pic (info)
>               && (sec->flags & SEC_ALLOC) != 0)
>             {
> -             bool is_abs_symbol = false;
> -
> -             if (r_symndx < symtab_hdr->sh_info)
> -               is_abs_symbol = isym->st_shndx == SHN_ABS;
> -             else
> -               is_abs_symbol = bfd_is_abs_symbol (&h->root);
> -
>               if (!is_abs_symbol)
>                 {
>                   _bfd_error_handler
> @@ -1165,6 +1161,10 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
>         case R_LARCH_JUMP_SLOT:
>         case R_LARCH_64:
>
> +         /* Resolved to const. */
> +         if (is_abs_symbol)
> +           break;
> +
>           need_dynreloc = 1;
>
>           /* If resolved symbol is defined in this object,
> diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
> index 4606ede9fc0..e36dfe561fc 100644
> --- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
> +++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
> @@ -141,6 +141,7 @@ if [istarget "loongarch64-*-*"] {
>      run_dump_test "relr-discard-shared"
>      run_dump_test "relr-got-shared"
>      run_dump_test "relr-text-shared"
> +    run_dump_test "script_abssym_shared"
>    }
>
>    if [check_pie_support] {
> @@ -149,6 +150,7 @@ if [istarget "loongarch64-*-*"] {
>      run_dump_test "relr-discard-pie"
>      run_dump_test "relr-got-pie"
>      run_dump_test "relr-text-pie"
> +    run_dump_test "script_abssym_pie"
>    }
>
>    run_dump_test "max_imm_b16"
> diff --git a/ld/testsuite/ld-loongarch-elf/script_abssym.s b/ld/testsuite/ld-loongarch-elf/script_abssym.s
> new file mode 100644
> index 00000000000..3eacc766054
> --- /dev/null
> +++ b/ld/testsuite/ld-loongarch-elf/script_abssym.s
> @@ -0,0 +1,3 @@
> +.section .data,"aw"
> +.quad _size8
> +.word _size4
> diff --git a/ld/testsuite/ld-loongarch-elf/script_abssym_pie.d b/ld/testsuite/ld-loongarch-elf/script_abssym_pie.d
> new file mode 100644
> index 00000000000..84bda98b7a0
> --- /dev/null
> +++ b/ld/testsuite/ld-loongarch-elf/script_abssym_pie.d
> @@ -0,0 +1,6 @@
> +#source: script_abssym.s
> +#ld: -pie -e 0 --defsym _size8=0 --defsym _size4=0
> +#readelf: -r
> +#...
> +There are no relocations in this file.
> +#...
> diff --git a/ld/testsuite/ld-loongarch-elf/script_abssym_shared.d b/ld/testsuite/ld-loongarch-elf/script_abssym_shared.d
> new file mode 100644
> index 00000000000..2af8f97c851
> --- /dev/null
> +++ b/ld/testsuite/ld-loongarch-elf/script_abssym_shared.d
> @@ -0,0 +1,6 @@
> +#source: script_abssym.s
> +#ld: -shared --defsym _size8=0 --defsym _size4=0
> +#readelf: -r
> +#...
> +There are no relocations in this file.
> +#...
> --
> 2.45.2
>

LGTM. The test doesn't need to be named `script_*`, though. Absolute
symbols can be defined with `abs = 0x1000` in assembly or symbol
assignments (e.g. `--defsym`).


More information about the Binutils mailing list