How to use ldid?

1) Using ldid -S is the correct usage. Not lowercase (-s).

2) Usually, when I get this error, it's because I built my app with the wrong architectures. Most older versions of ldid that I've used cannot sign fat binaries (but see Update below). Fat binaries are ones with more than one architecture inside. For example, a dual armv6 and armv7 executable. Or with Xcode 4.5, it's probably defaulting to armv7 and armv7s.

In the project build settings, use the Architectures, Valid Architectures and Build Active Architecture Only settings to determine which architecture executable is built. For jailbreak development, I usually set Build Active Architecture Only to YES. And valid archictures set to armv6 and armv7.

3) Also, some older versions of ldid cannot sign armv7 executables. If you get the pre-built copy from KennyTM's site here, it supports armv7. Note that this ldid is built for Mac OS X, so it's designed to be run on the executable on your Mac, after building without signing in Xcode, but before you upload to your iPhone.

Newer phones can generally run executables built for older architectures, but not the other way around. So, build for the oldest architecture you want to support. You just will lose some optimizations in the newer architectures (which most people don't care too much about ... let me know if your app needs these optimizations, and I'll post more).

So, if you want to support old devices (iPhone < 3GS), I would set Architectures to only armv6, making sure to remove the default setting of $(ARCHS_STANDARD_32_BIT). If you only need support for relatively new ones, then pick armv7, but make sure you use a version of ldid that can sign armv7 binaries.

Edit: to determine if the executable you were trying to sign was a fat one, run this at the command line:

> cd HelloJB.app

> ls
HelloJB     Info.plist  PkgInfo     date.zip    en.lproj

> lipo -info HelloJB 
Non-fat file: HelloJB is architecture: armv7

As you can see in the above output, my HelloJB executable is not fat, and only has armv7 code.

Update

I believe that the pre-built version of ldid found here can now sign fat executables, although there are still ldid versions floating around that cannot. Also, I think that if you install a recent version of iOSOpenDev, it will give you a version of ldid that can sign fat executables (default install location of /opt/iOSOpenDev/bin/ldid).


Starting from what seems Xcode 4.5 onward, maybe as early as 4.4 have not checked, in order to pseudo code sign using the ldid tool, you need to download and install 'Command Line Tools' from here or you can download it from within Xcode, Preferences->Downloads

Otherwise you will get errors like

  • util/ldid.cpp(584):
  • ./minimal/mapping.h(54): _assert(2:false)
  • util/ldid.cpp(567)
  • and so on

You still need to make sure it is not a "fat" binary and only armv7 as armv6 is no longer supported.

ldid -S ExampleApp