链接器错误声明失败:(atom-> fixupCount()== 1) [英] linker error Assertion failed: (atom->fixupCount() == 1)

查看:109
本文介绍了链接器错误声明失败:(atom-> fixupCount()== 1)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用Xcode 4.0.2 ,我有一个可以在模拟器中正确编译,链接和运行的目标.但是,当我为iOS设备编译并链接它时,出现以下(完整)链接器错误:

Using Xcode 4.0.2, I have a target that compiles, links, and runs properly in the simulator. However when I compile and link it for an iOS device I get the following (full) linker error:

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

有人可以阐明这一点吗?

Can someone shed some light on this?

感谢迈克

/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/

当我执行以下操作时,没有链接错误

There is no linking error when I:

  • 直接使用FrameworkHarness的.m文件从FOObar框架编译.m文件,以用于模拟器.
  • 直接用FOObar框架的.m文件与iOS设备的FrameworkHarness的.m文件进行编译.
  • 将FOObar框架与用于模拟器的已编译FrameworkHarness的.m文件链接.

我出现链接错误:

  • 将FOObar框架与iOS设备的已编译FrameworkHarness的.m文件链接.

我厌倦了通过从框架中删除5个区域之一来隔离框架问题.每次我将修改后的框架与iOS设备的已编译FrameworkHarness的.m文件进行链接时,都没有链接错误.

I tired to isolate the issue with the framework by removing one of the 5 areas that make from the framework. Each time I linked the modified framework with the compiled FrameworkHarness's .m files for the iOS Device there were no link errors.

接下来,我保持框架完整无缺,但是从应用程序中删除了对框架5个区域之一的调用.我能够隔离可能导致iOS设备链接器问题的框架区域.我执行了与删除框架中的代码相同的过程,并且能够识别链接时导致错误的特定代码.我在框架的那个区域移动了代码,链接错误消失了.但是,我移动的代码是肤浅的,而我所做的只是将代码从一个函数移至新函数,然后从原始函数调用该函数.被移动的代码是:

Next I left the framework intact, but removed calls to one of the 5 areas in the framework from the application. I was able to isolate the framework area that would cause the linker issue for the iOS Device. I did the same process removing code in the framework and was able to identify specific code that when link against caused the error. I moved code around in that area of the framework and the link error went away. However the code that I moved was superficial and all I did was move the code from one function into a new function, and call that function from the original function. The code that was moved is:

// 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来比较framworks符号

我在iOS设备和模拟框架上运行了nm.两个版本之间有些差异,但没有任何变化

Using nm to compare the framworks symbols

I ran nm on the iOS device and simulated frameworks. There were some difference between the versions, but nothing that screamed

nm -j -a

-j仅显示符号名称(无值或类型). -a显示所有符号表条目,包括为调试器插入的符号表条目.

-j Just display the symbol names (no value or type). -a Display all symbol table entries, including those inserted for use by debuggers.

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仅显示全局(外部)符号.

    -j Just display the symbol names (no value or type). -g Display only global (external) symbols.

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

    nm -j -u

    -j仅显示符号名称(无值或类型). -u仅显示未定义的符号.

    -j Just display the symbol names (no value or type). -u Display only undefined symbols.

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

    可能的后续步骤

    是否有一个链接器标志告诉它吐出正在处理的内容,以便可以在声明之前看到它在做什么?

    Possible Next Steps

    Is there a linker flag to tell it to spit out what it is working on so I can see what it was doing just before the assertion?

    推荐答案

    升级到最新版本的Xcode(当前为4.1,不包括beta).这应该可以解决您的问题.

    Upgrade to the latest version of Xcode (currently 4.1, not including beta). This should solve your issue.

    这篇关于链接器错误声明失败:(atom-> fixupCount()== 1)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆