Ticket UUID: | 1204237 | |||
Title: | load command in HP (shl_load) picks wrong version of library | |||
Type: | Bug | Version: | obsolete: 8.4.9 | |
Submitter: | dwcollins | Created on: | 2005-05-18 12:38:49 | |
Subsystem: | 40. Dynamic Loading | Assigned To: | hobbs | |
Priority: | 5 Medium | Severity: | ||
Status: | Closed | Last Modified: | 2005-10-05 11:24:05 | |
Resolution: | Fixed | Closed By: | hobbs | |
Closed on: | 2005-10-05 04:24:05 | |||
Description: |
I think this is a follow on of several earlier bug reports in this area (notably 611108, but also 217820, 219140). If I run "load /home/dcollins/libtest.sl" within a stock tclsh, it actually ignores the path I've given it and searches SHLIB_PATH finding another copy of the same library. This is causing lots of head scratching during unit tests of our extensions, when any rebuilds don't seem to have any effect! I would expect it to use SHLIB_PATH, if I just run "load libtest.sl", or if it couldn't find it in the full path area, but not always! This was observed on HP-UX 11i, Solaris and linux seem to be behave as expected. From looking at 611108, I assume the behaviour is supposed to be as follows (but correct me if I'm wrong): 1. Convert the filename the user entered to a full native pathname and use that to load the library. 2. If that fails, pass the original string the user entered (raw filename, relative path or whatever) to the OS- specific "dlopen" command and let it us LD_LIBRARY_PATH/SHLIB_PATH to find a version of that library. I think that the implementation is correct for the tclLoadDl.c and tclLoadDld.c (i.e. Solaris, Linux, etc) but the HP implementation has a DYNAMIC_PATH flag that tells it to always use SHLIB_PATH, even in step 1 above. I've attached a patch that removes that flag for the first call to shl_load (the one with the full native path), the second call is left alone (since we want that to use the dynamic path variable). Can any other HP Tcl users' confirm/contradict that? I don't claim to be an expert on this, its mostly been trial and error, and I believe the whole shl_load mechanism is being replaced by the more usual dlopen for 64-bit, unfortunately we're stuck with 32-bit HP! | |||
User Comments: |
hobbs added on 2005-10-05 11:24:05:
Logged In: YES user_id=72656 Removal of the DYNAMIC_PATH for the first shl_load appears correct. I have commited that for 8.4.12 and 8.5a4. dwcollins added on 2005-05-31 18:05:45: Logged In: YES user_id=1093010 Forgot to mention, the fix for Bug 219140, when DYNAMIC_PATH was added in the first place, was back when only a single load attempt was made for any given shared library. Now, we do the "try a complete path, THEN try the path that the user entered" approach, I think we don't need DYNAMIC_PATH in the first attempt. If we leave it in the 2nd attempt, that should keep the original behaviour as it was before the 2-phase approach was added. dwcollins added on 2005-05-31 18:02:45: Logged In: YES user_id=1093010 I thought that was what the +s option on the linker was for though? Each binary and shared library has a flag that defines whether it uses SHLIB_PATH or has embedded paths to find associated libraries manpage for shl_load states: DYNAMIC_PATH: Allow the loader to dynamically search for the library specified by the path argument. The directories to be searched are determined by the +s and +b options of the ld command used when the program was linked. That suggests to me that if we are giving it a complete path, we don't need the flag, it only becomes useful if we give it a partial path. I don't claim to be an expert on HP's loading policies, it just seems odd that the end-user behaviour is different on HP than on Solaris for example. Feel free to downgrade the priority, its quite a low priority thing, I'd just feel happier if the behaviour was consistent across the platforms. hobbs added on 2005-05-31 09:19:45: Logged In: YES user_id=72656 Is this resolved then? dwcollins added on 2005-05-23 15:11:26: Logged In: YES user_id=1093010 Ah, I hadn't realised that. If that's the case, then I can see why its necessary. I'll play around with my test program a bit more then. kennykb added on 2005-05-21 02:28:30: Logged In: YES user_id=99768 The DYNAMIC_PATH arg is needed so that if you do load /path/to/foo.shl and foo.shl has a ref to some libbar.shl, that the dynamic linker will search the SHLIB_PATH for it. Or that's my understanding of why DYNAMIC_PATH got put there in the first place (Bug 219140). I don't have an HP-UX machine, forwarding to someone that does. dwcollins added on 2005-05-18 19:38:50: File Added - 134978: shl.diff |
Attachments:
- shl.diff [download] added by dwcollins on 2005-05-18 19:38:49. [details]