|
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> quit
1.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.lib
1.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> quit
1.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
|
||||||||||||||||||||||||||||||||||||