2

Xcode 4.0.2 を使用すると、シミュレーターで適切にコンパイル、リンク、および実行されるターゲットがあります。ただし、iOS デバイス用にコンパイルしてリンクすると、次の (完全な) リンカー エラーが発生します。

Ld /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos/FrameworkHarness.app/FrameworkHarness normal armv7
    cd /Users/mike/src/FOO/FOObar
    setenv IPHONEOS_DEPLOYMENT_TARGET 4.2
    setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 -arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -L/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -F/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -filelist /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Intermediates/FOObar.build/Debug-iphoneos/FrameworkHarness.build/Objects-normal/armv7/FrameworkHarness.LinkFileList -dead_strip -miphoneos-version-min=4.2 -framework FOObar -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos/FrameworkHarness.app/FrameworkHarness

Assertion failed: (atom->fixupCount() == 1), function targetCString, file /SourceCache/ld64/ld64-123.3/src/ld/parsers/macho_relocatable_file.cpp, line 4831.
0  0x13886  __assert_rtn + 86
1  0x2dfd8  mach_o::relocatable::PointerToCStringSection<arm>::targetCString(mach_o::relocatable::Atom<arm> const*, ld::IndirectBindingTable const&) const + 280
2  0x2b27c  mach_o::relocatable::PointerToCStringSection<arm>::contentHash(mach_o::relocatable::Atom<arm> const*, ld::IndirectBindingTable const&) const + 76
3  0x2c57f  mach_o::relocatable::Atom<arm>::contentHash(ld::IndirectBindingTable const&) const + 47
4  0xae870  ld::tool::SymbolTable::findSlotForReferences(ld::Atom const*, ld::Atom const**) + 704
5  0xb21dc  ld::tool::Resolver::convertReferencesToIndirect(ld::Atom const&) + 268
6  0xb33f2  ld::tool::Resolver::doAtom(ld::Atom const&) + 642
7  0x21f7c  mach_o::relocatable::File<arm>::forEachAtom(ld::File::AtomHandler&) const + 60
8  0xaa29e  ld::tool::InputFiles::forEachInitialAtom(ld::File::AtomHandler&) const + 46
9  0xb5924  ld::tool::Resolver::resolve() + 84
10  0x14ff7  main + 871
collect2: ld returned 1 exit status

誰かがこれに光を当てることができますか?

ありがとうマイク

-v による呼び出し

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 -v -arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -L/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -F/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -filelist /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Intermediates/FOObar.build/Debug-iphoneos/FrameworkHarness.build/Objects-normal/armv7/FrameworkHarness.LinkFileList -dead_strip -miphoneos-version-min=4.2 -framework FOObar -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos/FrameworkHarness.app/FrameworkHarness
Using built-in specs.
Target: arm-apple-darwin10
Configured with: /var/tmp/llvmgcc42_Embedded/llvmgcc42_Embedded-2373.6~5/src/configure --enable-checking --enable-werror --prefix=/Developer/usr/llvm-gcc-4.2 --mandir=/Developer/usr/llvm-gcc-4.2/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --enable-llvm=/var/tmp/llvmgcc42_Embedded/llvmgcc42_Embedded-2373.6~5/dst-llvmCore/Developer/usr/local --enable-werror-always --program-prefix=arm-apple-darwin10- --host=i686-apple-darwin10 --target=arm-apple-darwin10 --with-gxx-include-dir=/usr/include/c++/4.2.1 --with-build-sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.Internal.sdk
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2373.6)
 /Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../libexec/gcc/arm-apple-darwin10/4.2.1/collect2 -dynamic -arch armv7 -dead_strip -iphoneos_version_min 4.2 -syslibroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -weak_reference_mismatches non-weak -o /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos/FrameworkHarness.app/FrameworkHarness -lcrt1.3.1.o -L/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../lib/gcc/arm-apple-darwin10/4.2.1/v7 -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../lib/gcc/arm-apple-darwin10/4.2.1 -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../lib/gcc -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../lib/gcc/arm-apple-darwin10/4.2.1/../../.. -filelist /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Intermediates/FOObar.build/Debug-iphoneos/FrameworkHarness.build/Objects-normal/armv7/FrameworkHarness.LinkFileList -framework FOObar -framework UIKit -framework Foundation -framework CoreGraphics -lgcc_s.1 -lgcc -lSystem -F/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos
Assertion failed: (atom->fixupCount() == 1), function targetCString, file /SourceCache/ld64/ld64-123.3/src/ld/parsers/macho_relocatable_file.cpp, line 4831.
0  0x13886  __assert_rtn + 86
1  0x2dfd8  mach_o::relocatable::PointerToCStringSection<arm>::targetCString(mach_o::relocatable::Atom<arm> const*, ld::IndirectBindingTable const&) const + 280
2  0x2b27c  mach_o::relocatable::PointerToCStringSection<arm>::contentHash(mach_o::relocatable::Atom<arm> const*, ld::IndirectBindingTable const&) const + 76
3  0x2c57f  mach_o::relocatable::Atom<arm>::contentHash(ld::IndirectBindingTable const&) const + 47
4  0xae870  ld::tool::SymbolTable::findSlotForReferences(ld::Atom const*, ld::Atom const**) + 704
5  0xb21dc  ld::tool::Resolver::convertReferencesToIndirect(ld::Atom const&) + 268
6  0xb33f2  ld::tool::Resolver::doAtom(ld::Atom const&) + 642
7  0x21f7c  mach_o::relocatable::File<arm>::forEachAtom(ld::File::AtomHandler&) const + 60
8  0xaa29e  ld::tool::InputFiles::forEachInitialAtom(ld::File::AtomHandler&) const + 46
9  0xb5924  ld::tool::Resolver::resolve() + 84
10  0x14ff7  main + 871
collect2: ld returned 1 exit status

追加の詳細

これは、FrameworkHarness というアプリケーション用にコンパイルされた .m ファイルを、私が作成した FOOBar というフレームワークにリンクしているときに発生しました。フレームワークのレシピは、http: //db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/からのものです。

次の場合、リンク エラーは発生しません。

  • シミュレーター用の FrameworkHarness の .m ファイルを使用して、FOObar フレームワークの .m ファイルを直接コンパイルします。
  • FOObar フレームワークの .m ファイルを iOS デバイス用の FrameworkHarness の .m ファイルで直接コンパイルします。
  • FOObar フレームワークを、シミュレーター用にコンパイルされた FrameworkHarness の .m ファイルにリンクします。

次の場合にリンク エラーが発生します。

  • FOObar フレームワークを、iOS デバイス用にコンパイルされた FrameworkHarness の .m ファイルにリンクします。

フレームワークから作成する 5 つの領域の 1 つを削除して、フレームワークの問題を切り分けるのに疲れました。変更されたフレームワークを iOS デバイス用にコンパイルされた FrameworkHarness の .m ファイルにリンクするたびに、リンク エラーは発生しませんでした。

次に、フレームワークはそのまま残しましたが、アプリケーションからフレームワークの 5 つの領域の 1 つへの呼び出しを削除しました。iOS デバイスのリンカーの問題を引き起こすフレームワーク領域を切り分けることができました。フレームワーク内のコードを削除するのと同じプロセスを実行し、リンクがエラーの原因となった特定のコードを特定できました。フレームワークのその領域でコードを移動したところ、リンク エラーはなくなりました。ただし、移動したコードは表面的なものであり、コードをある関数から新しい関数に移動し、元の関数からその関数を呼び出すだけでした。移動したコードは次のとおりです。

// Prompt are you sure?
NSString *message = [[NSString alloc] initWithFormat:@"Are you sure you want to remove the vlaue \"%@\" from the list?", [array objectAtIndex:[pickerView selectedRowInComponent:0]]];
UIAlertView *alertView =
    [[UIAlertView alloc] initWithTitle:@"Confirmation needed"
                               message:message
                              delegate:self
                     cancelButtonTitle:@"Keep"
                     otherButtonTitles:@"Remove", nil];
[message release];
[alertView show];
[alertView release];

nm を使用してフレームワーク シンボルを比較する

iOS デバイスとシミュレートされたフレームワークで nm を実行しました。バージョン間に多少の違いはありましたが、叫んだものは何もありませんでした

nm -j -a

-j シンボル名のみを表示します (値や型はありません)。-a デバッガーが使用するために挿入されたものを含め、すべてのシンボル テーブル エントリを表示します。

diff nm.ios nm.sim 
125a126,134
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
313d321
< ___divsi3
324a333
> _objc_msgSend_fpret
327a337,431
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
  • EH_Frame1 と func.eh は「S」(上記以外のセクションのシンボル)
  • ___divsi3 および _objc_msgSend_fpret は「U」(未定義)

nm -j -g

-j シンボル名のみを表示します (値や型はありません)。-g グローバル (外部) シンボルのみを表示します。

diff nm.ios nm.sim 
83d82
< ___divsi3
89a89
> _objc_msgSend_fpret

nm -j -u

-j シンボル名のみを表示します (値や型はありません)。-u 未定義のシンボルのみを表示します。

diff nm.ios nm.sim 
37d36
< ___divsi3
43a43
> _objc_msgSend_fpret

考えられる次のステップ

アサーションの直前に何をしていたかを見ることができるように、何をしているのかを吐き出すように指示するリンカフラグはありますか?

4

2 に答える 2

1

Xcode の最新バージョン (現在は 4.1、ベータ版を除く) にアップグレードします。これで問題が解決するはずです。

于 2011-09-06T05:15:05.270 に答える
0

これはリンカーまたはコンパイラのバグです。ソースとビルド情報をレーダーにファイルする必要があります。少なくとも、すべてのオブジェクト ファイルとリンク行が必要です。

于 2011-08-26T18:13:23.750 に答える