tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

macosx using wrong SDK - serious build issue



I have mostly understood this problem, but not quite how to fix it.

in mk/platform/Darwin.mk, we use

  "/usr/bin/xcrun --show-sdk-path"

to find the location for the include files and libs.

On a macosx10.9 machine, this prints out:

  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk

which is great if you want to cross-build programs to run under
10.10....  But if you want them to run on 10.9, then the following:

  "/usr/bin/xcrun --sdk macosx10.9 --show-sdk-path"

leads to a more sensible:

  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk

(It's obvious how to write code to convert uname output to an argument
for xcrun, but I haven't because it isn't obvious that is the right
approach.)

However, hardcoding that change in Darwin.mk fixes the substituted paths
in the wrappers, but builds (cvs and tmux, to pick two examples) still
end up with 10.10 paths in the .deps/ directories and cvs finds openat(),
present in 10.10 but not 10.9.

The problem seems to be that clang builds against the 10.10 SDK by
default.  Our wrappers don't pass "-nobuiltininc", nor do they pass the
path found from xcrun.

I'm convinced this needs fixing, but am unclear on exactly how.  What I
think we want is:

  we figure out the sdk version to use from uname, at bootstrap time, or
  at runtime.  (In NetBSD, it's runtime, because /usr/include has
  headers for the current system, so runtime seems like the best
  approach in terms of not creating surprises.)

  clang is told not to search default include paths

  clang is told to add the SDK include paths

It seems really buggy to me that apple-provided clang is behaving this
way.

The following program:
----------------------------------------
#include <stdlib.h>
#include <sys/fcntl.h>

int
main()
{
  openat(0, "/dev/null", O_RDONLY);

  exit(0);
}
----------------------------------------
when built as "clang -o foo foo.c" builds on 10.9.  But running it gives
me the same error as CVS:

$ ./foo 
dyld: lazy symbol binding failed: Symbol not found: _openat
  Referenced from: /Users/gdt/./foo
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: _openat
  Referenced from: /Users/gdt/./foo
  Expected in: /usr/lib/libSystem.B.dylib

Trace/BPT trap: 5

Running it on NetBSD 6, I get the friendlier:

  3242      1 foo      CALL  openat(0,0x80487c8,0,0xbfbfe9e0)
  3242      1 foo      RET   openat -1 errno 78 Function not implemented


When I do pass -nobuiltininc, clang still seems to find the prototype
for openat.

Attachment: pgpSmEwi_ElyW.pgp
Description: PGP signature



Home | Main Index | Thread Index | Old Index