Quuxplusone / LLVMBugzillaTest

0 stars 0 forks source link

"32-bit RIP relative reference out of range" error when linking large binary with code coverage instrumentation on macOS #34674

Open Quuxplusone opened 6 years ago

Quuxplusone commented 6 years ago
Bugzilla Link PR35701
Status NEW
Importance P enhancement
Reported by Max Moroz (mmoroz@chromium.org)
Reported on 2017-12-19 14:12:04 -0800
Last modified on 2018-01-20 10:28:26 -0800
Version unspecified
Hardware PC Linux
CC efriedma@quicinc.com, kcc@google.com, llvm-bugs@lists.llvm.org, vsk@apple.com
Fixed by commit(s)
Attachments
Blocks
Blocked by
See also
We're getting the following error while building a large binary on macOS with
code coverage instrumentation:

FAILED: v8_context_snapshot_generator
export DEVELOPER_DIR=/Users/liaoyuke/chromium/src/build/mac_files/Xcode.app;
TOOL_VERSION=1505258040 ../../build/toolchain/mac/linker_driver.py
../../third_party/llvm-build/Release+Asserts/bin/clang++  -stdlib=libc++ -arch
x86_64 -segprot PROTECTED_MEMORY rw r -Werror -isysroot
../../build/mac_files/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk
-mmacosx-version-min=10.9.0 -fprofile-instr-generate -Wl,-ObjC -
L../../build/mac_files/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/lib
-o "./v8_context_snapshot_generator" -Wl,-
filelist,"./v8_context_snapshot_generator.rsp"  -framework Cocoa -framework
Foundation -framework IOKit -framework Security -framework SystemConfiguration -
framework CoreFoundation -framework ApplicationServices -framework AppKit -lbsm
-framework CFNetwork -framework CoreServices -lresolv -framework CoreGraphics -
framework CoreText -framework Accelerate -framework AudioUnit -framework Carbon
-framework CoreVideo -framework IOSurface -framework AudioToolbox -framework
CoreAudio -framework OpenGL -framework Quartz -framework AVFoundation -
framework CoreMedia -framework VideoToolbox -framework QuartzCore -framework
DiskArbitration -lsandbox -framework IOBluetooth
final section layout:
    __TEXT/__text addr=0x100002900, size=0x1025492D, fileOffset=0x00002900, type=1
    __TEXT/__stubs addr=0x11025722E, size=0x00001926, fileOffset=0x1025722E, type=28
    __TEXT/__stub_helper addr=0x110258B54, size=0x000029BE, fileOffset=0x10258B54, type=32
    __TEXT/__cstring addr=0x11025B520, size=0x003FFBCC, fileOffset=0x1025B520, type=13
    __TEXT/__const addr=0x11065B100, size=0x0024D228, fileOffset=0x1065B100, type=0
    __TEXT/__ustring addr=0x1108A8328, size=0x00000D78, fileOffset=0x108A8328, type=16
    __TEXT/__gcc_except_tab addr=0x1108A90A0, size=0x0001168C, fileOffset=0x108A90A0, type=0
    __TEXT/__objc_methname addr=0x1108BA72C, size=0x00005A97, fileOffset=0x108BA72C, type=14
    __TEXT/__objc_classname addr=0x1108C01C3, size=0x000006F5, fileOffset=0x108C01C3, type=14
    __TEXT/__objc_methtype addr=0x1108C08B8, size=0x0000F655, fileOffset=0x108C08B8, type=14
    __TEXT/__unwind_info addr=0x1108CFF10, size=0x000463B0, fileOffset=0x108CFF10, type=22
    __TEXT/__eh_frame addr=0x1109162C0, size=0x00045CF0, fileOffset=0x109162C0, type=19
    __DATA/__nl_symbol_ptr addr=0x11095C000, size=0x00000010, fileOffset=0x1095C000, type=29
    __DATA/__got addr=0x11095C010, size=0x00000CF0, fileOffset=0x1095C010, type=29
    __DATA/__la_symbol_ptr addr=0x11095CD00, size=0x00002188, fileOffset=0x1095CD00, type=27
    __DATA/__mod_init_func addr=0x11095EE88, size=0x00000088, fileOffset=0x1095EE88, type=33
    __DATA/__const addr=0x11095EF20, size=0x00264230, fileOffset=0x1095EF20, type=0
    __DATA/__cfstring addr=0x110BC3150, size=0x00000F60, fileOffset=0x10BC3150, type=17
    __DATA/__objc_classlist addr=0x110BC40B0, size=0x00000190, fileOffset=0x10BC40B0, type=0
    __DATA/__objc_catlist addr=0x110BC4240, size=0x00000078, fileOffset=0x10BC4240, type=24
    __DATA/__objc_protolist addr=0x110BC42B8, size=0x00000068, fileOffset=0x10BC42B8, type=0
    __DATA/__objc_imageinfo addr=0x110BC4320, size=0x00000008, fileOffset=0x10BC4320, type=0
    __DATA/__objc_const addr=0x110BC4328, size=0x00007368, fileOffset=0x10BC4328, type=0
    __DATA/__objc_selrefs addr=0x110BCB690, size=0x00001980, fileOffset=0x10BCB690, type=15
    __DATA/__objc_protorefs addr=0x110BCD010, size=0x00000020, fileOffset=0x10BCD010, type=0
    __DATA/__objc_classrefs addr=0x110BCD030, size=0x00000348, fileOffset=0x10BCD030, type=23
    __DATA/__objc_superrefs addr=0x110BCD378, size=0x00000130, fileOffset=0x10BCD378, type=0
    __DATA/__objc_ivar addr=0x110BCD4A8, size=0x00000310, fileOffset=0x10BCD4A8, type=0
    __DATA/__objc_data addr=0x110BCD7B8, size=0x00000FA0, fileOffset=0x10BCD7B8, type=0
    __DATA/__data addr=0x110BCE760, size=0x000FBDD0, fileOffset=0x10BCE760, type=0
    __DATA/__llvm_prf_cnts addr=0x110CCA530, size=0x00F7C958, fileOffset=0x10CCA530, type=0
    __DATA/__llvm_prf_data addr=0x111C46E88, size=0x029A2EE0, fileOffset=0x11C46E88, type=0
    __DATA/__llvm_prf_names addr=0x1145E9D70, size=0x280817B6, fileOffset=0x145E9D70, type=0
    __DATA/__thread_vars addr=0x13C66B528, size=0x00000030, fileOffset=0x3C66B528, type=38
    __DATA/crashpad_info addr=0x13C66B558, size=0x00000038, fileOffset=0x3C66B558, type=0
    __DATA/__llvm_prf_vnds addr=0x13C66B590, size=0x00006000, fileOffset=0x3C66B590, type=0
    __DATA/__thread_data addr=0x13C671590, size=0x00000010, fileOffset=0x3C671590, type=40
    __DATA/__thread_bss addr=0x13C6715A0, size=0x00000004, fileOffset=0x00000000, type=39
    __DATA/__bss addr=0x13C6715B0, size=0x000AF07C, fileOffset=0x00000000, type=25
    __DATA/__common addr=0x13C720640, size=0x00087F3C, fileOffset=0x00000000, type=25
    __DATA/__huge addr=0x13C7A857C, size=0x00000000, fileOffset=0x00000000, type=25
    __LLVM_COV/__llvm_covmap addr=0x13C7A9000, size=0x76810924, fileOffset=0x3C672000, type=0
    PROTECTED_MEMORY/protected_memory addr=0x1B2FBA000, size=0x00000010, fileOffset=0xB2E83000, type=0
ld: 32-bit RIP relative reference out of range (2845947809 max is +/-4GB): from
__ZN2gl23SetGLGetProcAddressProcEPFPFvvEPKcE (0x10959E780) to
__ZN2gl12_GLOBAL__N_118g_get_proc_addressE (0x1B2FBA008) in
'__ZN2gl23SetGLGetProcAddressProcEPFPFvvEPKcE' from
obj/ui/gl/libgl_wrapper.a(gl_implementation.o) for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Is there anything we can do to avoid that issue? As I understand, __llvm_covmap
referenced are RIP relative, but is it really necessary? The same binary links
successfully on Linux, even though __llvm_covmap section is even larger over
there.
Quuxplusone commented 6 years ago

Vedant, I wonder if you ever run into a similar issue?

Quuxplusone commented 6 years ago

Darwin doesn't support the large code model and the coverage mapping data is too big.

Nothing should be accessing llvm_covmap (it's read-only). The problem is that the covmap section is sandwiched between sections A and B, and A has a RIP-relative reference to a symbol in B. I.e, you should be able to hack past this problem by using linker magic to move the PROTECTED_MEMORY segment before LLVM_COV.

A better solution might be to make the covmap data smaller :). I tried doing this by teaching llvm to GC bits of profile metadata and by moving __LLVM_COV after all the other sections. That was enough to unblock our adopters but it's clearly not enough for Chromium. I've outlined what I think is a workable plan here but won't have time to get to it until late January (probably): https://bugs.llvm.org/show_bug.cgi?id=34533

Quuxplusone commented 6 years ago

I think this issue doesn't show up on Linux because the __llvm_covmap section isn't allocatable; see https://reviews.llvm.org/rL257781.

Of course, the very large covmap section leads to other problems.

Quuxplusone commented 6 years ago

Right, IIRC MachO doesn't have a similar flag which can mark sections non-allocable.

Quuxplusone commented 6 years ago

Thank you for the answers! That makes sense, we'll try to move PROTECTED_MEMORY segment before __LLVM_COV.