[llvm-bugs] [Bug 42052] New: Bad interaction with llvm-objcopy + gold

via llvm-bugs llvm-bugs at lists.llvm.org
Tue May 28 21:46:33 PDT 2019


https://bugs.llvm.org/show_bug.cgi?id=42052

            Bug ID: 42052
           Summary: Bad interaction with llvm-objcopy + gold
           Product: tools
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: llvm-objcopy/strip
          Assignee: unassignedbugs at nondot.org
          Reporter: rupprecht at google.com
                CC: alexander.v.shaposhnikov at gmail.com,
                    jake.h.ehrlich at gmail.com,
                    jh7370.2008 at my.bristol.ac.uk,
                    llvm-bugs at lists.llvm.org, rupprecht at google.com

Before llvm-objcopy writes out, it sorts sections by offset:
https://github.com/llvm/llvm-project/blob/master/llvm/tools/llvm-objcopy/ELF/Object.cpp#L1480

However, gold expects that the index of section groups is smaller than the
indices of sections that it contains:
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gold/object.cc;h=689448f50c8a784d1142032875203ffc1d28661f;hb=HEAD#l1090

This does seem to be required by the ELF spec: "The section header table entry
for a group section must appear in the section header table before the entries
for any of the sections that are members of the group." Only gold complains
though -- ld and lld work fine (accepting invalid ELF, I guess).

Because llvm-objcopy only looks at the offsets, if an SHT_GROUP section has a
greater offset than the sections it contains (while still having the section
header come first), llvm-objcopy can rearrange it into an invalid ordering.

Small-ish repro:
$ cat repro.cc
#include <string>
std::string foo(std::string x) { return x + x; }
int main() {
  foo("x");
  return 0;
}

# Normal link w/ gold (passes)
$ clang++ -c group.cc -o /tmp/group.o
$ clang++ -fuse-ld=gold -o /tmp/group /tmp/group.o

# Invoke GNU objcopy & link w/ gold (passes)
$ objcopy /tmp/group.o /tmp/group.gnu.o
$ clang++ -fuse-ld=gold -o /tmp/group /tmp/group.gnu.o

# Invoke llvm-objcopy & link w/ gold (fails)
$ llvm-objcopy /tmp/group.o /tmp/group.llvm.o
$ clang++ -fuse-ld=gold -o /tmp/group /tmp/group.llvm.o
/usr/bin/ld.gold: error: /tmp/group.llvm.o: invalid section group 8 refers to
earlier section 2

The simplest thing is probably to change that comparator to always put
SHT_GROUP first, which I believe is effectively what GNU objcopy does.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20190529/cdaab376/attachment.html>


More information about the llvm-bugs mailing list