Invalid relocation types for Thumb in LLVM version 2.9

Hi all,

I’m trying to figure out a problem with relocation types 1 and 8 (as observed using otool -r on ARM/Thumb object files). Earlier, when I used LLVM 2.8 with llc to generate thumb (-march=thumb -mattr=+thumb2) assembly listings, then assemble those using the gcc of iPhone 4.2 SDK, there wasn’t any problem.

However starting with LLVM 2.9, the same toolchain emits slightly different assembly listings that after assembly into object files have relocation entries of type 1 and 8 which the iPhonsOS 4.2 SDK linker doesn’t like (they produce warnings, and the linked binary crashes).

According to, these relocation types are called R_ARM_PC24 and R_ARM_ABS8. They simply weren’t created with the assembly listings generated with LLVM 2.8.

Anyone has any suggestion has to solve this? Is there any other toolchain combination you can suggest in order to build Thumb object files for the iOS/ARM platform? I’m not sure I’m even using LLVM the way I should here.

Many thanks!

Harel Cain

The llvm compiler can now generated movt/movw instructions to create 32-bit constants. Those new instructions use new relocations. Mach-o uses different numbering for relocations than ELF does. For mach-o, ARM_RELOC_PAIR=1 and ARM_RELOC_HALF=8. You need a newer linker that understands the new relocations.


Hi Nick

I have the same problem when compiling code with LLVM 2.9 and linking the
objects with the linker which comes with iOS SDK 4.2 (which can be found in

When you say "newer linker" can you elaborate which linker to use?


Nick Kledzik wrote: