Patch 3458 : rld rollup #15 : [IRIX 6.5.1 6.5 6.4 6.3 6.2]
INDEX
RELATIONS
RELEASE NOTES
1. Patch SG0003458 Release Note This release note describes patch SG0003458 to IRIX 6.2, IRIX 6.3, IRIX 6.4, IRIX 6.5-SE, IRIX 6.5 and IRIX 6.5.1.1.1 Supported Hardware Platforms This patch contains bug fixes for all hardware platforms running IRIX6.2, IRIX6.3, IRIX6.4, IRIX 6.5-SE, IRIX 6.5 and IRIX 6.5.1.1.2 Supported Software Platforms This patch contains bug fixes to rld and rld.debug (all 3 ABIs) on a system running IRIX 6.2, IRIX 6.3, IRIX 6.4, IRIX 6.5-SE, IRIX 6.5 or IRIX 6.5.1. It also contains bug fixes to rqs, rqsall and related utilities. The patch is appropriate for systems with compiler_eoe from MIPSpro7.2.1 or earlier installed (on any of the applicable IRIX versions). This patch replaces patches SG0001266, SG0001270, SG0001336, SG0001384, SG0001584, SG0001681, SG0001932, SG0002044, SG0002261, SG0002458, SG0002715, SG0003054, SG0003135, SG0003247, and SG0003378. This patch is incompatible with patches SG0002226 and SG0002562. The software cannot be installed on other configurations. Please Note that when installing patch SG0003458 on IRIX 6.5.1m the compiler_eoe.sw64.unix subsystem may be displayed as a Downgrade (Bug #631053): DA patchSG0003458.compiler_eoe_sw64.unix [p] 1632+ .... To install this subsystem on IRIX 6.5.1m use the following commands under inst: Inst> i D Inst> set neweroverride on Inst> go Inst> quit1.3 Bugs Fixed by Patch SG0003458 This patch contains fixes for the following bugs in IRIX 6.2, IRIX 6.3, IRIX 6.4, IRIX 6.5-SE, IRIX 6.5 and IRIX 6.5.1. Bug numbers from Silicon Graphics bug tracking system are included for reference. o If an application did an sgidladd() or dlopen(...RTLD_GLOBAL), followed by a dlopen(...RTLD_LOCAL), (and the call to sgidladd/dlopen(...RTLD_GLOBAL) was itself done from a dlopened/dladded DSO) name lookups by rld might not find names made global by the sgidladd() or dlopen(...RTLD_GLOBAL). This was a bug introduced in patch 3378. (Bug #644389) o If a DSO or executable had more than 4096 conflict symbols, rqs could core dump. Now hash table is defined allowing up to 262,000+ conflict symbols (the max size allowed: if a smaller will work a smaller is used). (Bug #638915) o If a lazy-text-resolution call involved floating point argument registers and if a call in the -init code in the DSO loaded involved floating point registers the lazy-text call fp argument registers would be destroyed by the -init arguments. Due to details of argument register passing this bug is seen most readily with the n32/64 ABIs, though it can be reproduced in any of the ABIs (this bug has existed since IRIX5.0 but apparently no one had encountered it before!). (Bug #649041) o On delay-loads of DSO's, versions have been ignored for almost all earlier releases of rld. Now rld checks the version number on delay-loads too. The new _RLD_ARGS option -idv turns off DSO version checking for delay- loads in rld and rld.debug, restoring the old, broken behavior. (Bug #651001) o Debugger stack traces through rld would sometimes stop in rld due to mistakes in some hand-written assembly code in rld. Now the the stack traces show the callers back to main() as appropriate. (Bug #630359) o ssrun(1) could interact with rld, causing some -init functions to not run correctly. This fix corrects the rld part in this. [Note: it is erroneous for a signal handler to call dlopen(), dlclose() sgidladd(), sgidlopen_version(), dlsym(), or dlerror(). And no function call in a signal handler is allowed to cause a delay-load of a DSO (this is an implicit dlopen so is not correct). In fact very few functions are legally callable from a signal handler. the dl* functions are not so callable. It is up to applications to ensure such does not happen. ] (Bug #648641) The following bug fixes were originally provided in one or more of the patches replaced by this patch. o By default rld no longer re-evaluates name bindings on dlclose() (The _RLD_ARGS -f argument is accepted as also meaning use this new default behavior). This makes dlclose() fast and eliminates many lazy-text- resolves. It will also affect the operation of programs that rely on names being rebound to a different function/data item after a dlclose(). Such programs are erroneous. If _RLD_ARGS has the -s option present, the old slow method of dlclose is used (this is provided so erroneous programs depending on the old method can be made to work). [Details: Each name _should_ only be bound once by rld, but in complicated circumstances names can be rebound. If the result of application actions (like dlclose()) is that the rebinding finds a different external definition the result can be application problems or an application crash (rld does not realize this has happened and will not give a warning). (In addition, having a weak name defined in one DSO and a strong version in a DSO loaded later leads to 'undefined name bindings' and potentially inconsistent application behavior. This has always been true but not mentioned earlier.).] (Bug #426852) o Now rld obeys the general rule that processing is breadth-first (loading of DSOs from liblists and dlsym() name resolution are examples). [Details: In the past it did almost-breadth-first ordering. Because seeing an error in ordering required having duplicate symbol definitions at least 4 levels deep in DSO nested liblists, it is unlikely this bug affected any application. But the ABIs have always been clear and now rld obeys the ABIs.] (Bug #629117) o In the case of a dlclose(), all -fini execution is done for a set of DSOs (where this is the dlclose of the last reference) before any are unmapped. (Bug #629128) o Nested dlopen/sgidladd/delay-load (meaning invoking dlopen/sgidladd/delay-load from within the -init or -fini code of a dlopen/sgidladd/delay-load) now works even in the pthreads and sproc threads cases. Nested dlopen/sgidladd/delay-load was always problematical (though if no pthreads or sproc threads were in use it might have appeared to work as long as none of the nested dlopen/etc failed). Use nested dlopen/sgidladd only when absolutely required. Use -init only when absolutely required, as the nested dependencies make static prediction of the ordering in which the -init code is to be run difficult. C++ global constructors ordering across compiliation units has always been unspecified by the C++ definition. Adding delay-load to the set of DSOs with mutual constructor calls makes the ordering even less predictable. Using/setting sigprocmask(2) in -init or -fini code is not a good idea as the set of masks seen as ON is affected by rld. The precise behavior of sigprocmask(2) in -init or -fini code depends on which of 1) pthreads, 2) sproc threads, or 3) neither is in use (and the details are not specified in these release notes: best to avoid setting/resetting the sigprocmask() in -init or -fini code). In addition, it is still difficult to debug -init code in the application startup. (Bug #629707) o If the filesystem of a DSO had no XFS attributes, rqs could fail (refuse to update a DSO to allow quickstart) and fail to print the proper reason message. (The system would operate properly in spite of this rqs error.) Now rqs understands that ENOATTR is not really a failure, allowing the DSO to be requickstarted and uses strerror() to properly print all errno values when there is an error . (Bug #634151) o rld got delay load DSO visibility slightly wrong in MIPSpro7.2.1. Too restrictive in symbol visibility. (Bug #547873) o rld could (with rld.debug and messages turned on in an sproc family with signals happening) attribute a signal mask to the wrong sproc. Now has locking on the signal mask. (Has no meaningful effect if not using rld.debug) (Bug #549912) o Made messages rejecting a DSO more explicit as to reason. (Bug #554703) o rld was doing an incorrect empty version check. (Not known to have visible effect in practice). (Bug #558948) o Improved message in case mapping in DSO fails: explicitly list the DSO pathname (and reason). (Bug 558951). o Added DSO pathname on various rld warnings. (Bug #589044) o rqsall got stuck in an infinite loop on a circular set of l: lt: entries. (Bug #568510). o rld.debug was taking far too much stack space for certain debugging info. This lead to problems with small stacks (such as with pthreads apps). (BYG #583695) o rqs and rld incorrectly handled the 0th global entry of .got_2 thru the last .got_* section. This caused some multigot apps or DSOs to not function correctly (and possibly coredump). (Bug #608753) o Significantly reduce stack space use by rld.debug. (Bug #600777) o rqsall allowed one to leave off the 'ifile' filename argumment, which was not good, since that could leave one with an empty /var/inst/.rqsfiles. Now 'ifile' is required. Never made sense to leave off the input file name. (Bug #604402). o rld was not honoring RHF_NO_LIBRARY_REPLACE on LD_LIBRARY*_PATH. (Bug #608501) o The LL_REQUIRE_MINOR flag (ld(1) -require_minor option) was ignored by MIPSpro7.2 and later rld. Now it is honored again. (Bug #613651) o rld smaller by 20KBytes or so. (Bug #615089) (Bug #614133) o Rld made faster: small quickstarted apps are about 3% faster (as measured by /bin/time). (Bug #615441) o Rld is now faster: sped up dlopen, sgidladd, sgidlopen_version functions. (Bug #620471) o Erroneous calls to sgidlopen_version() with version argument such as "sgi2.0:sgi2.1" (instead of the correct "sgi2.0" or perhaps "sgi2.1" for example) were briefly not accepted by rld. The erroneous "sgi2.0:sgi2.1" is again accepted and treated like "sgi2.0" (though if LL_REQUIRE_MINOR is set in the flags argument to the sgidlopen_version call (with version string argument "sgi2.0:sgi2.1") rld will still fail to match any DSO version, as in previous releases). (Bug #625960) o major 6.5-only security bug in rld. (Bug #601823) o Rld could place an invalid address (0xffffffff) into the GOT for symbols listed on a DSO's conflict list and all of whose definitions were contained in delay-load libraries which had not yet been loaded. (Bug #586353) o Rld failed to dlclose dlopened DSOs at program exit. Rld also ran fini code in an arbitrary order, rather than the reverse of the order that the corresponding init code was processed. (Bug #575110 and Bug #578951) o Rld could fail to correctly resolve conflict symbols during lazy text resolution. This was most frequently observed in quickstarted programs which provide their own implementation of the malloc family of functions and reference the overridden malloc from dlopened DSOs. (Bug #565027) o Rld performed unnecessary writes to copy-on-write memory pages. This caused the memory footprint of incompletely quickstarted programs to be larger than necessary. (Bug #564479) o Any program using -clearstack (including all 64bit mips abi programs) would get a bus error in rld_newmain.s because it used a 32-bit subtract on a 64bit stack pointer, accidently trashing it (Bug #549580) o This patch provides rld and rqs binaries which are required to run code compiled with the 7.2.1 linker multigot feature (Bug #546958). This patch should be installed if patch SG0002715 or one of its successor patches is present. o Rld fails to handle multigot shared objects that are relocated (Bug #534245) o Rqs fails to handle multigot shared objects that are relocated. This is the same as bug number 534245 in rld (Bug #536186). o Rld could hang when outputting error messages or warnings in multithreaded programs. Whether a hang actually occurred would depend upon the timing of events and rld processing requirements (Bug #520846). o Cosmoplayer (the VRML display software) was unable to load most worlds due to incorrect symbol preemption in DSOs containing symlib tables. The problem could affect other applications as well (Bug #523673). o Rld could, under some circumstances, unnecessarily reprocess conflict symbols. This conflict resolution could be time-consuming for apps dlopening libraries containing many conflict symbols at startup (Bug #554894) o Sgidlopen_version failed to return handles for versioned DSOs when version lookup required searching for DSOs whose filenames had been suffixed with the major version number (e.g., libfoo.so.2) This was a regression from the rld in the 7.1 compiler release (Bug #560586). o At runtime, rld uses the timestamp of a dso as the key to determine if this is the actual dso against which we originally linked. It depends upon timestamps of dso's to be unique. It assumes there can never be two different dso's with the same soname and same timestamp. Rqsall (and rqs) run so fast that it is possible for two libraries with the same soname to get the same timestamp. [ex. rqs'ing mips3/libm.so and mips4/libm.so] Rqsall now assigns unique timestamps to libraries with the same soname. (Bug #538535) o Rqsall has been updated to do a better job of assigning load addresses to DSOs. It now honors reasonable values of $start_address in the so_locations files (Bug #556199), computes library sizes accurately (Bug #561583), uses appropriate upper and lower address bounds for laying out o32, n32 and n64 libraries (Bug #566180). The -move option now provides a mechanism for forcing a full requickstart of the installed DSOs. New load addresses are assigned to each DSO, packing them as tightly as possible. (Bug #555509) o A multigot DSO that moves at run time could coredump the application due to incorrect handling of relocations. (Bug #534245) o This patch has a correction for a bug in LD_LIBRARY_PATH handling introduced in patch SG0002261 (SG0002261 was withdrawn and is not available because of the bug). (Bug #530749) o If a circular DSO liblist dependency exists the dlopen() reference counting was wrong resulting in an extra reference being counted. This could mean that on dlclose() that the reference count did not decrement to 0 (ever) and that any -fini code would not be run on the affected DSO. Circular liblist dependencies (even indirect) are a bad thing and the order of execution of -init and -fini code is undefined. But at least now the reference count is correct. (Bug #527001) o Delay-loading DSOs could be slow if there were a lot of DSOs. Now in many cases delay-loading is faster. (Bug #506076) o The static size of rld's text is now significantly smaller than previous versions. (Bug #506166). o Confusing messages about OEX flags (rarely seen) are now easier to understand. (Bug #507206) o A completely useless warning about a DSO not being the right ABI (useless because rld simply keeps looking for the right DSO anyway) is now suppressed unless the environment variable _RLD_ARGS has the -v option. (Bug 503926) o Previous patches fixing the problems noted below (such as 2044) could fail to replace a *.sw32 subsystem: that subsystem no longer exists (it did in patch SG0001584 for example) so leaving it behind was a mistake in patch SG0002044. The rld set here is identical to the rld set in patch SG0002044, but the installation 'replaces' rules have been adjusted to clean up the installation database on any IRIX 6.2 6.3 or 6.4 system this patch is installed on (the parts of that installation database that relate to rld). o When running a setuid/setgid program rld could be tricked into creating a security hole. Now rld ignores the -log option of the _RLD_ARGS environment variable for setuid/setgid programs unless the real user is root (in addition, rld continues to ignore some environment variables when handling setuid/setgid programs run by non-root users to avoid security holes). (Bug #482870) o When running a multigot DSO (a very very very unusual DSO) rld could coredump if the DSO was moved when loaded. (Bug #483964) o rld could hang a pthreads process if one or more threads called fork(2) or if there were multiple threads on a single sproc process-id or if a thread moved from one process-id to another (in an sproc group). Whether a hang occurred depended on the timing of events and how the events happened to relate to rld processing. In addition, an annoying message about "GUARANTEE INIT" could be emitted by rld when the message was inappropriate (with certain processes/libraries using pthreads). (Bug #412725) o rld could coredump if it thought it had allocated an internal table (the msym table) but in reality the compilation system had built it: writing to the compiler-system-built table is an error (it is in read-only memory) and unnecessary. (Bug #449282) o If a program did a series of dlclose(3)s and sproc(2)s quickly enough and the timing was just right rld would hang, hanging the program. The program was killable, but the sproc-thread could not be continued and the program run was normally useless as a result of the hang. (Bug #433288) o The runtime linker corrupts the user's data segment when long LD_LIBRARY_PATH is specified. It usually results in segmentation fault while running the user application. (Bug #337982) o The runtime linker does not fix-up binaries with prefetch instructions correctly when the binaries are run on r8000 machines. This fix is only effective if one of the kernel rollup patches in the series beginning with patch SG0001722 is also installed (as of the writing of these release notes the latest kernel rollup patch is patch SG0002187, but be sure to check with with your patch provider about kernel rollup patches). The runtime linker may emit a message like "Cannot open <executable> to fix up prefetches" on attempting to run a binary with prefetches (such as a binary compiled for the R10000) on an R8000 CPU if one of the kernel patches is not installed. (Bug #352206) o The runtime linker would core dump on pixified binaries if those binaries contain prefetch instructions. (Bug #383655) o The runtime linker loops when 2 delay-loaded libraries are linked into the same executable and the 2 libraries are inter-dependent on each other. Also, the performance of the libdl routines are not acceptable in big applications when hundreds of libraries are loaded using dlopen calls. (Bug #361758) o Specifing LD_LIBRARY_PATH with more than approximately 500 characters causes rld to dump core. (Bug #337982) o The runtime linker loops in dlsym call. (Bug #364118) o The runtime linker loops when dlopen'ing libraries that have inter-dependencies. (Bug #290198) o Initialized COMMON block variables have incorrect values. (Bug #387407) o Dlopen(...,RTLD_NOW) does not report undefined symbols. (Bug #428927) o rqs will sometimes write an incorrect value to the zero-th entry of the global-offset-table(GOT) of a C++ shared object or executable. This resulted in segmentation fault when the executable or shared object containing the bad value is used. (Bug #366990).1.4 Subsystems Included in Patch SG0003458 This patch release includes these subsystems: o patchSG0003458.compiler_eoe_sw.unix o patchSG0003458.compiler_eoe_sw64.unix o patchSG0003458.compiler_eoe_man.dso o patchSG0003458.compiler_eoe_man.unix o patchSG0003458.compiler_eoe.hdr.lib o patchSG0003458.compiler_dev.hdr.lib1.5 Installation Instructions Because you want to install only the patches for problems you have encountered, patch software is not installed by default. After reading the descriptions of the bugs fixed in this patch (see Section 1.3), determine the patches that meet your specific needs. If, after reading Sections 1.1 and 1.2 of these release notes, you are unsure whether your hardware and software meet the requirements for installing a particular patch, run inst. The inst program does not allow you to install patches that are incompatible with your hardware or software. Patch software is installed like any other Silicon Graphics software product. Follow the instructions in your Software Installation Administrator's Guide to bring up the miniroot form of the software installation tools. Follow these steps to select a patch for installation: 1. At the Inst> prompt, type install patchSGxxxxxxx where xxxxxxx is the patch number. 2. Initiate the installation sequence. Type Inst> go 3. You may find that two patches have been marked as incompatible. (The installation tools reject an installation request if an incompatibility is detected.) If this occurs, you must deselect one of the patches. Inst> keep patchSGxxxxxxx where xxxxxxx is the patch number. 4. After completing the installation process, exit the inst program by typing Inst> quit1.6 Patch Removal Instructions To remove a patch, use the versions remove command as you would for any other software subsystem. The removal process reinstates the original version of software unless you have specifically removed the patch history from your system. versions remove patchSGxxxxxxx where xxxxxxx is the patch number. To keep a patch but increase your disk space, use the versions removehist command to remove the patch history. versions removehist patchSGxxxxxxx where xxxxxxx is the patch number.1.7 Known Problems INST SUBSYSTEM REQUIREMENTS No Requirements Information Available. INST SUBSYSTEM CHECKSUMS These checksums help to provide a 'signature' for the patch inst image which can be used to authenticate other inst images. You can obtain this kind of output by running sum -r on the image (from the command line): 31952 2 patchSG0003458.compiler_dev_hdr 64109 88 patchSG0003458.compiler_eoe_man 31952 2 patchSG0003458.compiler_eoe_hdr 04079 48 patch/README.patch.3458 26384 3660 patchSG0003458.compiler_eoe_sw 30950 7 patchSG0003458.idb 44155 18 patchSG0003458 INST SUBSYSTEM FILE LISTINGS The following lists the files which get installed from each subsystem in the patch:
DOWNLOAD PATCH
|
||||||||||||||||||||||||||||||||||||
Document Id: 20021117073632-IRIXPatch-1323
|