[PATCH] D127826: [Driver] Pass -X to ld for riscv*-{elf,freebsd,linux}

Kito Cheng via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 16 21:12:04 PDT 2022


kito-cheng accepted this revision.
kito-cheng added a comment.
This revision is now accepted and ready to land.

ld's help message just confused me, that say `-X` is default, but actually default action is `Discard local temporary symbols in SEC_MERGE sections.` which is no option can enable that but default.

  $ ld.bfd --help
  ...
    -x, --discard-all           Discard all local symbols
    -X, --discard-locals        Discard temporary local symbols (default)
    --discard-none              Don't discard any local symbols
  ...

Anyway, back to the RISC-V part, that set `-X (--discard-locals)` IF discard policy is default, which match the behavior of `emultempl/riscvelf.em`, however I've little concern about that might change the behavior for `ld.bfd` when we try to link with `clang -target riscv64 -Wl,-r -Wl,-s`: ld will treat `ld -r -s` as `ld -r -S -x`, but this change changed this behavior because we always append a `-X` here, so it the behavior is become treat `ld -r -s` as `ld -r -S`, but I must say I really not sure how important of this behavior - the behavior here is over 20 years[2, 3] and I didn't found any document to describe why.

But generally I believe discard fewer symbol isn't harmful - just made the object file fatter little bit, so I give a LGTM here.

[1] https://github.com/bminor/binutils-gdb/blob/master/ld/emultempl/riscvelf.em#L34

[2] https://github.com/bminor/binutils-gdb/blob/252b5132c753830d5fd56823373aed85f2a0db63/ld/ldmain.c#L272
[3] https://github.com/bminor/binutils-gdb/commit/f5fa8ca231d47662321addbfbde105e2bed0be07#diff-3b7cfc539d765310991a11f7f328f095fc6f9e17fea1a8510c949c210804deb5R281

  /* Treat ld -r -s as ld -r -S -x (i.e., strip all local symbols).  I
     don't see how else this can be handled, since in this case we
     must preserve all externally visible symbols.  */
  if (bfd_link_relocatable (&link_info) && link_info.strip == strip_all)
    {    
      link_info.strip = strip_debugger;
      if (link_info.discard == discard_sec_merge)
        link_info.discard = discard_all;
    }  


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D127826/new/

https://reviews.llvm.org/D127826



More information about the cfe-commits mailing list