[llvm-dev] Problems generating Mach-O File (x86_64 , osx 10.12)

Patricio Villalobos via llvm-dev llvm-dev at lists.llvm.org
Mon Jul 10 08:36:19 PDT 2017

I discovered that lld for darwin is generating the wrong code for lazy
bindings in the __stub_helper section (at least for osx 10.12). This is the
way i can reproduce this problem, using this program:


#include <stdio.h>

int main(int argc, char **argv) {
    printf("C: printf!\n");
    puts("C: puts!\n");
    return 0;

Then I link it using i have tested it in 3.9, 4.0 and 4.1 versions:

clang -c hello.c
lld -flavor darwin hello.o -o h1  -lc

When i execute the binary h1 the system gives me the following error:

C: printf!
dyld: lazy symbol binding failed: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
has segment 4 which is too large (0..3)
dyld: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB has segment 4 which is too
large (0..3)
Trace/BPT trap: 5

Investigating the code, it seems that the problem is that the asm code
generated in the file StubPass.cpp, specifically in the line 323
it adds, what it seems an arbitrary number (12) to the offset into the lazy
bind opcodes section, but it should be calculated depending on the
MachONormalizedFileBinaryWrite::lazyBindingInfo result.

I confirmed this bug by patching the code manually in the binary and
writing the right offset in the asm code (__stub_helper). I'm yet not
familiarized with the code , so i can't fix it right now , Im unable to
find the information of the symbols that
MachONormalizedFileBinaryWrite::buildLazyBindInfo has ,since is generated
after the pass.

I'll be glad to receive guidance so i can fix it myself and familiarize
myself with the code.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170710/709f065d/attachment.html>

More information about the llvm-dev mailing list