Tcl Source Code

View Ticket
Login
Ticket UUID: 3181906
Title: Compile error with --disable-load on Mac OS X
Type: Bug Version: obsolete: 8.5.9
Submitter: mthuurne Created on: 2011-02-15 08:27:18
Subsystem: 40. Dynamic Loading Assigned To: das
Priority: 3 Low Severity:
Status: Open Last Modified: 2011-02-16 10:38:06
Resolution: None Closed By:
    Closed on:
Description:
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.
User Comments: das added on 2011-02-16 10:38:06:
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"], ....)

kennykb added on 2011-02-16 08:59:19:
Assigning to the maintainer of tclIOUtil.c on MacOSX. (I don't generally do MacOSX.)

mthuurne added on 2011-02-16 04:44:44:
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.

hobbs added on 2011-02-16 04:28:35:
--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?

mthuurne added on 2011-02-15 15:27:18:

File Added - 401688: tclbug.sh

Attachments: