<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/104442>104442</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[llvm-objdump/machO] Incorrect dumping of relative method offsets
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
alx32
</td>
</tr>
</table>
<pre>
`llvm-objdump` cannot dump method names (and other things) for MachO binaries built with relative method lists, if the MachO binary has a non-zero base address.
Repro:
```
#!/bin/bash
# Set up directories
INPUT_DIR=~/llvm_project/lld/test/MachO
OUTPUT_DIR=/tmp/rel_method_list_repro
SDK_DIR=~/llvm_project/lld/test/MachO/Inputs/MacOSX.sdk
TOOLCHAIN_DIR=~/llvm_project/build/Debug/bin
# Create output directory if it doesn't exist
mkdir -p "$OUTPUT_DIR"
# Split input file into multiple files
$TOOLCHAIN_DIR/split-file "$INPUT_DIR/objc-category-merging-complete-test.s" "$OUTPUT_DIR"
# Compile a64_file1.s to a64_file1.o
$TOOLCHAIN_DIR/llvm-mc -filetype=obj -triple=arm64-apple-macos -o "$OUTPUT_DIR/a64_file1.o" "$OUTPUT_DIR/a64_file1.s"
# Link a64_file1.o to a64_file1.dylib
$TOOLCHAIN_DIR/ld64.lld -arch x86_64 -platform_version macos 11.0 11.0 -syslibroot "$SDK_DIR" -lSystem -fatal_warnings -objc_relative_method_lists -arch arm64 "$OUTPUT_DIR/a64_file1.o" -o "$OUTPUT_DIR/a64_file1.dylib" -dylib
# Compile a64_file2.s to a64_file2.o
$TOOLCHAIN_DIR/llvm-mc -filetype=obj -triple=arm64-apple-macos -o "$OUTPUT_DIR/a64_file2.o" "$OUTPUT_DIR/a64_file2.s"
# Link a64_file1.dylib and a64_file2.o to a64_file2_merge.exe with category merging
$TOOLCHAIN_DIR/ld64.lld -arch x86_64 -platform_version macos 11.0 11.0 -syslibroot "$SDK_DIR" -lSystem -fatal_warnings -objc_relative_method_lists -arch arm64 -o "$OUTPUT_DIR/a64_file2_merge.exe" -objc_category_merging "$OUTPUT_DIR/a64_file1.dylib" "$OUTPUT_DIR/a64_file2.o"
# Dump the mach-o section which will show invalid names
$TOOLCHAIN_DIR/llvm-objdump --objc-meta-data --macho "$OUTPUT_DIR/a64_file2_merge.exe" | grep name
```
The output will show that the method names are missing:
```
name 0x10000079b Category02|Category03
name 0x7950 (0x8248)
name 0x794c (0x8250)
name 0x7958 (0x8268)
```
Using objdump from XCode we see what the issue might be:
```
instanceMethods 0x100000868 __OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_Category03
entsize 12 (relative)
count 2
name 0x7a50 (0x1000082c0 extends past end of file)
types 0xfffffef7 (0x10000076b extends past end of file)
imp 0xfffffe98 (0x100000710 extends past end of file)
name 0x7a4c (0x1000082c8 extends past end of file)
types 0xfffffeeb (0x10000076b extends past end of file)
imp 0xfffffe90 (0x100000714 extends past end of file)
```
So looks like `objdump` is trying to read from offset `0x10000xxxx` and failing - because it's failing to adjust for the `0x100000000` base offset.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUV91vo7gW_2uclyMicEhIHvLQSSZ3eu-0uZp2pNknZOAQ3BqMbNMk87B_-8oGGtKPbWa1WmlRhOTg8_H7nS-bac13FeKSTD-R6XrEGlNItWTiMKGjRGbHJZn5QjyVnkwesqasycyHlFWVNGCXUKIpZAYVK1EDoXNWZSBNgQpMwaudJnQBuVRww9JiCwmvmOKoIWm4MLDnpgCFghn-hL0qwbXRhK6A52AKHEoeoWAaGFSy8n6ikpAwjcCyTKHWYyD-mvhX7fsb1kqSSbciM7_7tUs6ITQgdJPwyr6ZLoayhE7gDg00NWRcYWqk9bn9dn37_-_38fr6G5msfyd0Y7mJayUfMDVumRG6Majtwnneim2_35_k7I6yJnSjUMQt6tiijpVz2gncrf_3S1bo5rqqG0uc_WN792Oss8dW1f12-3X15er69n2FNhxW5RqTZtfx8oKQlUJmEGRj6sY883K0UeIGMom6IjQygAeuTStWPmZcgVcDoZTQcMABpa_4rgU3wC0GyLlA4JWRUDbC8Fqg-0v3u8NzRHSjrbDnxFpTpyjRjUweUi9lBndSHb0S1Y5XOy-VZS3QoGdZHGtC6SVermRZWytsFsbWXDDWYORgKd_10RVRmYJz0xxrJJO1TB7AM8oiJJM1U-Us9FhdC_RKlkoNnnzDqc3Q2ptuD3boN0B85dXj0OVzBNlR8OR9FNksHAuRgcdUWsBhPotnIXi1YCaXqoyfUGkuK2j9D4Kx3748fdSCJ0pK0zncJzil4Im7ozZYgpczw0S8Z6qyvQNs00njvkEMS0V3DjjOLiDpIyZb1HbjEP-7cafncaf_aNzph3Gnl8TdAQXbrweKz1DFtlhwjAdsO3VfRNAV0b8sSz5g9YS2TRirtEccd4gvTKIPg_cyNGs7Su2wK1laeBI0psYStC94WsCeCwG6kHvg1RMTvBu3f55y3bwGzyHxSjTMy5hh4NkkK36FCxKtYKewdmbfHKj3xfNkODlrCmZaUMMzAlMIJdfa5s874xnOHisG_iHw7RMtElh1QfEpiVbPi0kn222PFlPfnkf8w5yGc0IXb6l-YSJahGkvM_UvlZnOe5nZyc7LA4d7f7egoQ9MrmQJP1YyQ9gjaETY94RxrRvL0q4wkOC7NPFKG1aleOP41c8kzWdziOPtp_-uYkLDeHV1__k_22-_xde3d_dXt6vP8c3n-y_b9V18c_zENK4E07rd-ZJMrIzmPxECm9PzvsReMZPKpjIAQM__dhQBWJZYHw3n4ZymPuDBYJVpqJk2gPbYmLsx_0q7bZraqcntg3k0UOVHs-RyVbysAQaqFvMzVcEveDUE16dND27-18Fh8veB88_BhReoeplidxKElI8aBH9E-3VwDeAajDralDYSFLKsTWmZ5xqN3duZPhwOB7vfjpqccWElPEgwZY1G4IbQSD9_sPMne2i0cbcGWwwnRfaxitypvzUzbv0cZctJtpgs2AiXQUQn0SRY0MmoWAaLPPdn8yTJsmmaTvMUo8zPFz7mC6Rhmo_4kvo09OfBNAjplAbjiM3yIJkhhtSPsiQloY8l42Jsu-pYqt3IVecy8MMwpCPBEhTaXZ8orXDf1q7trdP1SC1dK06anSah7ybSSY3hRrh719n1im5Kd56fruG6SqWyx2x303KtI391W2pp0KNGiWVhTK1tt6AbQjc7boomGaey7EZCPxlOx37nq70ydGCelvSPAAAA__-zwkKr">