Skip to content

[SR-1023] Build Error: Relocation R_X86_64_PC32 #43635

Description

@swift-ci
Previous ID SR-1023
Radar None
Original Reporter rlovelett (JIRA User)
Type Bug
Status Closed
Resolution Done

Attachment: Download

Environment

Arch Linux (4.4.5-1-ARCH)
Clang version 3.7.1 (tags/RELEASE_371/final)
GNU ld (GNU Binutils) 2.26.0.20160302

Additional Detail from JIRA
Votes 4
Component/s
Labels Bug
Assignee rlovelett (JIRA)
Priority Medium

md5: 887c0afbe82cca6279b355238f4a2f89

is duplicated by:

  • SR-1294 Ubuntu 16.04 swift fails to link: protected relocation issue

relates to:

  • SR-1316 swift-package-manager link doesn't seem to respect the gold linker flag on Ubuntu

Issue Description:

Linking libswiftCore.so using binutils 2.26 fails during the relocation of a protected symbol. This issue is not present in 2.25 of binutils.

[511/536] Linking CXX shared library lib/swift/linux/x86_64/libswiftCore.so
FAILED: : && /usr/bin/clang++  -fPIC -fno-stack-protector -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Werror=date-time -std=c++11 -fcolor-diagnostics -ffunction-sections -fdata-sections -Wdocumentation -Wimplicit-fallthrough -Wunreachable-code -Woverloaded-virtual -O3  -Wl,-z,defs   -target x86_64-unknown-linux-gnu -isysroot / -lpthread -ldl  -L/home/ryan/build/Ninja-ReleaseAssert/swift-linux-x86_64/./lib/swift/linux/x86_64 -L/home/ryan/build/Ninja-ReleaseAssert/swift-linux-x86_64/./bin/../lib/swift/linux/x86_64 -L/home/ryan/build/Ninja-ReleaseAssert/swift-linux-x86_64/./bin/../lib/swift/linux -shared -Wl,-soname,libswiftCore.so -o lib/swift/linux/x86_64/libswiftCore.so lib/swift/linux/x86_64/swift_begin.o stdlib/public/core/linux/x86_64/Swift.o lib/swift/linux/x86_64/swift_end.o -L/home/ryan/build/Ninja-ReleaseAssert/llvm-linux-x86_64/lib  -L/home/ryan/build/Ninja-ReleaseAssert/llvm-linux-x86_64/./lib lib/swift/linux/x86_64/libswiftRuntime.a lib/swift/linux/x86_64/libswiftStdlibStubs.a -licuuc -licui18n -lbsd -Wl,-rpath,"\$ORIGIN:/usr/lib/swift/linux" && :
/usr/bin/ld: stdlib/public/core/linux/x86_64/Swift.o: relocation R_X86_64_PC32 against protected symbol `_TMPSa' can not be used when making a shared object
/usr/bin/ld: final link failed: Bad value

Using git bisect I was able to determine the commit that introduced the behavior of binutils between 2.25 and 2.26 to be ca3fe95e469b9daec153caa2c90665f5daaec2b5.

ca3fe95e469b9daec153caa2c90665f5daaec2b5 is the first bad commit
commit ca3fe95e469b9daec153caa2c90665f5daaec2b5
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Mar 5 06:34:39 2015 -0800

    Add extern_protected_data and set it for x86
    
    With copy relocation, address of protected data defined in the shared
    library may be external.  This patch adds extern_protected_data and
    changes _bfd_elf_symbol_refs_local_p to return false for protected data
    if extern_protected_data is true.
    
    bfd/
    
        PR ld/pr15228
        PR ld/pr17709
        * elf-bfd.h (elf_backend_data): Add extern_protected_data.
        * elf32-i386.c (elf_backend_extern_protected_data): New.
        Defined to 1.
        * elf64-x86-64.c (elf_backend_extern_protected_data): Likewise.
        * elflink.c (_bfd_elf_adjust_dynamic_copy): Don't error on
        copy relocs against protected symbols if extern_protected_data
        is true.
        (_bfd_elf_symbol_refs_local_p): Don't return true on protected
        non-function symbols if extern_protected_data is true.
        * elfxx-target.h (elf_backend_extern_protected_data): New.
        Default to 0.
        (elfNN_bed): Initialize extern_protected_data with
        elf_backend_extern_protected_data.
    
    ld/testsuite/
    
        PR ld/pr15228
        PR ld/pr17709
        * ld-i386/i386.exp (i386tests): Add a test for PR ld/17709.
        * ld-i386/pr17709-nacl.rd: New file.
        * ld-i386/pr17709.rd: Likewise.
        * ld-i386/pr17709a.s: Likewise.
        * ld-i386/pr17709b.s: Likewise.
        * ld-i386/protected3.d: Updated.
        * ld-i386/protected3.s: Likewise.
        * ld-x86-64/pr17709-nacl.rd: New file.
        * ld-x86-64/pr17709.rd: Likewise.
        * ld-x86-64/pr17709a.s: Likewise.
        * ld-x86-64/pr17709b.s: Likewise.
        * ld-x86-64/protected3.d: Updated.
        * ld-x86-64/protected3.s: Likewise.
        * ld-x86-64/x86-64.exp (x86_64tests): Add a test for PR ld/17709.

:040000 040000 7fc861c288f9bed44c6444d1b04e2f6e688aeeaf fca3f6ce979e7c00ed44c04f506880015235806d M  bfd
:040000 040000 a5e358abb99b2b4089765f16904f9ebc496c0f12 7ccba1e77448a0155e56e8155073b40804b00daa M  ld

To perform the bisect I used 2bd25930221dea4bf33c13a89c111514491440e2 as the last known good commit and 71090e7a9dde8d28ff5c4b44d6d83e270d1088e4 as the last known bad commit.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugA deviation from expected or documented behavior. Also: expected but undesirable behavior.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions