switch ( fOutputKind ) {
caseOptions::kDynamicExecutable:
if ( fEntryPointLoadCommandForceOn ) {
fEntryPointLoadCommand = true;
if ( fEntryName == NULL )
fEntryName = "_main";
}
elseif ( fEntryPointLoadCommandForceOff ) {
fNeedsThreadLoadCommand = true;
if ( fEntryName == NULL )
fEntryName = "start";
}
else {
// <rdar://problem/16310363> Linker should look for "_main" not "start" when building for sim regardless of min OS
if ( minOS(ld::mac10_8, ld::iOS_6_0) || fTargetIOSSimulator ) {
fEntryPointLoadCommand = true;
if ( fEntryName == NULL )
fEntryName = "_main";
if ( strcmp(fEntryName, "start") == 0 ) {
warning("Ignoring '-e start' because entry point 'start' is not used for the targeted OS version");
fEntryName = "_main";
}
}
else {
fNeedsThreadLoadCommand = true;
if ( fEntryName == NULL )
fEntryName = "start";
}
}
break;
.....................
macos 10.8 부터 강제로 _main 으로 점프하게 되어 있으며 ld 옵션 -e 옵션으로 지정해 주는 것도 막고 있다.
빌드 방법
as -c hello2.s -o hello2.o
ld -macosx_version_min 10.7 -o hello2 hello2.o
10.8 이상에서는
Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for inferred architecture x86_64