[Bug 232176] elftoolchain elfcopy/strip incorrectly strips relocations

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Thu Oct 11 12:57:07 UTC 2018


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=232176

            Bug ID: 232176
           Summary: elftoolchain elfcopy/strip incorrectly strips
                    relocations
           Product: Base System
           Version: CURRENT
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: bin
          Assignee: bugs at FreeBSD.org
          Reporter: emaste at freebsd.org
            Blocks: 231882

When using ifuncs in static binaries we'll have R_X86_64_IRELATIVE relocations
in .rela.plt:

nuc% readelf -r ifunc_reproducer/make.full 

Relocation section with addend (.rela.plt):
r_offset     r_info       r_type              st_value         st_name +
r_addend
0000002edaa0 000000000025 R_X86_64_IRELATIVE  0000000000000000  + 2e91f0

Relevant sections:

% readelf -S ifunc_reproducer/make.full 
There are 36 section headers, starting at offset 0x434420:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 3] .rela.plt         RELA             00000000002181a0  000181a0
       0000000000000018  0000000000000018   A      33    11     8
  [ 9] .plt              PROGBITS         00000000002e9c20  000e9c20
       0000000000000010  0000000000000000  AX       0     0     16
  [11] .got.plt          PROGBITS         00000000002edaa0  000edaa0
       0000000000000008  0000000000000000  WA       0     0     8
  [33] .symtab           SYMTAB           0000000000000000  004148f8
       0000000000012d38  0000000000000018          35   1582     8
  [34] .shstrtab         STRTAB           0000000000000000  00427630
       000000000000016f  0000000000000000           0     0     1
  [35] .strtab           STRTAB           0000000000000000  0042779f
       000000000000cc7b  0000000000000000           0     0     1

Stripping with objcopy:
% objcopy --strip-all ifunc_reproducer/make.full make.stripped

results in a broken binary:
% ./make.stripped
<jemalloc>: jemalloc_arena.c:230: Failed assertion:
"!bitmap_full(slab_data->bitmap, &bin_info->bitmap_info)"
zsh: abort (core dumped)  ./make.stripped

because the relocation has been removed:
% readelf -r make.stripped

Relocation section with addend (.rela.plt):
r_offset     r_info       r_type              st_value         st_name +
r_addend

Due to this snippet in elfcopy/sections.c::filter_reloc()
        /* We don't want to touch relocation info for dynamic symbols. */
        if ((ecp->flags & SYMTAB_EXIST) == 0) {
                if (ish.sh_link == 0 || ecp->secndx[ish.sh_link] == 0) {
                        /*
                         * This reloc section applies to the symbol table
                         * that was stripped, so discard whole section.
                         */
                        s->nocopy = 1;
                        s->sz = 0;
                }
                return;

This is invalid - we can remove the reloc section if the section to which it
refers is being stripped, as in create_scn():

                if (ish.sh_type == SHT_REL || ish.sh_type == SHT_RELA)
                        if (ish.sh_info != 0 &&
                            is_remove_reloc_sec(ecp, ish.sh_info))
                                continue;

but removing based on the string table results in broken output.


Referenced Bugs:

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=231882
[Bug 231882] multiple toolchain issues with statically linked binaries
-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-bugs mailing list