5

There are a couple questions with the same keywords as the title, however they focus on the iOS side of Objective-C. My problem is with a MacOS command line tool.

Basically what's happening is that the Foundation (Cocoa) tool is calling a C function which ends up calling another Foundation method. And as the Foundation method is being called from the C function, that's where the "Symbol not found: _objc_retainAutoreleasedReturnValue" error is being thrown at run time.

The code looks like this:

log.h

@interface Log : NSObject {

}

@end

void RemoveLogFile(NSString * theLogFile);

log.m

#import "Log.h"

@implementation Log

@end

// this is a C-style function
void RemoveLogFile(NSString * theLogFile)
{
    NSString * logFileName;

    NSLog( @"about to allocate a filename" );

// crash can happen in either case below
#if 1
    logFileName = [NSString stringWithFormat: @"%@.log", theLogFile];
#else
    logFileName = [[NSString alloc] initWithFormat: @"%@.log", theLogFile];
#endif

    NSLog( @"done allocating");
}

main.m

#import <Foundation/Foundation.h>
#import "Log.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSString* outPath = [[NSString alloc] initWithFormat: @"%@/MyLogFile", @"/tmp/"];
        NSLog( @"past out path alloc");
        RemoveLogFile(outPath);
        NSLog( @"done with the test");
    }
    return 0;
}

ARC is turned on for the 64-bit compiled tool (it can't be turned on for the 32-bit version) and the minimum supported MacOS version is 10.6.

When the tool is called in MacOS 10.7, it promptly crashes out with a log like this:

Process:         com.dautermann.Doughnuts [540]
Path:            /Library/PrivilegedHelperTools/com.dautermann.Doughnuts
Identifier:      com.dautermann.Doughnuts
Version:         ??? (1.0)
Code Type:       X86-64 (Native)
Parent Process:  launchd [1]

Date/Time:       2013-02-19 05:02:48.337 -0800
OS Version:      Mac OS X 10.7 (11A390)
Report Version:  8

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000

Application Specific Information:
objc[540]: garbage collection is OFF

Dyld Error Message:
  Symbol not found: _objc_retainAutoreleasedReturnValue
  Referenced from: /Library/PrivilegedHelperTools/com.dautermann.Doughnuts
  Expected in: /usr/lib/libobjc.A.dylib

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   dyld                            0x00007fff5fc0106d dyld_fatal_error + 1
1   dyld                            0x00007fff5fc04918 dyld::fastBindLazySymbol(ImageLoader**, unsigned long) + 128
2   libdyld.dylib                   0x00007fff925f0716 dyld_stub_binder_ + 13
3   ???                             0x0000000100004030 0 + 4294983728
4   com.dautermann.Doughnuts    0x0000000100001523 0x100000000 + 5411
5   com.dautermann.Doughnuts    0x0000000100001470 0x100000000 + 5232

My educated guess (with help from other folks) is that I may need to either pass in a "char *", or I have to declare something somewhere as "_unsafe_unretained". It sure seems like something that the modern Xcode 4.6 compiler should be handling for me.

Anyone have any guesses as to what I might be doing wrong?

Community
  • 1
  • 1
Michael Dautermann
  • 88,797
  • 17
  • 166
  • 215
  • 1
    These kinds of errors are caused by bad linking, or missing/corrupt libraries. Can you get to that dynamic library and run `nm` on it to see if that symbol exists. It exists in the text section (address 0x23055) of the binary on my system (OS X 10.7.5). – borrrden Feb 20 '13 at 01:23
  • `_objc_retainAutoreleasedReturnValue` is in the objc runtime, against which libraries is your tool linked? – JTAS Dec 06 '13 at 11:37
  • Firstly the Log.h/Log.m can just be a C style interface. You are not using the "Log" interface at all. Your log.h can just have the RemoveLog method and the .m can have the implementation of it. You can pass NSStrings to C style functions. I've done that before. Secondly, You need to link with a library like Foundation or something to avoid such linker errors. It could also be that the the framework you are currently linking with does not have that symbol on previous versions of the 10.7. – dimitrirostavo Jan 13 '15 at 22:38

0 Answers0