Menu

#4794 Compile error with --disable-load on Mac OS X

obsolete: 8.5.9
open
3
2011-02-16
2011-02-15
No

Platform: Mac OS X, version 10.4/10.5/10.6
The problem occurs on 10.6 as well, but is harder to reproduce there, see below.

When configured with --disable-load, the tclLoadDyld.c source is not built. However, tclIOUtil.c will use TclpLoadMemoryGetBuffer() and TclpLoadMemory() (both implemented in tclLoadDyld.c) if TCL_LOAD_FROM_MEMORY is #defined. This leads to missing symbols at link time:

gcc-4.2 -Os -arch i386 -D__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__=1050 -pipe -isysroot /Developer/SDKs/MacOSX10.5.sdk -arch i386 -D__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__=1050 -isysroot /Developer/SDKs/MacOSX10.5.sdk tclAppInit.o -L/Users/mth/prog/openmsx/tclbug-build -ltcl8.5 -framework CoreFoundation -sectcreate __TEXT __info_plist Tclsh-Info.plist \ -o tclsh
Undefined symbols:
"_TclpLoadMemoryGetBuffer", referenced from:
_TclLoadFile in libtcl8.5.a(tclIOUtil.o)
"_TclpLoadMemory", referenced from:
_TclLoadFile in libtcl8.5.a(tclIOUtil.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [tclsh] Error 1

I worked around the issue by modifying conifgure like this: (instead of unconditionally #defining TCL_LOAD_FROM_MEMORY on Darwin)

if test "$DL_OBJS" != "tclLoadNone.o"; then
cat >>confdefs.h <<\_ACEOF
#define TCL_LOAD_FROM_MEMORY 1
_ACEOF
fi

To reproduce the problem, it is essential to compile for OS X 10.4 or 10.5, since those contain Tcl 8.4 in the SDK while 10.6 contains Tcl 8.5 in the SDK and tclsh is linked to the systemwide libtcl instead to the one just built (maybe that is a bug in itself?). For convenience, I attached the script that I used to demonstrate the problem. It sets environment variables and compile flags to build for Mac OS X 10.5, even if you run it on 10.6.

Discussion

  • Maarten ter Huurne

    Script to reproduce the build problem

     
  • Jeffrey Hobbs

    Jeffrey Hobbs - 2011-02-15

    --disable-load is a legacy feature that should really be removed. I don't see a need to fix this - what is the desire for using this?

     
  • Jeffrey Hobbs

    Jeffrey Hobbs - 2011-02-15
    • priority: 5 --> 3
     
  • Maarten ter Huurne

    Originally I added --disable-load to work around bug 2902010. Since that bug is fixed now, I don't really need --disable-load anymore. However, I generally disable all features we don't need so the produced executable is smaller. I guess the binary loading feature is not that large though.

    It would be fine with me if you decide to drop --disable-load as a feature. If the feature continues to exist though, it would be better to fix this bug.

     
  • Kevin B KENNY

    Kevin B KENNY - 2011-02-16
    • assigned_to: kennykb --> das
     
  • Kevin B KENNY

    Kevin B KENNY - 2011-02-16

    Assigning to the maintainer of tclIOUtil.c on MacOSX. (I don't generally do MacOSX.)

     
  • Daniel A. Steffen

    the TCL_LOAD_FROM_MEMORY check in tcl/unix/configure.in should probably just be wrapped into a AS_IF([test "$DL_OBJS" == "tclLoadNone.o"], ....)