bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug gold/22448] New: Undefined symbol in both shared library and plugin


From: sjc+binutils_bugzilla at immunant dot com
Subject: [Bug gold/22448] New: Undefined symbol in both shared library and plugin-added object does not trigger archive rescan
Date: Fri, 17 Nov 2017 01:18:48 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=22448

            Bug ID: 22448
           Summary: Undefined symbol in both shared library and
                    plugin-added object does not trigger archive rescan
           Product: binutils
           Version: 2.30 (HEAD)
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: gold
          Assignee: ccoutant at gmail dot com
          Reporter: sjc+binutils_bugzilla at immunant dot com
                CC: ian at airs dot com
  Target Milestone: ---

Created attachment 10604
  --> https://sourceware.org/bugzilla/attachment.cgi?id=10604&action=edit
archive containing dso1.c, dso2.c, and lto.c

Background: Clang adds calls to __mulodi4 for trapping long long multiplies
when building with -ftrapv on 32-bit platforms. This call is added during LTO
compilation, so the symbol is undefined only when the LTO plugin adds the newly
compiled object.

If a shared library contains an undefined symbol and the LTO plugin adds a
reference to that undefined symbol in a new object, the newly undefined symbol
does not properly trigger a rescan of the archives to attempt to resolve the
symbol.


There are probably easier ways to reproduce, but the basic requirement is that
LTO adds a call to a previously unseen symbol. To reproduce this bug the way I
did using a stock clang and LLVM LTO plugin, you will need an archive
containing the implementation of __mulodi4 (found in clang's compiler-rt
builtins). In the following instructions I call this archive
libcompiler_rt-extras.a since that's what is available in AOSP. Build the
attached source file archive as follows for 32-bit x86 (can also reproduce on
32-bit ARM):

Build libdso1.so, which will contain an implementation of __mulodi4:
  clang dso1.c -c -ftrapv -m32
  clang dso1.o libcompiler_rt-extras.a -o libdso1.so -shared -ftrapv
-Wl,-no-undefined -fuse-ld=gold -m32

  readelf -s libdso1.so | grep mulodi4
     6: 00000570   265 FUNC    GLOBAL DEFAULT   11 __mulodi4                    
    43: 00000570   265 FUNC    GLOBAL DEFAULT   11 __mulodi4

Build libdso2.so, which does _not_ contain an implementation of __mulodi4 and
links against the implementation in libdso1.so:
  clang dso2.c -c -ftrapv -m32
  clang dso2.o libdso1.so -o libdso2.so -shared -ftrapv -Wl,-no-undefined
-fuse-ld=gold -m32

  readelf -s libdso2.so | grep mulodi4
     2: 00000000     0 FUNC    GLOBAL DEFAULT  UND __mulodi4                    
    20: 00000000     0 FUNC    GLOBAL DEFAULT  UND __mulodi4

Build liblto.so, which will fail to link:
  clang lto.c -c -flto -ftrapv -m32
  clang lto.o libcompiler_rt-extras.a libdso2.so -o liblto.so -shared -ftrapv
-flto -Wl,-no-undefined -fuse-ld=gold -m32

    /tmp/lto-llvm-3b7070.o:ld-temp.o:function lto: error: undefined reference
to '__mulodi4'

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]