<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/139439>139439</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            lld: offset is outside the section
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            lld,
            lld:MachO
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          dianqk
      </td>
    </tr>
</table>

<pre>
    The following code fails to link on x86_64-apple-darwin:

```cpp
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <iostream>

// Helper to disable optimizations around a value.
static int black_box(int x) {
    volatile int temp = x;
    asm volatile("" ::: "memory");
 return temp;
}

__attribute__((noinline))
int slice_len_from_ptr_end(const char* ptr, const char* end) {
    return black_box(end - ptr);
}

static int slice_len(const char* ptr, int len) {
    const char* end = ptr + len;
    return slice_len_from_ptr_end(ptr, end);
}

__attribute__((noinline))
void non_trivial_destructor() {
 asm volatile("" ::: "memory");
}

struct NonTrivialDestructor {
 ~NonTrivialDestructor() {
        non_trivial_destructor();
 }
};

__attribute__((noinline))
int broken(int version) {
 NonTrivialDestructor _has_drop;

    switch (version) {
        case 1:
 return slice_len("aaaaaaa", 8);
        case 2:
 return slice_len("bbbbbbb", 8);
        case 3:
            return slice_len("bbbbbbb", 8);
        default:
            return 42;
 }
}

int main() {
    // Should return 8, unexpectedly returns 0 with old linker.
    return broken(2);
}
```

(from https://github.com/rust-lang/rust/issues/140686#issuecomment-2864544434 cc @madsmtm)

output:
```bash
$ clang++ main.cpp -O1 -target x86_64-apple-darwin -fuse-ld=lld
ld64.lld: warning: directory not found for option -L/usr/local/lib
ld64.lld: error: /var/folders/3_/gbxrlh2d7mq4gcvmny3pjzvc0000gn/T/main-2dec97.o:(__cstring): offset is outside the section
clang: error: linker command failed with exit code 1 (use -v to see invocation)

$ clang++ --version
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: arm64-apple-darwin23.2.0
Thread model: posix
InstalledDir: /Applications/Xcode-15.4.0.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ ld64.lld --version
LLD 20.1.4
```

Here is a simpler IR:

```llvm
@L1 = private constant [1 x i8] zeroinitializer, align 1
@L2 = private unnamed_addr constant [8 x i8] c"\01\02\03\04\05\06\07\08", align 1
@L3 = private constant [1 x i8] c"\09", align 1
@reltable.broken = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @L1 to i64), i64 ptrtoint (ptr @reltable.broken to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @L2 to i64), i64 ptrtoint (ptr @reltable.broken to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @L3 to i64), i64 ptrtoint (ptr @reltable.broken to i64)) to i32)], align 4
@reltable.broken.1 = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds ([1 x i8], ptr @L1, i64 1, i64 0) to i64), i64 ptrtoint (ptr @reltable.broken.1 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds ([8 x i8], ptr @L2, i64 1, i64 0) to i64), i64 ptrtoint (ptr @reltable.broken.1 to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds ([1 x i8], ptr @L3, i64 1, i64 0) to i64), i64 ptrtoint (ptr @reltable.broken.1 to i64)) to i32)], align 4

define i64 @broken(i64 noundef %0) {
  %reltable.shift = shl i64 %0, 2
  %2 = getelementptr i8, ptr @reltable.broken, i64 %reltable.shift
  %3 = load i32, ptr %2, align 4
  %4 = getelementptr i8, ptr @reltable.broken, i32 %3
  %5 = getelementptr i8, ptr @reltable.broken.1, i64 %reltable.shift
  %6 = load i32, ptr %5, align 4
 %7 = getelementptr i8, ptr @reltable.broken.1, i32 %6
  %8 = tail call i64 @slice_len_from_ptr_end(ptr noundef nonnull %4, ptr noundef nonnull %7)
 ret i64 %8
}

declare i64 @slice_len_from_ptr_end(ptr noundef, ptr noundef)
```
output:
```shell
clang foo.ll -shared -undefined dynamic_lookup -target x86_64-apple-darwin -fuse-ld=lld
warning: overriding the module target triple with x86_64-apple-macosx14.0.0 [-Woverride-module]
1 warning generated.
ld64.lld: warning: directory not found for option -L/usr/local/lib
out_of_range was thrown in -fno-exceptions mode with message "unordered_map::at: key not found"PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
 #0 0x000000010c3fb694 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/nix/store/0r3i5hld2830wvjrpzmf9nww7vqljad6-llvm-20.1.4-lib/lib/libLLVM.dylib+0x16b694)
 #1 0x000000010c3f9608 llvm::sys::RunSignalHandlers() (/nix/store/0r3i5hld2830wvjrpzmf9nww7vqljad6-llvm-20.1.4-lib/lib/libLLVM.dylib+0x169608)
 #2 0x000000010c3fbde8 SignalHandler(int) (/nix/store/0r3i5hld2830wvjrpzmf9nww7vqljad6-llvm-20.1.4-lib/lib/libLLVM.dylib+0x16bde8)
 #3 0x00000001884c9a24 (/usr/lib/system/libsystem_platform.dylib+0x18046da24)
 #4 0x0000000188499cc0 (/usr/lib/system/libsystem_pthread.dylib+0x18043dcc0)
 #5 0x00000001883a5a40 (/usr/lib/system/libsystem_c.dylib+0x180349a40)
 #6 0x000000010366ecf0 std::__1::__cxx_atomic_notify_one(void const volatile*) (/nix/store/qh3kz2ywxgq1fl4ngkbav298nmgybnaq-libcxx-19.1.7/lib/libc++.1.0.dylib+0x2acf0)
 #7 0x0000000102afc0a4 std::__1::__function::__func<lld::coff::LinkerDriver::linkerMain(llvm::ArrayRef<char const*>)::$_5, std::__1::allocator<lld::coff::LinkerDriver::linkerMain(llvm::ArrayRef<char const*>)::$_5>, void (lld::coff::SymbolTable&)>::~__func() (/nix/store/caj11qkzv4rgl695lk39c3kjyjd85cfw-lld-20.1.4/bin/ld64.lld+0x10005c0a4)
 #8 0x0000000102dc037c lld::macho::isCodeSection(lld::macho::InputSection const*) (/nix/store/caj11qkzv4rgl695lk39c3kjyjd85cfw-lld-20.1.4/bin/ld64.lld+0x10032037c)
 #9 0x0000000102dc00c8 lld::macho::WordLiteralInputSection::getOffset(unsigned long long) const (/nix/store/caj11qkzv4rgl695lk39c3kjyjd85cfw-lld-20.1.4/bin/ld64.lld+0x1003200c8)
#10 0x0000000102dbeffc lld::macho::ConcatInputSection::writeTo(unsigned char*) (/nix/store/caj11qkzv4rgl695lk39c3kjyjd85cfw-lld-20.1.4/bin/ld64.lld+0x10031effc)
#11 0x0000000102d84308 lld::macho::TextOutputSection::writeTo(unsigned char*) const (/nix/store/caj11qkzv4rgl695lk39c3kjyjd85cfw-lld-20.1.4/bin/ld64.lld+0x1002e4308)
#12 0x000000010c36c1ec std::__1::__function::__func<llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>)::$_0, std::__1::allocator<llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>)::$_0>, void ()>::operator()() (/nix/store/0r3i5hld2830wvjrpzmf9nww7vqljad6-llvm-20.1.4-lib/lib/libLLVM.dylib+0xdc1ec)
#13 0x000000010c36c054 std::__1::__function::__func<llvm::parallel::TaskGroup::spawn(std::__1::function<void ()>)::$_0, std::__1::allocator<llvm::parallel::TaskGroup::spawn(std::__1::function<void ()>)::$_0>, void ()>::operator()() (/nix/store/0r3i5hld2830wvjrpzmf9nww7vqljad6-llvm-20.1.4-lib/lib/libLLVM.dylib+0xdc054)
#14 0x000000010c36ba8c llvm::parallel::detail::(anonymous namespace)::ThreadPoolExecutor::work(llvm::ThreadPoolStrategy, unsigned int) (/nix/store/0r3i5hld2830wvjrpzmf9nww7vqljad6-llvm-20.1.4-lib/lib/libLLVM.dylib+0xdba8c)
#15 0x000000010c36bb5c void* std::__1::__thread_proxy[abi:nn190107]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, llvm::parallel::detail::(anonymous namespace)::ThreadPoolExecutor::ThreadPoolExecutor(llvm::ThreadPoolStrategy)::'lambda'()::operator()() const::'lambda'()>>(void*) (/nix/store/0r3i5hld2830wvjrpzmf9nww7vqljad6-llvm-20.1.4-lib/lib/libLLVM.dylib+0xdbb5c)
#16 0x000000018849a034 (/usr/lib/system/libsystem_pthread.dylib+0x18043e034)
#17 0x0000000188494e3c (/usr/lib/system/libsystem_pthread.dylib+0x180438e3c)
clang: error: unable to execute command: Abort trap: 6
clang: error: linker command failed due to signal (use -v to see invocation)
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUWl9z46iy_zTkhbIKoT-WH_LgJOO7W5W9u7WTuue-qRAgmwkCBSHHnofz2W8Bki3_yZxkzs7sPa6URhLo1_3rbpoGhnSdWCvOb0F2B7KHG9LbjTa3TBD18nxTaba_fdpwWGsp9atQa0g147AmQnbQaiiFeoZawV2Rl3k6I20r-YwR8yoUSJYA-b8chT_atu4RJ0JR2TMOQXJPO8sYr0Hy6WqTUPaNJiPU-lqT0J01nDRDm2teAbyCv3DZcuN0ZqIjleRQt1Y04iuxQqsOEqN7xSCBWyJ7HgG07CyxgkKhLKwkoc9lpXcAF-55B_ACgvkdQEsIIdxqSayQ3Pe1vGkhSB7gDiRjB9I1h04AFwBjgDF0FvJ_EGDc8EabvW9ZDB8abnujPGB4A-YPgVNZEmuNqHrLy9IDFkoLJYXi7nO8AGjpdOmkoLyUXJW10U3ZWlNyxQAuqFadhXRDDMBL2FoD8D08fek7TlkO6kxtwRWDs_D54kzFifUOWrwl2HXyzVNxF9p4o7bWQIDvfPfkTLM32Q5iAqPvMOVWCwaVVqU1YiuILBnvrOmp1cZ_cVD7u_w8MZnDhP-t1VOQ83AQMwr457XGUx2G37fUHSw3CJ4_DHq8P64qo5-9O93DlptO6Kn3rjIoN6QrmdHtQZpTs3sVlm4gwMUlzPCjpOMwDunkwtXByiT8vFXv4YTiFAJ_E6IKv29DJAPE5Pd9aIzXpJf2TbgUX_jIm8zZuyFCXbh8yHKfN7qXbEQpnPBe8V3LqeVM7oeGDiL4KuwGasl8CucmOhvko4MvwnRM5mNyLdxYgxtr286x8Wqshd30VUR1A_DK9J2dSaLWwz3AK9F1Pe8AXsUpyovcJXD3huqm4crOcJGnWZqmSQophSBFDWFdY5sQfwAtdW_bfjDeQaGKdBuvUQppEHfnEoWzVkTbFs5-j-HMErPm9tp0BWd13_GZZCB5kJIBtJQsTyN3myzhKzHKTzhLyIThLqD3UGkLaz9r1Nr46UQrOHsEeNV3BuCV1JRI96-ozuC4MdqEhLDaugS3qrVk3DibJKWzYLUzcoPZvHlJ13TbqH3Sfvm6pQghtFYAr54AXjlqM8w4Xcwj7Y1flOU4NTq3LaGu645bKDqoe9sJxqHdcNhx6nQFaBksNdUohAN0viCOGRGSsxAtfCdsmP9jN2D7jsPZ1s2oHXdT31ZTP5ce3HTuitlsHONouXSmD61jAoFxFqEIOWj_fhZnCEVJtIjSAPnkneeUJKY5cx9OIhy5oHzaGE4YbDTj0nVtdSd2AC1_VZ0lUnL2IEbLOx1E0NkZ_n8dtVmcRWmEItK2AK_utbJcWdf6wLdc6pY7Zz1pLemGiONnD2E8Rztqx7ZDGFRCHe0xRsGJMR4fHyBGURyllyPsF2648x-BnWhayQ389c_L0krKbeOeU_QYh3nSiC2xPMyiRFkIsrsY7qAoQPYAv3KjhRJWECm-cj85EinWCsYDCD4B6ZUiDWclYcycIBYHROpSXXaPYnfxd4m7pO6SuUvuLnN3KYaseCoxeYfao5DFNQTDpXV1XRRy1_sIJA47wQ4cZHciwdCaXlEXgyJPYddX421rjdUu_YZ6AgZTWw1F7sPTlTHXu50rNvlm4R8SPAJ8UD7-m-Unf6X87OHo0vSqS6P4Rzt1zS2X3E1C7kmoymX3zrVO49DpeQiBkfjhBo20PmiXKP6LPPNNEsU1Evg_jMRVTyQ_gcRFjKIl47VQ3CODFB0L4zyFyunMawhwhqbVGsDZQWK3EbX1Yd1tZEDxve8hHvuGXHxmkGJC_Uz9keiFmBEwpFqpCQu8BiCc4VN2vnP6PdIT7OWMGNkHMaL4X3LI3-KQnXEAOJt_n_hAIh8lFh7FEiEhJVKOHv_WovMQAUor1Uvp7TnKvdI2D3WOK8JH9sW0-mecSmL4R0SfSRtqs0mJcbWW7jZcyrE8hLXWkZRw1m2I4QzOPJJQnEG2V6QRtJRaP_ftx8rrSUmtt9wYwYRa-_K00ayXHA5g1ghXKvoK9AS4IVR3uzgNRWN2N_vHgMNnAcENV7SMx-IdrrnihljOor--ute9LXVdGqLWHL6SDtqN0a8KeuZKz_iO8jbsNLnSNNBpeNeRNYcA415pw7jhrGxIG3YLiC91n_lEFYDxH4-flp8_udTZCAsJrPo1NLzVxro89Y11mC8Rwz-z1ugvnJ4sxaCr9sd9NOcFaki3gRWhz9YQ6nfEIMAJgmiHwi9GNKmrfJFCj-2V7vZduPnDCGU_W0Kfn9znABfHToa8luM2Hc6HHSCfId2ydqXEDuBVZ7XhAK-QSUS2kQwXCXrdfjHt16ZeqNfX-fZFfiEsn3lGoXyeOWcEl_jr4-P__BaxvX--Q7s4d9oOgwzgJD7jsshRcY3Ln736LNaKyF-IYtIv04qfoq5T6KguPjc94wU8USzsyPwcSzI-US2ZqFYUKV0QnA46DKPFA3X7zvImPIb7spXE1to0U_ACpTkjeOKp9BR_saAUvRPf-gXhGXzCKEVH-OwEPiEZSd8JT0-Bk3RB0glwPnVZkuec1gh2loW4Kst4vKG7XUmsdslUaSvqfamVGzR-6zFshR43Fpdvefhlkzx_xfvX3folrmWq1s8V2eJFoZr1vlLkxXmV7nazeBHF0XzqXxrW6FEcoQkjTGg9YTOfssGkpoikV9nUvQo7DJNnkNyHdAuSJdV1He4e_XbDgxFbbsKbsAHxW9jkOg7GpTFk_yevQXJPN2Qo-J0pkk9hr8NnvbT08_-lTkS6fG21-WlquBf30PvPI1zI_LxvKi2fXOHhs-DCfeJb_jlY7O0sQ8mXOH55_rpNzVrmi0w-JwuaPH_Zf2FFRuvXmZRsGMnDDgReHWY8H6sIocz57-jd4sS7jKJkTuFB74bQjQ63orvXjH8eNpEm3CZ9flVtb4cuRyP9QDYJdvoe2SzO2SBaXGXzD23Yo7DcEDlVOjSuuf3db6EBXPTKH5UxKLVa-4vjE8bmD2SF6JBn3YSFTllVvK6v--heK0rsJaFXIyx_0lM6wxHLD3VO7BQ90ohPaRRpgq4754nv7O--Qv0Aix_rEsydtkcuZ7NyTmNOP5YUx9zSEkOk5HLlz2lOwi1s5J-9OH45QpfGZ6Yx6Zx9sThPUug9ufJv1O40hU4zpG5dJX84z_op5Rhznj36PTn3O8o-OBmeW3YIedI9_5fR_bAK6Fry6pLsJfIR9_7MRP-2j3-QJv_f_Imy9OjP9MyfFSkofMs0jFsi5MitIEqrfaP7DirS8K71C56BejiQ-ENr-WnHae9N7nOYNs8npcWx42frlqnr_cm4-jmFPXO0j0bJzo1SZdQ7EODl1WAP1XbZGr3bg-yOVAIkS6XiBYrR3C3Ik_vLz2zfSn61pVfipedla83V5oO8cMp8PdSHs9aSccntdTHnOC4sP50msb_c_1fe_6toOAymuSRNxQjA83EcvTmIQu315neBaDG49KcEWJVNAiw_W9gRlLx34Xh9YcdRMhnU8zP4lCf034IveDJof3l02iv__4qshtx7lI-nqK5xWfktGuN3d2D-gbNX1nvMzi_033HwOtncu2G3CVskC3LDb-N5mi_SNMX5zeY2YWk6RzUlcYYwyVhaYVylC8xyniWoSm_ELUY4Q1kcoxwjnEd5GqMkiRdFweI8X1QgRbwhQkbO9ZE26xu_lXQbJ4s0WdxIUnHZ-f9VhrGvnjDA98N9svyN0M3v_jTv4cbc-uip-nUHUiRFZ7sjqBVW8tthn-6bp9k3vZG337__Nei9vcX_FwAA__9E_9Oc">