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

    <tr>
        <th>Summary</th>
        <td>
            Missing ELF AArch32 relocation support
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    LLVM JITLink gained [initial AArch32 support recently](5c1d160cd979dd6099f4266db600020a0cb4867a) and I started looking into the debugging story. I got JIT breakpoints on function names to work, but LLDB seems unable to show source information.

## Too long; didn't reproduce

LLDB's ELF object file plugin lacks relocation support for AArch32. In particular, it seems to consider all 32-bit targets to be i386:
https://github.com/llvm/llvm-project/blob/release/16.x/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp#L2697

## Step-by-step repro

I found the following results with release 16.0.0 (customized version from the [CodeLLDB plugin](https://github.com/vadimcn/codelldb)). Note that both, llvm-jitlink and llvm-jitlink-executor must be built from mainline.

(1) On the remote AArch32 device, run both lldb-server and llvm-jitlink-executor:
```
> lldb-server version
lldb version 16.0.0-custom
  rust-enabled
> lldb-server platform --server --listen 0.0.0.0:9001 --gdbserver-port 9002 &
[1] 2710
> ./remote_build_main/bin/llvm-jitlink-executor listen=0.0.0.0:20000
```

(2) Connect LLDB to the remote lldb-server and let it attach to the llvm-jitlink-executor. Then set a breakpoint just before entering JITed code and resume execution:
```
> lldb --version
lldb version 16.0.0-custom
  rust-enabled
> lldb
(lldb) platform select remote-linux
  Platform: remote-linux
 Connected: no
(lldb) platform connect connect://192.168.1.100:9001
  Platform: remote-linux
    Triple: arm-unknown-linux-gnueabihf
OS Version: 5.15.76 (5.15.76-v7+)
  Hostname: raspi32-3b
 Connected: yes
WorkingDir: /home/ez/.vscode-server/extensions/vadimcn.vscode-lldb-1.9.0/lldb
 Kernel: #1597 SMP Fri Nov 4 12:13:17 GMT 2022
(lldb) process attach --name llvm-jitlink-executor
Process 2835 stopped
* thread #1, name = 'llvm-jitlink-ex', stop reason = signal SIGSTOP
    frame #0: 0x76efc09c libpthread.so.0`accept + 36
libpthread.so.0`accept:
->  0x76efc09c <+36>: svc    #0x0
    0x76efc0a0 <+40>: cmn    r0, #4096
 0x76efc0a4 <+44>: mov    r4, r0
    0x76efc0a8 <+48>: bhi    0x76efc104 ; <+140>
Executable module set to "/home/ez/.lldb/module_cache/remote-linux/.cache/9B8F5E02-B8CD-9D55/llvm-jitlink-executor".
Architecture set to: arm-unknown-linux-gnueabihf.
(lldb) b TargetExecutionUtils.cpp:43
Breakpoint 1: where = llvm-jitlink-executor`llvm::orc::runAsMain(int (*)(int, char**), llvm::ArrayRef<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::optional<llvm::StringRef>) + 708 at TargetExecutionUtils.cpp:43:3, address = 0x0012930c
(lldb) c
Process 2835 resuming
```

(3) JIT-link the example object to the remote executor:
```
> host_build_main/bin/llvm-jitlink --oop-executor-connect=192.168.1.100:20000 base64char2val-minimal-debug.o
```

The debug session in (2) reports a number of errors before stopping at the breakpoint:
```
error: JIT(0x76f67000)(0x0000000076f67000) unsupported 32-bit relocation: .rel.debug_info[0], type 2
error: JIT(0x76f67000)(0x0000000076f67000) unsupported 32-bit relocation: .rel.debug_info[1], type 2
...
error: JIT(0x76f67000)(0x0000000076f67000) unsupported 32-bit relocation: .rel.debug_info[30], type 2
error: JIT(0x76f67000)(0x0000000076f67000) unsupported 32-bit relocation: .rel.debug_line[0], type 2
Process 2835 stopped
* thread #4, name = 'llvm-jitlink-ex', stop reason = breakpoint 1.1
    frame #0: 0x0012930c llvm-jitlink-executor`llvm::orc::runAsMain(Main=(JIT(0x76f67000)`main + 1), Args=(Data = 0x00000000, Length = 0), ProgramName= Has Value=false ) at TargetExecutionUtils.cpp:43:3
   40  int RawArgc = Args.size() + !!ProgramName;
   41  char **RawArgv = ArgV.data();
   42
-> 43 printf("Calling int main(%d, 0x%08" PRIx64 ") @0x%08" PRIx64 "\n",
 44         RawArgc, pointerToJITTargetAddress(RawArgv),
   45 pointerToJITTargetAddress(Main));
   46  int Result = Main(RawArgc, RawArgv);
(lldb) b main
Breakpoint 2: 2 locations.
(lldb) br list
Current breakpoints:
1: file = 'TargetExecutionUtils.cpp', line = 43, exact_match = 0, locations = 1, resolved = 1, hit count = 1
  1.1: where = llvm-jitlink-executor`llvm::orc::runAsMain(int (*)(int, char**), llvm::ArrayRef<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::optional<llvm::StringRef>) + 708 at TargetExecutionUtils.cpp:43:3, address = 0x0012930c, resolved, hit count = 1 

2: name = 'main', locations = 2, resolved = 2, hit count = 0
 2.1: where = llvm-jitlink-executor`main + 28 at llvm-jitlink-executor.cpp:120:35, address = 0x000dade4, resolved, hit count = 0 
  2.2: where = JIT(0x76f67000)`main, address = 0x76f6906a, resolved, hit count = 0 
```

Here we see that the JIT breakpoint 2.2 doesn't have source locations, while the breakpoint 2.1 in static code has them. So far I simply used GDB on AARch32, but since we have upstream support for AArch32 in JITLink now it's time to fix this.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWc1y2zgSfhr40kUWCIqUePBBP9aMs87EFXuzRxdIQiImJKACQFmep99qgJTkWE6yU1vZy8ouSQQa3Y2vfwFxa-VWCXFNsgXJVle8d40218-ilXshVS0cl-1VqeuX67u7Lx_hw-3jnVRfYculEjWQbCGVdJK3MJ-bqkkZ2H6308aBEZVQrn0h2YqwWVYldZLTqi6mRV3ntCg2E5bndZlTShnltCons3zKCSuAqxpuwTpunKih1fqrVFuQymlwjYBalP12i0PWafMSwy1stUPNoDSCf91pqZwFrWDTq8pJrUDxTlhwGp61-UrYEsrewd3dagFWiM5Cr3jZCiSwjX4Gq3tTCZBqo03HkUNM6IrQ-fDOUsJSeNQaWq22JF1ALWtF2BR3vTO67itxvgAlETa1cHO3Bl3-KSoHG9kK2LX9VipoefXVghGtrry0I4YbbUZcY7hVsOPGyapvucFNSDeo7zRUWllZCwO8bSFlUSkdOG62wvnpUoBMZzlJB40a53YWn9iasPVWuqYv40p3hK3bdj9-RDujUVnC1mWrS8LWRrSCW0HYOsnjgyercTwgRtj63u_IErb-5Pe5li0O39ytXw3d3K3jarcjLL1jeTG9gO6DE7uofImsE7uA6jnRLWx0r2rvDxvdtvoZ_cEI27fOwrN0DQyqQpLHNKZA2KzqrdOd_EvUsBfGItAbozvPhGSLpa6F94lgleC33wFqz2vZVYqwdaVrEYAoCCti-EM7Aa7hDkrtGjSVR_NP6VqMHfTv84FIHETVO22g661DW5W9bF1QruNStVKJbzxwlmCkfFJeeSM6lDhGYC32Eo2xBNMrrwKgdpEVZo8e8p74o3eQnA7_4TG9ecVgAC9M4sQRzoB1FIAO8wCmty4SPsLqywx3LXcYahCNI1HUSuuEAhr7P5LOC0oTiKJtXQaayEdIQSkDwvKBcbZISLYCNk3OdI-94yJETwhs_YSYok_798uWCOJJujopwCil9DJAo1EYGmWplcII97405KzBQm_MIBxGMXeOV81Ie1GhGB4bocAKB_wszcGfwWM22ggQygmDcfDh9lHUgF7ppWBYdAICKzTcD-wMUfRfM_ERmiE-Tra2okWUAjJRK1V_GNndDzQknV-aHwAWNc4r_b6IarDE8HkM46RgcZLP4iRO6OhaPykbAB6N3LUC57npol59VfpZBaJoq3rBS9lsAvmnB_gyIJnOIYuTLJ7mmIqGr9F-StgC08bA_XdtHRYrL53bnUxZlJaX9v0ibBj-lzZYH1cS4xcIWze6w5Qr_iJsHe8tusHgczh6cEKhQvaUwUYi751JXMR0TOxB7j-EUaIN3NMkK6bw8PEe1kbCH3oPE0gYSedJim9T-O3jIzDK2FurGF0Ja0dnjyLc5zuJyK-9HxawWZphqd_tjs7F5uAaI3jtNcJM55mRdAWETb_hSdgUKZADGMGtVp4Q-x7ewsPtbw-Pn-5P5t0Yz4ql6BlAD9NcbCpaVNDKchekxlbHGDa8qsTOAWELSIcM9B7RMeYijIxztiRdErZIc5LeoEC7r1ALlH-gJ63GBZwOCyZ0WFB1CgkMxU0Slk5oMehyWjQZF02GRZ3e-0UTXyUuyZmNS2bDkrKRZwQJRZ6LgSgJ2nguN96Ivp_qdN23wictp4Ew9q13Dt1DoHuqeNWIY64ewo6t43G8WMzW2Q1l0WK2XEXFKsveS9-EsaFeYkmUTlSuN6MiP4jc-I3nlvDoO6mbMYH-08nW-v4lnU_SQL845eQEJTw3wgSPvKxhTn2jlc5JOtemCl9Mr-b2o69OM-RE2IywuW8r8BmNVTXY_M3H4dBahNVzY_jLZ7Eh6dK6Oow9PVWHQ5KEh5JbWT1Zh0WCpMvACiNjIMaBJ2e4dHacTm9eUfDW96jYKxznw_85ld4hSrwl6fKk3YMX69W7QVQxaqZ0Btz9AN50niJ3XtcG0wFCSg-UJqxIafXGWNWF5OELIO75u8U7xeUfbh8j36RhJRYH3u1aMbbsr2v5z3RNjbbuRz0HRJHWu6NjRMditfq2TPkGBEpuRT5B8Nmet1Enlex4G_lTUay_s8XH8ewEVlhfy6WCsWkxAtspCxxU35XCgN6AMEYbO3YXPgNjd8Gdh-HUhLyHgF-PsfDh9pGwGWaOTT7FJso7NBoxvM7GoVfD4UfU4znmdDBCZrERbez38YQHNJItqG_Vl-BedgLYr5WdXJAdx_GvVSL9nyCAp5J30P_Z0j35e6X7rP9N4uT90j0mib-bgv1HisfASxjmFGPa57FkyMVzs7VhwYo7fkxV4YUEd0JtXRMmhjX3Rm8N7_7wXd8KfucWvvC2x4cNby3up_i5JDniMKEAiM1n_jw328pLQ81iK_8SvqSE7EtYQljySv7ixCQBX2sgFJvAaz_y-hLX3PHA69UqdtblTFLYGancxtOxJW_b4SIHQjacEZbViAE9EJZRJIL7z7eHfBKahQLIhF6ey5bKkywH0ZMJjK9h28jX-4gwj_rD7WPAbx6qCGGzYUfBCqcNZN9dFByj-HbX-QC4v3_wGA0edKbLmbxx6asew0PybSuBnTUwGCPQXmhOwlk1jC97Y4Ry5_dgx-TsuxJ_6zTE2rsOFYIOw9uTTnz5FQdeuaeOu-rovsuTXn7IN-JGWN3uRX0aaSSewHrlhqEBNYzc__dJv6xPOjPNBaPAeaPgne48K4donb61OHtjcfaW-Xi6YD9r8GNaZX7Xl-9DwrYThqk-zS5tnNa8FpPvb5zC6I4sZq-1ez_lvxWGNAXN-c8Ju9id_Y5yn_GMMlwdYo_1-k4bdYRaCxuumhu-F-NV9dEsKPW5wSh_3aMh-tjvWcedrMLdUMMtUnUxPGjYcAO3YGW3a1-gt6KG31YL0Arm889Vk7Lx1txKVXlFvfh-Z50RvLt0Y43ixp8LlH4G6fwduJOdv2nfyAO4Ro4p7aq-TusiLfiVuE7yGc2LIpmmV8212OAZepNNq6LiKd3UZZ5t0jKbzNK6Thi9kteMspROaJawjGVpPKvylE6rIue0mqWTmkyo6LhsY_SkWJvtlbS2F9d5UkxmVy0vRWv97x-MKfEMftLXmNWVufbeV_ZbSyYUE609cXHSteL6o7QWy9rN3fq487dX-Ve9aa__41t3r4olbO1V_XcAAAD__1MUxp0">