Menu

#4771 [load] broken

obsolete: 8.6b1.1
closed-fixed
9
2010-12-31
2010-12-30
Don Porter
No

Something happened to the HEAD in the last month:

$ cd tcl/unix
$ make distclean
$ ./configure --disable-shared
...
$ make test-tcl TESTFLAGS="-file load.test"
...
==== load-2.1 basic loading, with guess for package name FAILED
==== Contents of test case:

load [file join $testDir pkga$ext]
list [pkga_eq abc def] [lsort [info commands pkga_*]]

---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: cannot find symbol "Pkga_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkga.so: undefined symbol: _Pkga_Init
while executing
"load [file join $testDir pkga$ext]"
("uplevel" body line 2)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL LOOKUP LOAD_SYMBOL Pkga_Init
==== load-2.1 FAILED

==== load-2.2 loading into a safe interpreter, with package name conversion FAILED
==== Contents of test case:

load [file join $testDir pkgb$ext] pKgB child
list [child eval pkgb_sub 44 13] [catch {child eval pkgb_unsafe} msg] $msg [catch {pkgb_sub 12 10} msg2] $msg2

---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: cannot find symbol "Pkgb_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkgb.so: undefined symbol: _Pkgb_Init
while executing
"load [file join $testDir pkgb$ext] pKgB child"
("uplevel" body line 2)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL LOOKUP LOAD_SYMBOL Pkgb_Init
==== load-2.2 FAILED

==== load-2.4 loading with no _SafeInit procedure FAILED
==== Contents of test case:

list [catch {load [file join $testDir pkga$ext] {} child} msg] $msg

---- Result was:
1 {cannot find symbol "Pkga_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkga.so: undefined symbol: _Pkga_Init}
---- Result should have been (exact matching):
1 {can't use package in a safe interpreter: no Pkga_SafeInit procedure}
==== load-2.4 FAILED

==== load-3.1 error in _Init procedure, same interpreter FAILED
==== Contents of test case:

list [catch {load [file join $testDir pkge$ext] pkge} msg] $msg $::errorInfo $::errorCode

---- Result was:
1 {cannot find symbol "Pkge_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkge.so: undefined symbol: _Pkge_Init} {cannot find symbol "Pkge_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkge.so: undefined symbol: _Pkge_Init
while executing
"load [file join $testDir pkge$ext] pkge"} {TCL LOOKUP LOAD_SYMBOL Pkge_Init}
---- Result should have been (exact matching):
1 {couldn't open "non_existent": no such file or directory} {couldn't open "non_existent": no such file or directory
while executing
"open non_existent"
invoked from within
"if 44 {open non_existent}"
invoked from within
"load [file join $testDir pkge$ext] pkge"} {POSIX ENOENT {no such file or directory}}
==== load-3.1 FAILED

==== load-3.2 error in _Init procedure, slave interpreter FAILED
==== Contents of test case:

catch {interp delete x}
interp create x
set ::errorCode foo
set ::errorInfo bar
set result [list [catch {load [file join $testDir pkge$ext] pkge x} msg] $msg $::errorInfo $::errorCode]
interp delete x
set result

---- Result was:
1 {cannot find symbol "Pkge_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkge.so: undefined symbol: _Pkge_Init} {cannot find symbol "Pkge_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkge.so: undefined symbol: _Pkge_Init
while executing
"load [file join $testDir pkge$ext] pkge x"} {TCL LOOKUP LOAD_SYMBOL Pkge_Init}
---- Result should have been (exact matching):
1 {couldn't open "non_existent": no such file or directory} {couldn't open "non_existent": no such file or directory
while executing
"open non_existent"
invoked from within
"if 44 {open non_existent}"
invoked from within
"load [file join $testDir pkge$ext] pkge x"} {POSIX ENOENT {no such file or directory}}
==== load-3.2 FAILED

==== load-4.1 reloading package into same interpreter FAILED
==== Contents of test case:

list [catch {load [file join $testDir pkga$ext] pkga} msg] $msg

---- Result was:
1 {cannot find symbol "Pkga_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkga.so: undefined symbol: _Pkga_Init}
---- Result should have been (exact matching):
0 {}
==== load-4.1 FAILED

==== load-4.2 reloading package into same interpreter FAILED
==== Contents of test case:

list [catch {load [file join $testDir pkga$ext] pkgb} msg] $msg

---- Result was:
1 {cannot find symbol "Pkgb_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkga.so: undefined symbol: _Pkgb_Init}
---- Result should have been (exact matching):
1 {file "/home/dgp/cvs/tcl-only/unix/dltest/pkga.so" is already loaded for package "Pkga"}
==== load-4.2 FAILED

==== load-5.1 file name not specified and no static package: pick default FAILED
==== Contents of test case:

catch {interp delete x}
interp create x
load [file join $testDir pkga$ext] pkga
load {} pkga x
set result [info loaded x]
interp delete x
set result

---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: cannot find symbol "Pkga_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkga.so: undefined symbol: _Pkga_Init
while executing
"load [file join $testDir pkga$ext] pkga"
("uplevel" body line 4)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL LOOKUP LOAD_SYMBOL Pkga_Init
==== load-5.1 FAILED

==== load-7.4 Tcl_StaticPackage procedure, redundant calls FAILED
==== Contents of test case:

teststaticpkg Double 0 1
teststaticpkg Double 0 1
info loaded

---- Result was:
{{} Double} {{} More} {{} Another} {{} Test} {{} Tcltest}
---- Result should have been (exact matching):
{{} Double} {{} More} {{} Another} {{} Test} {/home/dgp/cvs/tcl-only/unix/dltest/pkge.so Pkge} {/home/dgp/cvs/tcl-only/unix/dltest/pkgb.so Pkgb} {/home/dgp/cvs/tcl-only/unix/dltest/pkga.so Pkga} {{} Tcltest}
==== load-7.4 FAILED

==== load-8.1 TclGetLoadedPackages procedure FAILED
==== Contents of test case:

info loaded

---- Result was:
{{} Double} {{} More} {{} Another} {{} Test} {{} Tcltest}
---- Result should have been (exact matching):
{{} Double} {{} More} {{} Another} {{} Test} {/home/dgp/cvs/tcl-only/unix/dltest/pkge.so Pkge} {/home/dgp/cvs/tcl-only/unix/dltest/pkgb.so Pkgb} {/home/dgp/cvs/tcl-only/unix/dltest/pkga.so Pkga} {{} Tcltest}
==== load-8.1 FAILED

==== load-8.3 TclGetLoadedPackages procedure FAILED
==== Contents of test case:

list [info loaded {}] [info loaded child]

---- Result was:
{{{} Double} {{} More} {{} Another} {{} Test} {{} Tcltest}} {{{} Test}}
---- Result should have been (exact matching):
{{{} Double} {{} More} {{} Another} {{} Test} {/home/dgp/cvs/tcl-only/unix/dltest/pkga.so Pkga} {{} Tcltest}} {{{} Test} {/home/dgp/cvs/tcl-only/unix/dltest/pkgb.so Pkgb}}
==== load-8.3 FAILED

==== load-8.4 TclGetLoadedPackages procedure FAILED
==== Contents of test case:

load [file join $testDir pkgb$ext] pkgb
list [info loaded {}] [lsort [info commands pkgb_*]]

---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: cannot find symbol "Pkgb_Init": /home/dgp/cvs/tcl-only/unix/dltest/pkgb.so: undefined symbol: _Pkgb_Init
while executing
"load [file join $testDir pkgb$ext] pkgb"
("uplevel" body line 2)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL LOOKUP LOAD_SYMBOL Pkgb_Init
==== load-8.4 FAILED

==== load-10.1 load from vfs FAILED
==== Contents of test case:
list [catch {load simplefs:/pkgd$ext pkgd} msg] $msg
---- Result was:
1 {cannot find symbol "Pkgd_Init": /tmp/tclO8NLQT: undefined symbol: _Pkgd_Init}
---- Result should have been (exact matching):
0 {}
==== load-10.1 FAILED
...

A full `make test` run reveals similar failing test
symptoms in pkgMkIndex.test and unload.test as well.

Discussion

  • Kevin B KENNY

    Kevin B KENNY - 2010-12-30

    Problem was introduced by Jan Nijtmans's build system changes dated 2010-12-13 addressing Bug 3135271. The attached patch reverts the offending change

     
  • Kevin B KENNY

    Kevin B KENNY - 2010-12-30
    • labels: 105678 --> 53. Configuration and Build Tools
    • assigned_to: kennykb --> nijtmans
     
  • Kevin B KENNY

    Kevin B KENNY - 2010-12-30

    Patch to revert commit addressing #3135271

     
  • Jan Nijtmans

    Jan Nijtmans - 2010-12-31

    I'll have a look. My first guess is that the test dll's are built using BUILD_tcl, which would indicate a problem with the test case, not really with Tcl.

     
  • Jan Nijtmans

    Jan Nijtmans - 2010-12-31

    The problem was that unix/dltest shares it's configure script with
    unix, which defines STATIC_BUILD in this case. But those packages
    should never built statically at all, even though Tcl is built statically.
    This STATIC_BUILD was causing the troubles here.

    Fixed in HEAD, it indeed was a problem in the test case, not
    with the load command.

     
  • Jan Nijtmans

    Jan Nijtmans - 2010-12-31
    • status: open --> closed-fixed
     
  • Don Porter

    Don Porter - 2011-01-04

    Hmmm... The "fix" was to make changes to the
    pkg*.c files. This means that something changed
    in Tcl so that now something has to be changed in
    source code of extensions to make them work again
    with Tcl 8.6 ? That doesn't sound like a good thing to
    me. What am I not getting?

    I fear that any existing extensions out there that were
    produced by copying the patterns of pkg*.c are going
    to be broken when used with Tcl 8.6. Please assure
    me that's not the case.

     
  • Donal K. Fellows

    _As I understand it_, what changed is that there was some simplification of the macros that govern visibility of symbols. For most code, it will continue as before and have no problems, but the pkg*.c files are extensions that are compiled with Tcl's own makefile, which is a bit of an unusual combination. (It's not an issue for the contributed packages because they use their own build systems; they have a different CFLAGS...)

     
  • Jan Nijtmans

    Jan Nijtmans - 2011-01-05

    >_As I understand it_ ....

    Yes, that understanding is correct. The problem is that the -DSTATIC_BUILD
    is taken over by the pkg*.c makefile, just because they don't have their
    own configure script. Maybe a better solution would be not to take over
    CFLAGS from Tcl anyway, I don't think any of them are really needed.
    Hmmm....

     
  • Jan Nijtmans

    Jan Nijtmans - 2011-01-05

    > ... simplification of the macros ...
    This 'simplifcation' was necessary for bug-fix #3135271.
    It appears that GCC > 4.0 was not a good criterion to
    decide whether -fvisibility=hidden is properly supported
    or not. In Tcl 8.6, which the introduction of
    -fvisibility=hidden, that shows horribly. TEA does
    not have -fvisibility support yet (and I don't plan
    to add that, as long as Tcl 8.6 is not mainstream).

    The solution to undefine STATIC_BUILD is not
    perfect. In fact, there is no reason to take over the
    -fvisibility=hidden flag, combination of both
    is actually what caused the problem. I don't
    know any extension - except tkImg ;-) - which
    uses -fvisibility=hidden, it only might be
    a problem with a GCC version which
    does not know __attribute__ ((visibility..)),
    But that means GCC < 3.3. See:
    <http://www.ohse.de/uwe/articles/gcc-attributes.html#func-visibility>
    And - even then - there is an easy workaround, -DNO_VIZ, which
    is handled by the latest TEA exactly in that situation.