From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x531.google.com (mail-pg1-x531.google.com [IPv6:2607:f8b0:4864:20::531]) by sourceware.org (Postfix) with ESMTPS id C4F3F3882666 for ; Thu, 18 Apr 2024 12:29:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C4F3F3882666 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C4F3F3882666 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::531 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713443343; cv=none; b=dOZUuR3r+ui4UshdZdmWLK/jOQBB8Ouxu+RqxsbOrMt/KiMEptFE7PBLaO62Mnc/GC4RQe6fXKheubKjBdgM61xim2GIGnhnJB0E2514Iv6cOEjAWhTMkUirhfcmWGX2JVPosrYAlenkfe3E54AjndPhMWe47xRqLQ80+rFzchI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713443343; c=relaxed/simple; bh=71fgwBawfvQ87bwPFtGaVe/LgO/1e8VYt7T/5nh2oZ0=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=TqgoK/Vxf6CcrHS5GgJb9S5nQxMNAd5rt27XCcn75wbgBaFsmy2ES5FUEvDqsjqHrakq6sapvzQMGySsmcGRxbe/b0HSEXLNj5OFz8wCDMVTcTBeehl7XH49YQTI7i9/T9w6oHpAEcKeX5hLt020kZlLxF4GzqDW8QtHtg5QTqE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pg1-x531.google.com with SMTP id 41be03b00d2f7-5d4a1e66750so569062a12.0 for ; Thu, 18 Apr 2024 05:29:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713443340; x=1714048140; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=ZmntwpYlwi2pp+9vtiwo44ITbQOsqpRNNngBeW2O1Fg=; b=V95SZsw+PZIlNRnfavh4hScOq6PQOxIZcqhzBzFbWSpZ0QrxIuWMp147l/7C4Nf6gZ 3TpCAkkELEl1QtK9Dn4KT0/u6hEYFgGrKpCMEPjEsJyq1cKUjCDHQuKkIGtEVItruPCz 2+gxdo0RLgWMWYvBNL1KGjL+LYbSFuLQR8HH5CHTfLQ5O4rfzmja5Xn23976PukrNNDW s7843Gj6253KlxeyNOtiiOVy67Xk3lZHqFYdSX2tHCat3i1KdWBbPWyOc1s+0jD/0v5n u38rP7b5fkKiOAXJnSw2UQ8Xl9QxDc90BxnwAKIedmUY4gyqZ7rqYvwjxt2A7mtaCeZy KSJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713443340; x=1714048140; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZmntwpYlwi2pp+9vtiwo44ITbQOsqpRNNngBeW2O1Fg=; b=GGbSvJqPSm+BLO3QclxOtOicDeqSUitdPjHz6usU5oCQn9VzLEcZ5PRSZlEPDed+vQ ii8SxxltpqXMc0peG9t0KMe6bVy89FWoFeNB5rQh7WuKmeXliNxs0/zWPHVt1AVsj12p bRMwRyy0Aia7/4fc3JxnGpW9BRQpwhU1sjoWtWSqqpS8GXQFZw1ZNgeeeZHJ/qMCR1dW FxBwaMQv2YDmm6wBFI0TYE7SMSDzVzrGZ2+SkzNeqNaPs8ZkOKlmVQLvlRRTS/5FEkfB jC7YrYKrXNXUApPh63Fy47frAZqds4nqlSxYsA7vnoJmvr6ryEdq0ydXuWIG1/rb5uNO BCzQ== X-Gm-Message-State: AOJu0YyqC84r/ID0TbtGB1v+G2PEdpVmhaVwhKpfjL8r7sjn0mEywatU Va5wg2AafDxDe3/uNQDaDEXkYlzJD16sBPFAyiX0eFHX+hDVpe1iYo4n2Q== X-Google-Smtp-Source: AGHT+IEwP1Upaa0i1wCUePXGX3D2yauSo+6xNN9odGWmqwAF+vKttGeK8N57U0cpmye7BS2YWaAhKQ== X-Received: by 2002:a05:6a20:a124:b0:1a9:447b:68b6 with SMTP id q36-20020a056a20a12400b001a9447b68b6mr3505643pzk.25.1713443339478; Thu, 18 Apr 2024 05:28:59 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.56.168.158]) by smtp.gmail.com with ESMTPSA id b13-20020a056a000ccd00b006e6c61b264bsm1364890pfv.32.2024.04.18.05.28.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Apr 2024 05:28:58 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 14DF17401AE; Thu, 18 Apr 2024 05:28:57 -0700 (PDT) From: "H.J. Lu" To: binutils@sourceware.org Cc: oliva@gnu.org Subject: [PATCH] elf: Strip unreferenced weak undefined symbols Date: Thu, 18 Apr 2024 05:28:56 -0700 Message-ID: <20240418122856.190234-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3022.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Linker will resolve an undefined symbol only if it is referenced by relocation. Unreferenced weak undefined symbols serve no purpose. Weak undefined symbols appear in the dynamic symbol table only when they are referenced by dynamic relocation. Mark symbols with relocation and strip undefined weak symbols if they don't have relocation and aren't in the dynamic symbol table. bfd/ PR ld/31652 * elf-bfd.h (elf_link_hash_entry): Add has_reloc. * elf-vxworks.c (elf_vxworks_emit_relocs): Set has_reloc. * elflink.c (_bfd_elf_link_output_relocs): Likewise. (elf_link_output_extsym): Strip undefined weak symbols if they don't have relocation and aren't in the dynamic symbol table. ld/ PR ld/31652 * testsuite/ld-elf/elf.exp: Run undefweak tests. * testsuite/ld-elf/undefweak-1.rd: New file. * testsuite/ld-elf/undefweak-1a.s: Likewise. * testsuite/ld-elf/undefweak-1b.s: Likewise. * testsuite/ld-x86-64/weakundef-1.nd: Likewise. * testsuite/ld-x86-64/weakundef-1a.s: Likewise. * testsuite/ld-x86-64/weakundef-1b.s: Likewise. * testsuite/ld-x86-64/x86-64.exp: Run undefweak tests. --- bfd/elf-bfd.h | 2 + bfd/elf-vxworks.c | 56 ++++++++++++++------------- bfd/elflink.c | 17 +++++++- ld/testsuite/ld-elf/elf.exp | 15 +++++++ ld/testsuite/ld-elf/undefweak-1.rd | 10 +++++ ld/testsuite/ld-elf/undefweak-1a.s | 14 +++++++ ld/testsuite/ld-elf/undefweak-1b.s | 10 +++++ ld/testsuite/ld-x86-64/weakundef-1.nd | 6 +++ ld/testsuite/ld-x86-64/weakundef-1a.s | 6 +++ ld/testsuite/ld-x86-64/weakundef-1b.s | 8 ++++ ld/testsuite/ld-x86-64/x86-64.exp | 18 +++++++++ 11 files changed, 134 insertions(+), 28 deletions(-) create mode 100644 ld/testsuite/ld-elf/undefweak-1.rd create mode 100644 ld/testsuite/ld-elf/undefweak-1a.s create mode 100644 ld/testsuite/ld-elf/undefweak-1b.s create mode 100644 ld/testsuite/ld-x86-64/weakundef-1.nd create mode 100644 ld/testsuite/ld-x86-64/weakundef-1a.s create mode 100644 ld/testsuite/ld-x86-64/weakundef-1b.s diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index ef5dcb55e72..92a0287d40e 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -232,6 +232,8 @@ struct elf_link_hash_entry a strong defined symbol alias. U.ALIAS points to a list of aliases, the definition having is_weakalias clear. */ unsigned int is_weakalias : 1; + /* Symbol has a relocation. */ + unsigned int has_reloc : 1; /* String table index in .dynstr if this is a dynamic symbol. */ unsigned long dynstr_index; diff --git a/bfd/elf-vxworks.c b/bfd/elf-vxworks.c index 4c172cd4115..36e5540f9c0 100644 --- a/bfd/elf-vxworks.c +++ b/bfd/elf-vxworks.c @@ -172,35 +172,39 @@ elf_vxworks_emit_relocs (bfd *output_bfd, irela += bed->s->int_rels_per_ext_rel, hash_ptr++) { - if (*hash_ptr - && (*hash_ptr)->def_dynamic - && !(*hash_ptr)->def_regular - && ((*hash_ptr)->root.type == bfd_link_hash_defined - || (*hash_ptr)->root.type == bfd_link_hash_defweak) - && (*hash_ptr)->root.u.def.section->output_section != NULL) + if (*hash_ptr) { - /* This is a relocation from an executable or shared - library against a symbol in a different shared - library. We are creating a definition in the output - file but it does not come from any of our normal (.o) - files. ie. a PLT stub. Normally this would be a - relocation against against SHN_UNDEF with the VMA of - the PLT stub. This upsets the VxWorks loader. - Convert it to a section-relative relocation. This - gets some other symbols (for instance .dynbss), but - is conservatively correct. */ - for (j = 0; j < bed->s->int_rels_per_ext_rel; j++) + (*hash_ptr)->has_reloc = 1; + if ((*hash_ptr)->def_dynamic + && !(*hash_ptr)->def_regular + && ((*hash_ptr)->root.type == bfd_link_hash_defined + || (*hash_ptr)->root.type == bfd_link_hash_defweak) + && (*hash_ptr)->root.u.def.section->output_section != NULL) { - asection *sec = (*hash_ptr)->root.u.def.section; - int this_idx = sec->output_section->target_index; - - irela[j].r_info - = ELF32_R_INFO (this_idx, ELF32_R_TYPE (irela[j].r_info)); - irela[j].r_addend += (*hash_ptr)->root.u.def.value; - irela[j].r_addend += sec->output_offset; + /* This is a relocation from an executable or shared + library against a symbol in a different shared + library. We are creating a definition in the output + file but it does not come from any of our normal (.o) + files. ie. a PLT stub. Normally this would be a + relocation against against SHN_UNDEF with the VMA of + the PLT stub. This upsets the VxWorks loader. + Convert it to a section-relative relocation. This + gets some other symbols (for instance .dynbss), but + is conservatively correct. */ + for (j = 0; j < bed->s->int_rels_per_ext_rel; j++) + { + asection *sec = (*hash_ptr)->root.u.def.section; + int this_idx = sec->output_section->target_index; + + irela[j].r_info + = ELF32_R_INFO (this_idx, + ELF32_R_TYPE (irela[j].r_info)); + irela[j].r_addend += (*hash_ptr)->root.u.def.value; + irela[j].r_addend += sec->output_offset; + } + /* Stop the generic routine adjusting this entry. */ + *hash_ptr = NULL; } - /* Stop the generic routine adjusting this entry. */ - *hash_ptr = NULL; } } } diff --git a/bfd/elflink.c b/bfd/elflink.c index 9c53bfcf7d4..4f72d1b2a90 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -2942,8 +2942,7 @@ _bfd_elf_link_output_relocs (bfd *output_bfd, asection *input_section, Elf_Internal_Shdr *input_rel_hdr, Elf_Internal_Rela *internal_relocs, - struct elf_link_hash_entry **rel_hash - ATTRIBUTE_UNUSED) + struct elf_link_hash_entry **rel_hash) { Elf_Internal_Rela *irela; Elf_Internal_Rela *irelaend; @@ -2986,9 +2985,12 @@ _bfd_elf_link_output_relocs (bfd *output_bfd, * bed->s->int_rels_per_ext_rel); while (irela < irelaend) { + if (*rel_hash) + (*rel_hash)->has_reloc = 1; (*swap_out) (output_bfd, irela, erel); irela += bed->s->int_rels_per_ext_rel; erel += input_rel_hdr->sh_entsize; + rel_hash++; } /* Bump the counter, so that we know where to add the next set of @@ -10769,6 +10771,13 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data) && (h->root.u.undef.abfd->flags & BFD_PLUGIN) != 0) strip = true; + /* Remember if this symbol should be stripped. */ + bool should_strip = strip; + + /* Strip undefined weak symbols link if they don't have relocation. */ + if (!strip) + strip = !h->has_reloc && h->root.type == bfd_link_hash_undefweak; + type = h->type; /* If we're stripping it, and it's not a dynamic symbol, there's @@ -10917,6 +10926,10 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data) eoinfo->failed = true; return false; } + /* If a symbol is in the dynamic symbol table and isn't a + should-strip symbol, also keep it in the symbol table. */ + if (!should_strip) + strip = false; } /* If we are marking the symbol as undefined, and there are no diff --git a/ld/testsuite/ld-elf/elf.exp b/ld/testsuite/ld-elf/elf.exp index 685b87588e7..874ba662d2b 100644 --- a/ld/testsuite/ld-elf/elf.exp +++ b/ld/testsuite/ld-elf/elf.exp @@ -171,6 +171,21 @@ run_ld_link_tests [list \ "implib" ] \ ] \[uses_genelf\] +run_ld_link_tests [list \ + [list "Generate undefweak-1.a" \ + "" "" \ + $hpux \ + {undefweak-1a.s} \ + {} \ + "undefweak-1.a" ] \ + [list "Generate undefweak-1.o" \ + "-r" "tmpdir/undefweak-1.a" \ + $hpux \ + {undefweak-1b.s} \ + {{readelf {-rsW} undefweak-1.rd}} \ + "undefweak-1.o" ] \ +] \[uses_genelf\] + #v850 gas complains about .tbss.var section attributes. if { [check_gc_sections_available] && ![istarget "v850-*-*"] } { run_ld_link_tests { diff --git a/ld/testsuite/ld-elf/undefweak-1.rd b/ld/testsuite/ld-elf/undefweak-1.rd new file mode 100644 index 00000000000..5b48c13c892 --- /dev/null +++ b/ld/testsuite/ld-elf/undefweak-1.rd @@ -0,0 +1,10 @@ +#source: undefweak-1a.s +#source: undefweak-1b.s +#as: +#ld: -r +#readelf: -sW + +#failif +#... +.*: 0+ +0 +FUNC +WEAK +DEFAULT +UND +bar +#pass diff --git a/ld/testsuite/ld-elf/undefweak-1a.s b/ld/testsuite/ld-elf/undefweak-1a.s new file mode 100644 index 00000000000..1d885fb9997 --- /dev/null +++ b/ld/testsuite/ld-elf/undefweak-1a.s @@ -0,0 +1,14 @@ + .section .text.foobar,"axG",%progbits,foo,comdat + .weak foo + .type foo,%function +foo: + .nop + .size foo, . - foo + .weak bar + .set bar, foo + .text + .global baz + .type baz,%function +baz: + .dc.a foo + .size baz, . - baz diff --git a/ld/testsuite/ld-elf/undefweak-1b.s b/ld/testsuite/ld-elf/undefweak-1b.s new file mode 100644 index 00000000000..8ba34ea855e --- /dev/null +++ b/ld/testsuite/ld-elf/undefweak-1b.s @@ -0,0 +1,10 @@ + .section .text.foobar,"axG",%progbits,foo,comdat + .weak foo + .type foo,%function +foo: + .nop + .size foo, . - foo + .text + .global _start + .set _start,foo + .dc.a baz diff --git a/ld/testsuite/ld-x86-64/weakundef-1.nd b/ld/testsuite/ld-x86-64/weakundef-1.nd new file mode 100644 index 00000000000..c4c89bfabdb --- /dev/null +++ b/ld/testsuite/ld-x86-64/weakundef-1.nd @@ -0,0 +1,6 @@ +#nm: -n +#target: x86_64-*-* + +#... + +w +bar +#pass diff --git a/ld/testsuite/ld-x86-64/weakundef-1a.s b/ld/testsuite/ld-x86-64/weakundef-1a.s new file mode 100644 index 00000000000..b6eea3201a6 --- /dev/null +++ b/ld/testsuite/ld-x86-64/weakundef-1a.s @@ -0,0 +1,6 @@ + .text + .global foo + .type foo,%function +foo: + .nop + .size foo, . - foo diff --git a/ld/testsuite/ld-x86-64/weakundef-1b.s b/ld/testsuite/ld-x86-64/weakundef-1b.s new file mode 100644 index 00000000000..3d2da7dc548 --- /dev/null +++ b/ld/testsuite/ld-x86-64/weakundef-1b.s @@ -0,0 +1,8 @@ + .weak bar + .text + .global _start + .type _start,%function +_start: + mov bar@GOTPCREL(%rip), %rax + mov foo@GOTPCREL(%rip), %rax + .size _start, . - _start diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index e370f393a7a..6546fff4efc 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -264,6 +264,24 @@ run_ld_link_tests [list \ {objdump -drj.plt tlsdesc.pd}} \ "libtlsdesc.so" \ ] \ + [list \ + "Generate x86-64-weakundef-1.so" \ + "-shared -melf_x86_64" \ + "" \ + "--64" \ + {weakundef-1a.s} \ + {} \ + "x86-64-weakundef-1.so" \ + ] \ + [list \ + "Generate x86-64-weakundef-1" \ + "-melf_x86_64" \ + "tmpdir/x86-64-weakundef-1.so" \ + "--64" \ + {weakundef-1b.s} \ + {{nm -n weakundef-1.nd}} \ + "x86-64-weakundef-1" \ + ] \ ] set test_name "Mixed x86_64 and i386 input test 1" -- 2.44.0