Bug 27109 - gas: Omit unused STT_SECTION symbols
Summary: gas: Omit unused STT_SECTION symbols
Status: NEW
Alias: None
Product: binutils
Classification: Unclassified
Component: gas (show other bugs)
Version: 2.36
: P2 normal
Target Milestone: 2.36
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-12-23 23:48 UTC by Fangrui Song
Modified: 2021-01-07 14:48 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed: 2020-12-28 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Fangrui Song 2020-12-23 23:48:04 UTC
% cat a.s
call .text.0

.section .text.0,"ax",@progbits
.section .text.1,"ax",@progbits
% as a.s -o a.o
% llvm-mc -filetype=obj a.s -o b.o
% readelf -Ws a.o

Symbol table '.symtab' contains 6 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 
     4: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 
     5: 0000000000000000     0 SECTION LOCAL  DEFAULT    6
% readelf -Ws b.o

Symbol table '.symtab' contains 2 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 SECTION LOCAL  DEFAULT    4
(The only STT_SECTION symbol is for .text.0, which is referenced by a relocation.)

LLVM integrated assembler omits unused STT_SECTION symbols.
This behavior was introduced in 2015 (https://reviews.llvm.org/rL239045)
and is a very efficient size optimization, especially for -ffunction-sections -fdata-sections.

This is quite significant on ELF64 because on ELF64 an unused STT_SECTION costs sizeof(Elf64_Shdr)=64 bytes.
Comment 1 H.J. Lu 2020-12-28 03:45:43 UTC
A patch is posted at

https://sourceware.org/pipermail/binutils/2020-December/114671.html
Comment 2 cvs-commit@gcc.gnu.org 2021-01-07 14:47:13 UTC
The master branch has been updated by H.J. Lu <hjl@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d1bcae833b32f1408485ce69f844dcd7ded093a8

commit d1bcae833b32f1408485ce69f844dcd7ded093a8
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Jan 7 06:42:00 2021 -0800

    ELF: Don't generate unused section symbols
    
    For ELF targets, section symbols are required only for relocations.
    With -ffunction-sections -fdata-sections, there can be many unused
    section symbols.  Sizes of libstdc++.a on Linux/x86-64 in GCC 11 are
    
    With unused section symbols   : 39411698 bytes
    Without unused section symbols: 39227002 bytes
    
    The unused section symbols in libstdc++.a occupy more than 180 KB.
    
    Add BSF_SECTION_SYM_USED to indicate if a section symbol should be
    included in the symbol table.  The BSF_SECTION_SYM_USED should be set
    if the section symbol is used for relocation or the section symbol is
    always included in the symbol table.
    
    Add keep_unused_section_symbols to bfd_target to indicate if unused
    section symbols should be kept.  If TARGET_KEEP_UNUSED_SECTION_SYMBOLS
    is defined as FALSE, unused ection symbols will be removed.
    
    Tested on Linux/x86.  Other ELF backends need to:
    
    1. Define TARGET_KEEP_UNUSED_SECTION_SYMBOLS to FALSE.
    2. Mark used section symbols in assembler backend.
    3. Remove unused section symbols from expected assembler and linker
    outputs.
    
    bfd/
    
            PR 27109
            * aix386-core.c (core_aix386_vec): Initialize
            keep_unused_section_symbol to TARGET_KEEP_UNUSED_SECTION_SYMBOLS.
            * aout-target.h (MY (vec)): Likewise.
            * binary.c (binary_vec): Likewise.
            * cisco-core.c (core_cisco_be_vec): Likewise.
            (core_cisco_le_vec): Likewise.
            * coff-alpha.c (alpha_ecoff_le_vec): Likewise.
            * coff-i386.c (TARGET_SYM): Likewise.
            (TARGET_SYM_BIG): Likewise.
            * coff-ia64.c (TARGET_SYM): Likewise.
            * coff-mips.c (mips_ecoff_le_vec): Likewise.
            (mips_ecoff_be_vec): Likewise.
            (mips_ecoff_bele_vec): Likewise.
            * coff-rs6000.c (rs6000_xcoff_vec): Likewise.
            (powerpc_xcoff_vec): Likewise.
            * coff-sh.c (sh_coff_small_vec): Likewise.
            (sh_coff_small_le_vec): Likewise.
            * coff-tic30.c (tic30_coff_vec): Likewise.
            * coff-tic54x.c (tic54x_coff0_vec): Likewise.
            (tic54x_coff0_beh_vec): Likewise.
            (tic54x_coff1_vec): Likewise.
            (tic54x_coff1_beh_vec): Likewise.
            (tic54x_coff2_vec): Likewise.
            (tic54x_coff2_beh_vec): Likewise.
            * coff-x86_64.c (TARGET_SYM): Likewise.
            (TARGET_SYM_BIG): Likewise.
            * coff64-rs6000.c (rs6000_xcoff64_vec): Likewise.
            (rs6000_xcoff64_aix_vec): Likewise.
            * coffcode.h (CREATE_BIG_COFF_TARGET_VEC): Likewise.
            (CREATE_BIGHDR_COFF_TARGET_VEC): Likewise.
            (CREATE_LITTLE_COFF_TARGET_VEC): Likewise.
            * elfxx-target.h (TARGET_BIG_SYM): Likewise.
            (TARGET_LITTLE_SYM): Likewise.
            * hppabsd-core.c (core_hppabsd_vec): Likewise.
            * hpux-core.c (core_hpux_vec): Likewise.
            * i386msdos.c (i386_msdos_vec): Likewise.
            * ihex.c (ihex_vec): Likewise.
            * irix-core.c (core_irix_vec): Likewise.
            * mach-o-target.c (TARGET_NAME): Likewise.
            * mmo.c (mmix_mmo_vec): Likewise.
            * netbsd-core.c (core_netbsd_vec): Likewise.
            * osf-core.c (core_osf_vec): Likewise.
            * pdp11.c (MY (vec)): Likewise.
            * pef.c (pef_vec): Likewise.
            (pef_xlib_vec): Likewise.
            * plugin.c (plugin_vec): Likewise.
            * ppcboot.c (powerpc_boot_vec): Likewise.
            * ptrace-core.c (core_ptrace_vec): Likewise.
            * sco5-core.c (core_sco5_vec): Likewise.
            * som.c (hppa_som_vec): Likewise.
            * srec.c (srec_vec): Likewise.
            (symbolsrec_vec): Likewise.
            * tekhex.c (tekhex_vec): Likewise.
            * trad-core.c (core_trad_vec): Likewise.
            * verilog.c (verilog_vec): Likewise.
            * vms-alpha.c (alpha_vms_vec): Likewise.
            * vms-lib.c (alpha_vms_lib_txt_vec): Likewise.
            * wasm-module.c (wasm_vec): Likewise.
            * xsym.c (sym_vec): Likewise.
            * elf.c (ignore_section_sym): Return TRUE if BSF_SECTION_SYM_USED
            isn't set.
            (elf_map_symbols): Don't include ignored section symbols.
            * elfcode.h (elf_slurp_symbol_table): Also set
            BSF_SECTION_SYM_USED on STT_SECTION symbols.
            * elflink.c (bfd_elf_final_link): Generated section symbols only
            when emitting relocations or reqired.
            * elfxx-x86.h (TARGET_KEEP_UNUSED_SECTION_SYMBOLS): New.
            * syms.c (BSF_SECTION_SYM_USED): New.
            * targets.c (TARGET_KEEP_UNUSED_SECTION_SYMBOLS): New.
            (bfd_target): Add keep_unused_section_symbols.
            (bfd_keep_unused_section_symbols): New.
            * bfd-in2.h: Regenerated.
    
    binutils/
    
            PR 27109
            * objcopy.c (copy_object): Handle section symbols for
            non-relocatable inputs.
            * testsuite/binutils-all/readelf.exp (readelf_test): Check
            is_elf_unused_section_symbols.
            * testsuite/binutils-all/readelf.s-64: Updated.
            * testsuite/binutils-all/readelf.ss: Likewise.
            * testsuite/binutils-all/readelf.ss-64: Likewise.
            * testsuite/binutils-all/readelf.s-64-unused: New file.
            * testsuite/binutils-all/readelf.ss-64-unused: Likewise.
            * testsuite/binutils-all/readelf.ss-unused: Likewise.
            * testsuite/lib/binutils-common.exp
            (is_elf_unused_section_symbols): New proc.
    
    gas/ChangeLog:
    
            PR 27109
            * read.c (s_reloc): Call symbol_mark_used_in_reloc on the
            section symbol.
            * subsegs.c (subseg_set_rest): Set BSF_SECTION_SYM_USED if needed.
            * write.c (adjust_reloc_syms): Call symbol_mark_used_in_reloc
            on the section symbol.
            (set_symtab): Don't generate unused section symbols.
            (maybe_generate_build_notes): Call symbol_mark_used_in_reloc
            on the section symbol.
            * config/obj-elf.c (elf_adjust_symtab): Call
            symbol_mark_used_in_reloc on the group signature symbol.
            * testsuite/gas/cfi/cfi-label.d: Remove unused section symbols
            from expected output.
            * testsuite/gas/elf/elf.exp (run_elf_list_test): Check
            is_elf_unused_section_symbols.
            * testsuite/gas/elf/section2.e: Updated.
            * testsuite/gas/elf/section2.e-unused: New file.
            * testsuite/gas/elf/symver.d: Remove unused section symbols.
            * testsuite/gas/i386/ilp32/elf/symver.d: Likewise.
            * testsuite/gas/i386/ilp32/x86-64-size-1.d: Likewise.
            * testsuite/gas/i386/ilp32/x86-64-size-3.d: Likewise.
            * testsuite/gas/i386/ilp32/x86-64-size-5.d: Likewise.
            * testsuite/gas/i386/ilp32/x86-64-unwind.d: Likewise.
            * testsuite/gas/i386/size-1.d: Likewise.
            * testsuite/gas/i386/size-3.d: Likewise.
            * testsuite/gas/i386/svr4.d: Likewise.
            * testsuite/gas/i386/x86-64-size-1.d: Likewise.
            * testsuite/gas/i386/x86-64-size-3.d: Likewise.
            * testsuite/gas/i386/x86-64-size-5.d: Likewise.
            * testsuite/gas/i386/x86-64-unwind.d: Likewise.
    
    ld/
    
            PR 27109
            * testsuite/ld-elf/export-class.sd: Adjust the expected output.
            * testsuite/ld-elf/loadaddr3b.d: Likewise.
            * testsuite/ld-i386/ibt-plt-1.d: Likewise.
            * testsuite/ld-i386/ibt-plt-2a.d: Likewise.
            * testsuite/ld-i386/ibt-plt-2c.d: Likewise.
            * testsuite/ld-i386/ibt-plt-3a.d: Likewise.
            * testsuite/ld-i386/ibt-plt-3c.d: Likewise.
            * testsuite/ld-i386/pr19636-1d.d: Likewise.
            * testsuite/ld-i386/pr19636-1l.d: Likewise.
            * testsuite/ld-i386/pr19636-2c.d: Likewise.
            * testsuite/ld-ifunc/ifunc-2-i386-now.d: Likewise.
            * testsuite/ld-ifunc/ifunc-2-local-i386-now.d: Likewise.
            * testsuite/ld-ifunc/ifunc-2-local-x86-64-now.d: Likewise.
            * testsuite/ld-ifunc/ifunc-2-x86-64-now.d: Likewise.
            * testsuite/ld-ifunc/ifunc-21-x86-64.d: Likewise.
            * testsuite/ld-ifunc/ifunc-22-x86-64.d: Likewise.
            * testsuite/ld-ifunc/pr17154-i386-now.d: Likewise.
            * testsuite/ld-ifunc/pr17154-i386.d: Likewise.
            * testsuite/ld-ifunc/pr17154-x86-64-now.d: Likewise.
            * testsuite/ld-ifunc/pr17154-x86-64.d: Likewise.
            * testsuite/ld-x86-64/bnd-branch-1-now.d: Likewise.
            * testsuite/ld-x86-64/bnd-ifunc-1-now.d: Likewise.
            * testsuite/ld-x86-64/bnd-ifunc-2-now.d: Likewise.
            * testsuite/ld-x86-64/bnd-ifunc-2.d: Likewise.
            * testsuite/ld-x86-64/bnd-plt-1-now.d: Likewise.
            * testsuite/ld-x86-64/bnd-plt-1.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-1-x32.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-1.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-2a-x32.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-2a.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-2c-x32.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-2c.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-3a-x32.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-3a.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-3c-x32.d: Likewise.
            * testsuite/ld-x86-64/ibt-plt-3c.d: Likewise.
            * testsuite/ld-x86-64/pr19609-4e.d: Likewise.
            * testsuite/ld-x86-64/pr19609-6a.d: Likewise.
            * testsuite/ld-x86-64/pr19609-6b.d: Likewise.
            * testsuite/ld-x86-64/pr19609-7b.d: Likewise.
            * testsuite/ld-x86-64/pr19609-7d.d: Likewise.
            * testsuite/ld-x86-64/pr19636-2l.d: Likewise.
            * testsuite/ld-x86-64/pr20253-1d.d: Likewise.
            * testsuite/ld-x86-64/pr20253-1h.d: Likewise.
            * testsuite/ld-x86-64/pr21038b-now.d: Likewise.
            * testsuite/ld-x86-64/pr21038b.d: Likewise.
            * testsuite/ld-x86-64/pr21038c-now.d: Likewise.
            * testsuite/ld-x86-64/pr21038c.d: Likewise.
            * testsuite/ld-x86-64/pr23854.d: Likewise.
            * testsuite/ld-x86-64/pr25416-3.d: Likewise.
            * testsuite/ld-x86-64/pr25416-4.d: Likewise.
            * testsuite/ld-i386/plt-pic.pd: Likewise.
            * testsuite/ld-i386/plt-pic2.dd: Likewise.
            * testsuite/ld-i386/plt.pd: Likewise.
            * testsuite/ld-i386/plt2.dd: Likewise.
            * testsuite/ld-i386/tlsbin.rd: Likewise.
            * testsuite/ld-i386/tlsbin2.rd: Likewise.
            * testsuite/ld-i386/tlsbindesc.rd: Likewise.
            * testsuite/ld-i386/tlsdesc.rd: Likewise.
            * testsuite/ld-i386/tlsgdesc.rd: Likewise.
            * testsuite/ld-i386/tlsnopic.rd: Likewise.
            * testsuite/ld-i386/tlspic.rd: Likewise.
            * testsuite/ld-i386/tlspic2.rd: Likewise.
            * testsuite/ld-x86-64/mpx3.dd: Likewise.
            * testsuite/ld-x86-64/mpx3n.dd: Likewise.
            * testsuite/ld-x86-64/mpx4.dd: Likewise.
            * testsuite/ld-x86-64/mpx4n.dd: Likewise.
            * testsuite/ld-x86-64/pe-x86-64-1.od: Likewise.
            * testsuite/ld-x86-64/pe-x86-64-2.od: Likewise.
            * testsuite/ld-x86-64/pe-x86-64-3.od: Likewise.
            * testsuite/ld-x86-64/pe-x86-64-4.od: Likewise.
            * testsuite/ld-x86-64/plt.pd: Likewise.
            * testsuite/ld-x86-64/plt2.dd: Likewise.
            * testsuite/ld-x86-64/tlsbin.rd: Likewise.
            * testsuite/ld-x86-64/tlsbin2.rd: Likewise.
            * testsuite/ld-x86-64/tlsbindesc.rd: Likewise.
            * testsuite/ld-x86-64/tlsdesc.rd: Likewise.
            * testsuite/ld-x86-64/tlsgdesc.rd: Likewise.
            * testsuite/ld-x86-64/tlspic.rd: Likewise.
            * testsuite/ld-x86-64/tlspic2.rd: Likewise.
            * testsuite/ld-elf/sec64k.exp: Check
            is_elf_unused_section_symbols.
Comment 3 H.J. Lu 2021-01-07 14:48:21 UTC
Fixed for x86 so far.