diff --git a/lld/MachO/SyntheticSections.cpp b/lld/MachO/SyntheticSections.cpp --- a/lld/MachO/SyntheticSections.cpp +++ b/lld/MachO/SyntheticSections.cpp @@ -148,8 +148,8 @@ os << static_cast(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM | dysym.file->ordinal); } else { - error("TODO: Support larger dylib symbol ordinals"); - return; + os << static_cast(MachO::BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB); + encodeULEB128(dysym.file->ordinal, os); } lastBinding.ordinal = dysym.file->ordinal; } @@ -348,11 +348,13 @@ uint64_t offset = in.lazyPointers->addr - dataSeg->firstSection()->addr + sym.stubsIndex * WordSize; encodeULEB128(offset, os); - if (sym.file->ordinal <= MachO::BIND_IMMEDIATE_MASK) + if (sym.file->ordinal <= MachO::BIND_IMMEDIATE_MASK) { os << static_cast(MachO::BIND_OPCODE_SET_DYLIB_ORDINAL_IMM | sym.file->ordinal); - else - fatal("TODO: Support larger dylib symbol ordinals"); + } else { + os << static_cast(MachO::BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB); + encodeULEB128(sym.file->ordinal, os); + } os << static_cast(MachO::BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM) << sym.getName() << '\0'