On Tue, 6 Aug 2024 13:26:00 GMT, Magnus Ihse Bursie <i...@openjdk.org> wrote:

> But why and how do you specify `-Wl,--icf=safe` when building libjvm.a? That 
> is not part of the linker flags in the JDK build mainline. I have not 
> encountered these problems when trying to link with lld.

No, it's not when **building** `libjvm.a`. It's when linking the final elf 
executable **using** `libjvm.a` (or `libnet.a`, etc) that's created with `ld 
-r` or `objcopy`. During the final elf executable linking time, user could 
include additional desired linker flags, such as  `-Wl,--icf=safe`. That's the 
case where things can run into trouble.

We don't have control of the linker flags that users might want to use.

> 
> In any case, the links you provided explains why this approach is 
> catastrophically wrong:
> 
> > Other linkers, notably LLVM lld, supports --icf=safe. It uses .llvm_addrsig 
> > sections to identify functions that are safe to merge. Functions that are 
> > not mentioned in the section are not address-taken (no one takes its 
> > pointer), so they are safe to merge.
> 
> If you were to remove these sections, then the linker will believe that all 
> functions are safe to merge.

How did you arrive the conclusion?

According to 
https://maskray.me/blog/2020-11-15-explain-gnu-linker-options#icfall-and---icfsafe
 (already linked from the bug description),

"ld.lld --icf=safe uses a special section `.llvm_addrsig` (LLVM address 
significance table, type SHT_LLVM_ADDRSIG) produced by Clang -faddrsig....If 
the section is absent, ld.lld is conservative and assumes every section 
defining a symbol in the table is address significant."

When `.llvm_addrsig` section is removed (not present), my understanding is that 
the linker would only do conservative identical code folding safely.

See more in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105625. 

> 
> If you really want that, then you should pass `--icf=all` to the linker, and 
> then it will stop caring about the `.llvm_addrsig` sections.
> 
> But from reading the links you sent, the safe and sound approach seems to be 
> to send `--icf=none` to lld when it should operate on a partially linked (ld 
> -r) .o file.

`--icf=all` is more aggressive optimization and might not be safe? Also, we 
don't control how developers would be building the final elf image.

Removing `.llvm_addrsig` is safe. It has the benefit of not restricting 
specific final linking flags.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/20265#issuecomment-2271754139

Reply via email to