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

    <tr>
        <th>Summary</th>
        <td>
            lld:MachO crashes when linking with same symbol from different architectures' archives
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    How to produce:
foo.cpp:
```cpp
void foo(){
  return;
}
```

bar.cpp
```cpp
extern void foo();

int bar(){
  foo();
  return 0;
}
```

main.cpp
```cpp
extern int bar();

int main() {
  bar();
  return 0;
}
```

Build the executable with the following command:
```bash
clang -arch arm64 foo.cpp -c -o foo_arm64.o
ar rcs libfoo1.a foo_arm64.o
clang -arch x86_64 foo.cpp -c -o foo_x86_64.o
ar rcs libfoo2.a foo_x86_64.o
clang -arch x86_64 bar.cpp -c -o bar.o
ar rcs libbar.a bar.o
clang -arch x86_64 main.cpp libfoo1.a libfoo2.a libbar.a -fuse-ld=/Users/bytedance/github/llvm-project/build/bin/ld64.lld
```
Then ld64.lld gives the following crash log:
```
ld64.lld: warning: libfoo1.a(foo_arm64.o) has architecture arm64 which is incompatible with target architecture x86_64
cannot be TLV
UNREACHABLE executed at /Users/bytedance/github/llvm-project/lld/MachO/Symbols.h:68!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /Users/bytedance/github/llvm-project/build/bin/ld64.lld -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -platform_version macos 12.0.0 12.3 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -o a.out -L/usr/local/lib /var/folders/mc/j3dq2z114_l_cpcpjvnlywnr0000gp/T/main-122511.o libfoo1.a libfoo2.a libbar.a -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/13.1.6/lib/darwin/libclang_rt.osx.a
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  lld                      0x0000000104c1127d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 61
1  lld                      0x0000000104c117fb PrintStackTraceSignalHandler(void*) + 27
2  lld                      0x0000000104c0f616 llvm::sys::RunSignalHandlers() + 134
3  lld                      0x0000000104c12e9f SignalHandler(int) + 223
4  libsystem_platform.dylib 0x00007ff80ba66dfd _sigtramp + 29
5  libsystem_platform.dylib 0x00007ff7bb5ab4a0 _sigtramp + 18446744072362411712
6  libsystem_c.dylib        0x00007ff80b99cd24 abort + 123
7  lld                      0x0000000104a49590 llvm::install_out_of_memory_new_handler() + 0
8  lld                      0x00000001053432f4 lld::macho::Symbol::isTlv() const + 36
9  lld                      0x00000001053262bb lld::macho::validateSymbolRelocation(lld::macho::Symbol const*, lld::macho::InputSection const*, lld::macho::Reloc const&) + 123
10 lld                      0x00000001053a2ce8 (anonymous namespace)::Writer::scanRelocations() + 408
11 lld                      0x0000000105398b01 void (anonymous namespace)::Writer::run<lld::macho::LP64>() + 113
12 lld                      0x0000000105398a31 void lld::macho::writeResult<lld::macho::LP64>() + 49
13 lld                      0x0000000105257fc4 lld::macho::link(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, bool, bool) + 16596
14 lld                      0x00000001049565a9 lldMain(int, char const**, llvm::raw_ostream&, llvm::raw_ostream&, bool) + 153
15 lld                      0x0000000104956314 main + 180
16 dyld                     0x000000012480851e start + 462
clang: error: unable to execute command: Abort trap: 6
clang: error: linker command failed due to signal (use -v to see invocation)
```

The problem occurs because by the alphabetical order, lld first loads libfoo1.a, which is an arm64 archive. At this time lld only reads the header of libfoo1.a, and add `void foo()` as a lazy archive symbol to lld's symbol table. Then lld loads libfoo2.a, which is a x86_64 archive, and it contains the `void foo()` symbol that we want, because we are linking a x86_64 executable. However, lld finds that its symbol table already has `void foo()` from the arm64 archive, so it will not add this x86_64 one to its symbol table. 

When lld tries to solve the undefined symbol `int bar()` in main.o, it loads bar.o from libbar.a, and realizes that there is an undefined symbol `void foo()` in bar.o, so it tries to load `void foo()` from foo_arm64.o from libfoo1.a according info from its symbol table. At this time, lld finds that foo_arm64's architecture is incompatible with our target architecture, so it stops parsing foo_arm64.o. However, `void foo()` still remains as a lazy archive symbol in lld's symbol table. Therefore, in the relocation stage, lld goes into `lld::macho::validateSymbolRelocation`:

```cpp
if (relocAttrs.hasAttr(RelocAttrBits::TLV) != sym->isTlv())
    error(message(Twine("requires that symbol ") + sym->getName() + " " +
                  (sym->isTlv() ? "not " : "") + "be thread-local"));
```

Because lld cannot determine whether a lazy archive symbol is a TLV (and there is no method override for LazyArchive symbol), it goes to the virtual method in the parent class (Symbol), which gives us the llvm_unreachable error.

I think we can fix this by making `ArchiveFile::addLazySymbols` check the architecture of the archive it reads. If the architecture doesn't match our target architecture, we shouldn't add lazy archive symbols from its header. 

I'm not sure if this is the right way to fix it. Need some suggestions here.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9WFtz4joS_jXkRYXLNww85IHcalKbmUmFnMvuCyXbMnhGtjiSDGF-_XZLsjHBmcOcrVoqwUaW-95fdysV-eH6k9gTLchWirzJ2ChajPy7kb8ohPCy7bb7PUp8-4eLZmUnypzAtlE4G4Xz0fTGLhMimW5kPYrcwmh6946E-2m-Uyq9juQ5E_ammazJO14dafNd1poAmTM5zve3shH_QukqWtYXiHcqwbl0SMY-JD35zt_4ZflumpLnRG8YYW8sazRNOSP7Um_MWiE4F_uyXpNMVBWt83NvplRt7FLGKWwcU5ltCJVVEhMXAmSckbHAXyuz7gn7ApVEZorwMoVHgUfPd_RJvs2S1SBN-2CQaOiInm4ZoOqCyFHFX2fkcJH2Hw2Qab3d0-koSEdjXDSKjTkY824UPvymmFRwTQ-a5bSGDAof1uCAJoUbznfVGDLrG8s07kFv4RWj4YHnoBOHhSH3vm5YTdodZF3umHrvUgmuI1ysz51qf3b0owXZU1nDS3jb6Qax1_cYxOaGKoL2KDXI20jm4mC_KcFGpYIwhzjaUl0eo4zKNdOnL1ljOiPTuhaQG4y8Pv1ul3778nK_uP20uHm6d0HLckI1-UVbcmPJzzTbfIXr8lClgitvAxomkFKB5fX8dL9Y3hPVpFUJUpK0WUOGbYXUCHkbrbcKrRc-dIw80NAxO-dZKtUwFJBALqE1eJMz4xbrjJRm37WkGfMs-6WGBZI31RFGfY-Yz7MUa0krsNy6qVitUY5fNcFwOJFxziDX1-CiMddiBf6WVB6Q-GK75WUG_hM18vgzEznzKGBZ-HAram3ECB_u2I5xsWUATg-vQvBsA2nR7b9jBW249t4y3T6DR43C3cDKfj-9fvXyA9yQcS1WOcsbyxhEyg81rcrsNPHGW051IWS12oH6IB6kYiYUCULP93y8RGSsDgp1EUL_M12eHQ9l4-br8k-vZftu5_LuX71NKv-OqEI90WgyfjpqKzLKrb4o0A7R_AHyM7cerDL4-hblf4U_giBe8VW2zbbfdjU_7Gvpw2eNsr7iTrDhOAjDSRB44m-why8PSrPq_-dNA5NwDSIv8JJuOadyb8OuTM2WldSeUG8AK-9C3wAFmk6ZHCXgfsAyAB9WK4SLg2gAeHaMmOi2m8ofTEJ-4TNJnhevn4iQRAHQmEpX70opaswaAkYnAHhPT79_Xi3__fnm69Pjf-5fVvgKLJu-RmABhptSm0rb5iEhmCuDH__Nt5_Aj7MgCKe5kQ3fjRYQhfbmWQJho-YrpjwodNwk6X4llJaMQmiB0W6xQzDVP7whiQOn4HIRpkVK3vFbluua8k8ARBx9O8MOaRQuWibh1DIJL2XiF0mQDOn50tQnvFTbyACXIHI4H12sS8jmBXkvfM86YRhZkjHBsFcm3FdtojpUsSSnRTGDBiZJ8iInK1WuAXsh3gyVuSUyuYTINE0nNI2p_45IMIvjZBrH_jSMkjAGNwShJZv0yWaO3om6Vrb5PMvDmNAUK44h2Wo3vdBgNJ5P5n7PL5C8mnK-goxaiWJVsUrIw6pm-9WmM2drS9cIzC7jNYniKCxiYlsG-AMM3gh7a-urk0C98p3jkgH2WM2ixDKbX8osTMI0HWS2o7zMoVhYpi8MgRZRzqTYR7JZUUwG3A5Sfay3jV5C5cTy8nebDdN2V9KFe-u9wL9QSRpmbIZgR2tRHyrRKIt_W4MYc8vsDwm9k3RpBx3TUeN-rsX-zDEPLmQ-n6V-YEenX5BANjC63Q4Z5ekZ2rrovp__QWuQ8GKZaORkGmKxR0FemIKadLEQscv1ILpMhnAyLbLhMOdl_f0EyBdS0sMLK0AYKI7yGDcowS35GeL_7FkKxfZ4dbZMJnOXQ0F8GTjMJ8mEznHvZztgGhy9JaeitlH-v4jqRJy07p5cLGAU2LnKIaqDJCg1AJrDFI4EwnjmzyYBIwB5DkDjJOyNb9g0MykFhi5pajP9Qql3Y0Vv6iULA8GA7diKk-QjGhgATLYvkoKWHKaTvDFklalamEswAJLxzqwxBrV91yHU_CfDOsx0eMwCQlZEZFkjFQxGGUVi6cG0NpRvNzRlGto6Di1PjmhuAIoUpQSg5YLmqj_B3R6HM1q7cc0MYzvmkQX2S_BElxUzRAQ0nzD_IA3ktoE7UFYUpxRRcZrn2Fe9O3aBjgonRMLpj0PLpm3rwBZmJJuqbgXd4RE7yQL3vvDhe-HbScBRbeWAqQ3iWGPLakQelKnlt4Epcg-DKbVZ0Np2j3MsM67FubljdTwx8cgnsYc-uWft2tgICJb6VCHwEVrwYIblQXEKKSrrzb47kLTCLhT6YQ5dMEwxaGTjICeQqJltVN-bsB9Ef7Tm1LLEMwEIQcF3dgpt6pyB6BCx7n0Q5_RoCsQra3vOIUxb2saUORixorfDRusDUBcbcmcP4APGtPE2xO_cHsDQHrt0FuhER94_MWLveKITzc1GNMsgP9CfZV24p-eG62fAgG87-iZsTw4xBk87cBoZOPE4Kqa02CqypTDDgmQ98U8ibDiINYaFZJWJ9Q_TrKw_TjPJoLtldtow8SC7RgIRdN2ZYC0YqgcOAM6_1IEBoHWnTR8ciZYFIqRhvdBaKg8SBW9g8aVdvCm1my7wWMhUl2AU3aFKYyitvQ6zQ1SsDBamwxm0L8qoM3uFIZSZnaFkfzWlbMO0DcgwbIuXow3O-0Ir1usfYI_7vzmyOv3A7nPRyCh6wBdrcyAB75sTnLDHEm5TzEwEjLE7LgidUt357uCxroMudJY7QssZdGgVaAugyTAJPwoQjBywqm358mO-1oJU8KKAMgBxKMscDxMleQIaixMSRkADDSZOIEowlmDm1g1UJUfDRRiEOo7hUEiVmemXfQoW3e3ZZWPxGzuNVVODQaBHwbwyLvX6uj9iytbfEbZBdUjXN5vDUCIrahAcjOUkfoDybOMIsBQ1ceeAmFDZhmXfHQ73EhuqXbcGKoOWpiB65LE435yDAaCoT_EEX2c_BQAQV21Ew3O7H7F9wD3qiFS2-p6C-yO8W5naYI5GysKqXlrjyXK9gfJBD-gTtEupPfKFIfwKqPCqWa-ZMmMDQad7V_l1lM-jOb3Spebs2ma6OTK1B5bgl70pJ640GpBTtOqCyQibl0XBjJv7OsNoMm2VU1eN5Nf__DgVusRZcrW5nuPUzKIkn0VZPA8ZZXQS5pMpS9lsQuPoikNzxNX1aHIzmtxdldehH4b-1J8EcTAJEi8qijidT6LpLGDBjBaj2Ec85R4y9oRcX8lrI0ParBU85KXS6vgQYhg6PMZa-rSBUJfXzy_3y8e7-y-vs8C_MjJfG4H_Cw9yWiw">