| Commit message (Expand) | Author | Age | Files | Lines |
| * | const-qualify the address argument to dladdr•••this agrees with implementation practice on glibc and BSD systems, and
is the const-correct way to do things; it eliminates warnings from
passing pointers to const. the prototype without const came from
seemingly erroneous man pages.
| Rich Felker | 2014-01-06 | 2 | -4/+4 |
| * | fix dynamic linker entry point for microblaze•••the ABI allows the callee to clobber stack slots that correspond to
arguments passed in registers, so the caller must adjust the stack
pointer to reserve space appropriately. prior to this fix, the argv
array was possibly clobbered by dynamic linker code before passing
control to the main program.
| Rich Felker | 2013-12-14 | 1 | -3/+4 |
| * | include cleanups: remove unused headers and add feature test macros | Szabolcs Nagy | 2013-12-12 | 1 | -0/+1 |
| * | add infrastructure to record and report the version of libc.so•••this is still experimental and subject to change. for git checkouts,
an attempt is made to record the exact revision to aid in bug reports
and debugging. no version information is recorded in the static libc.a
or binaries it's linked into.
| Rich Felker | 2013-12-01 | 1 | -2/+7 |
| * | remove duplicate includes from dynlink.c, strfmon.c and getaddrinfo.c | Szabolcs Nagy | 2013-11-25 | 1 | -3/+0 |
| * | fix uninitialized variable in dladdr•••the affected branch only applies for DSOs that lack standard hash
table and only have the GNU hash table present.
| Rich Felker | 2013-10-04 | 1 | -1/+1 |
| * | support configurable page size on mips, powerpc and microblaze•••PAGE_SIZE was hardcoded to 4096, which is historically what most
systems use, but on several archs it is a kernel config parameter,
user space can only know it at execution time from the aux vector.
PAGE_SIZE and PAGESIZE are not defined on archs where page size is
a runtime parameter, applications should use sysconf(_SC_PAGE_SIZE)
to query it. Internally libc code defines PAGE_SIZE to libc.page_size,
which is set to aux[AT_PAGESZ] in __init_libc and early in __dynlink
as well. (Note that libc.page_size can be accessed without GOT, ie.
before relocations are done)
Some fpathconf settings are hardcoded to 4096, these should be actually
queried from the filesystem using statfs.
| Szabolcs Nagy | 2013-09-15 | 1 | -0/+1 |
| * | do not use default when dynamic linker fails to open existing path file•••if fopen fails for a reason other than ENOENT, we must assume the
intent is that the path file be used. failure may be due to
misconfiguration or intentional resource-exhaustion attack (against
suid programs), in which case falling back to loading libraries from
an unintended path could be dangerous.
| Rich Felker | 2013-09-09 | 1 | -0/+2 |
| * | make dlopen honor the rpath of the main program•••this seems to match what other systems do, and seems useful for
programs that have their libraries and plugins stored relative to the
executable.
| Rich Felker | 2013-08-23 | 1 | -1/+1 |
| * | fix bugs in $ORIGIN handling•••1. an occurrence of ${ORIGIN} before $ORIGIN would be ignored due to
the strstr logic. (note that rpath contains multiple :-delimited paths
to be searched.)
2. data read by readlink was not null-terminated.
| Rich Felker | 2013-08-23 | 1 | -3/+9 |
| * | use AT_EXECFN, if available, for dynamic linker to identify main program•••fallback to argv[0] as before. unlike argv[0], AT_EXECFN was a valid
(but possibly relative) pathname for the new program image at the time
the execve syscall was made.
as a special case, ignore AT_EXECFN if it begins with "/proc/", in
order not to give bogus (and possibly harmful) results when fexecve
was used.
| Rich Felker | 2013-08-23 | 1 | -1/+5 |
| * | add rpath $ORIGIN processing to dynamic linker | Rich Felker | 2013-08-23 | 1 | -3/+59 |
| * | add recursive rpath support to dynamic linker•••previously, rpath was only honored for direct dependencies. in other
words, if A depends on B and B depends on C, only B's rpath (if any),
not A's rpath, was being searched for C. this limitation made
rpath-based deployment difficult in the presence of multiple levels of
library dependency.
at present, $ORIGIN processing in rpath is still unsupported.
| Rich Felker | 2013-08-23 | 1 | -12/+13 |
| * | work around libraries with versioned symbols in dynamic linker•••this commit does not add versioning support; it merely fixes incorrect
lookups of symbols in libraries that contain versioned symbols.
previously, the version information was completely ignored, and
empirically this seems to have resulted in the oldest version being
chosen, but I am uncertain if that behavior was even reliable.
the new behavior being introduced is to completely ignore symbols
which are marked "hidden" (this seems to be the confusing nomenclature
for non-current-version) when versioning is present. this should solve
all problems related to libraries with symbol versioning as long as
all binaries involved are up-to-date (compatible with the
latest-version symbols), and it's the needed behavior for dlsym under
all circumstances.
| Rich Felker | 2013-08-08 | 1 | -11/+14 |
| * | add system for resetting TLS to initial values•••this is needed for reused threads in the SIGEV_THREAD timer
notification system, and could be reused elsewhere in the future if
needed, though it should be refactored for such use.
for static linking, __init_tls.c is simply modified to export the TLS
info in a structure with external linkage, rather than using statics.
this perhaps makes the code more clear, since the statics were poorly
named for statics. the new __reset_tls.c is only linked if it is used.
for dynamic linking, the code is in dynlink.c. sharing code with
__copy_tls is not practical since __reset_tls must also re-zero
thread-local bss.
| Rich Felker | 2013-08-03 | 1 | -0/+13 |
| * | move RPATH search after LD_LIBRARY_PATH search•••this is the modern way, and the only way that makes any sense. glibc
has this complicated mechanism with RPATH and RUNPATH that controls
whether RPATH is processed before or after LD_LIBRARY_PATH, presumably
to support legacy binaries, but there is no compelling reason to
support this, and better behavior is obtained by just fixing the
search order.
| Rich Felker | 2013-08-02 | 1 | -2/+2 |
| * | if map_library has allocated a buffer for phdrs, free it on success too•••this fixes an oversight in the previous commit.
| Rich Felker | 2013-08-02 | 1 | -0/+1 |
| * | improve error handling in map_library and support long phdrs•••previously, errno could be meaningless when the caller wrote it to the
dlerror string or stderr. try to make it meaningful. also, fix
incorrect check for over-long program headers and instead actually
support them by allocating memory if needed.
| Rich Felker | 2013-08-02 | 1 | -12/+21 |
| * | fix uninitialized dyn variable in map_library•••this can only happen for invalid library files, but they were not
detected reliably because the variable was uninitialized.
| Rich Felker | 2013-08-02 | 1 | -1/+1 |
| * | fix theoretical out-of-bound access in dynamic linker•••one of the arguments to memcmp may be shorter than the length l-3, and
memcmp is under no obligation not to access past the first byte that
differs. instead use strncmp which conveys the correct semantics. the
performance difference is negligible here and since the code is only
use for shared libc, both functions are already linked anyway.
| Rich Felker | 2013-07-31 | 1 | -1/+1 |
| * | prevent passing PT_INTERP name to dlopen from double-loading libc•••the dev/inode for the main app and the dynamic linker ("interpreter")
are not available, so the subsequent checks don't work. in general we
don't want to make exact string matches to existing libraries prevent
loading new ones, since this breaks loading upgraded modules in
module-loading systems. so instead, special-case it.
the motivation for this fix is that calling dlopen on the names
returned by dl_iterate_phdr or walking the link map (obtained by
dlinfo) seem to be the only methods available to an application to
actually get a list of open dso handles.
| Rich Felker | 2013-07-31 | 1 | -6/+11 |
| * | add some sanity checks in dynamic loader code•••reject elf files which are not ET_EXEC/ET_DYN type as bad exec format,
and reject ET_EXEC files when they cannot be loaded at the correct
address, since they are not relocatable at runtime. the main practical
benefit of this is to make dlopen of the main program fail rather than
producing an unsafe-to-use handle.
| Rich Felker | 2013-07-31 | 1 | -0/+10 |
| * | fix bug where read error was treated as success reading library headers | Rich Felker | 2013-07-31 | 1 | -1/+1 |
| * | don't call null pointer if DT_INIT/DT_FINI are null•••it's not clear to me why the linker even outputs these headers if they
are null, but apparently it does so. with the default startfiles, they
will never be null anyway, but this patch allows eliminating crti,
crtn, crtbegin, and crtend (leaving only crt1) if the toolchain is
using init_array/fini_array (or for a C-only, no-ctor environment).
| Rich Felker | 2013-07-31 | 1 | -2/+2 |
| * | fix indention-with-spaces | Rich Felker | 2013-07-27 | 1 | -1/+1 |
| * | make ldd report the libc/dynamic linker itself | Rich Felker | 2013-07-26 | 1 | -0/+22 |
| * | fix computation of entry point and main app phdrs when invoking via ldso•••entry point was wrong for PIE. e_entry was being treated as an
absolute value, whereas it's actually relative to the load address
(which is zero for non-PIE).
phdr pointer was wrong for non-PIE. e_phoff was being treated as
load-address-relative, whereas it's actually a file offset in the ELF
file. in any case, map_library was already computing it correctly, and
the incorrect code in __dynlink was overwriting it with junk.
| Rich Felker | 2013-07-26 | 1 | -3/+1 |
| * | support STB_GNU_UNIQUE symbol bindings in dynamic linker•••these are needed for some C++ library binaries including most builds
of libstdc++. I'm not entirely clear on the rationale. this patch does
not implement any special semantics for them, but as far as I can
tell, no special treatment is needed in correctly-linked programs;
this binding seems to exist only for catching incorrectly-linked
programs.
| Rich Felker | 2013-07-24 | 1 | -1/+1 |
| * | move the dynamic linker's jmp_buf from static to automatic storage•••this more than compensates for the size increase of jmp_buf, and
greatly reduces bss/data size on archs with huge jmp_buf.
| Rich Felker | 2013-07-24 | 1 | -5/+7 |
| * | disable legacy init/fini processing on ARM•••since the old, poorly-thought-out musl approach to init/fini arrays on
ARM (when it was the only arch that needed them) was to put the code
in crti/crtn and have the legacy _init/_fini code run the arrays,
adding proper init/fini array support caused the arrays to get
processed twice on ARM. I'm not sure skipping legacy init/fini
processing is the best solution to the problem, but it works, and it
shouldn't break anything since the legacy init/fini system was never
used for ARM EABI.
| Rich Felker | 2013-07-22 | 1 | -0/+4 |
| * | add support for init/fini array in main program, and greatly simplify•••modern (4.7.x and later) gcc uses init/fini arrays, rather than the
legacy _init/_fini function pasting and crtbegin/crtend ctors/dtors
system, on most or all archs. some archs had already switched a long
time ago. without following this change, global ctors/dtors will cease
to work under musl when building with new gcc versions.
the most surprising part of this patch is that it actually reduces the
size of the init code, for both static and shared libc. this is
achieved by (1) unifying the handling main program and shared
libraries in the dynamic linker, and (2) eliminating the
glibc-inspired rube goldberg machine for passing around init and fini
function pointers. to clarify, some background:
the function signature for __libc_start_main was based on glibc, as
part of the original goal of being able to run some glibc-linked
binaries. it worked by having the crt1 code, which is linked into
every application, static or dynamic, obtain and pass pointers to the
init and fini functions, which __libc_start_main is then responsible
for using and recording for later use, as necessary. however, in
neither the static-linked nor dynamic-linked case do we actually need
crt1.o's help. with dynamic linking, all the pointers are available in
the _DYNAMIC block. with static linking, it's safe to simply access
the _init/_fini and __init_array_start, etc. symbols directly.
obviously changing the __libc_start_main function signature in an
incompatible way would break both old musl-linked programs and
glibc-linked programs, so let's not do that. instead, the function can
just ignore the information it doesn't need. new archs need not even
provide the useless args in their versions of crt1.o. existing archs
should continue to provide it as long as there is an interest in
having newly-linked applications be able to run on old versions of
musl; at some point in the future, this support can be removed.
| Rich Felker | 2013-07-21 | 1 | -8/+6 |
| * | fix order of fini_array execution for shared libs | Rich Felker | 2013-07-21 | 1 | -2/+2 |
| * | add support for init_array/fini_array ctors/dtors to dynamic linker | Rich Felker | 2013-07-20 | 1 | -2/+13 |
| * | make the dynamic linker find its path file relative to its own location•••prior to this change, using a non-default syslibdir was impractical on
systems where the ordinary library paths contain musl-incompatible
library files. the file containing search paths was always taken from
/etc, which would either correspond to a system-wide musl
installation, or fail to exist at all, resulting in searching of the
default library path.
the new search strategy is safe even for suid programs because the
pathname used comes from the PT_INTERP header of the program being
run, rather than any external input.
as part of this change, I have also begun differentiating the names of
arch variants that differ by endianness or floating point calling
convention. the corresponding changes in the build system and and gcc
wrapper script (to use an alternate dynamic linker name) for these
configurations have not yet been made.
| Rich Felker | 2013-07-18 | 1 | -1/+20 |
| * | fix invalid library phdr pointers passed to callback from dl_iterate_phdr•••map_library was saving pointers to an automatic-storage buffer rather
than pointers into the mapping. this should be a fairly simple fix,
but the patch here is slightly complicated by two issues:
1. supporting gratuitously obfuscated ELF files where the program
headers are not right at the beginning of the file.
2. cleaning up the map_library function so that data isn't clobbered
by the time we need it.
| Rich Felker | 2013-07-10 | 1 | -9/+16 |
| * | implement minimal dlinfo function | Rich Felker | 2013-06-29 | 2 | -0/+20 |
| * | fix missing synchronization in calls from dynamic linker to global ctors•••this change is needed to correctly handle the case where a constructor
creates a new thread which calls dlopen. previously, the lock was not
held in this case. the reason for the complex logic to avoid locking
whenever possible is that, since the mutex is recursive, it will need
to inspect the thread pointer to get the current thread's tid, and
this requires initializing the thread pointer. we do not want
non-multi-threaded programs to attempt to access the thread pointer
unnecessarily; doing so could make them crash on ancient kernels that
don't support threads but which may otherwise be capable of running
the program.
| Rich Felker | 2013-06-29 | 1 | -0/+4 |
| * | remove useless conditional before free from dynamic linker path code | Rich Felker | 2013-06-26 | 1 | -1/+1 |
| * | fix dynamic linker handling of empty path file or error reading path file•••previously, the path string was being used despite being invalid. with
this change, empty path file or error reading the path file is treated
as an empty path. this is preferable to falling back to a default
path, so that attacks to prevent reading of the path file could not
result in loading incorrect and possibly dangerous (outdated or
mismatching ABI) libraries from.
the code to strip the final newline has also been removed; now that
newline is accepted as a delimiter, it's harmless to leave it in
place.
| Rich Felker | 2013-06-26 | 1 | -4/+3 |
| * | make newline-delimited dynamic linker path file actually work•••apparently the original commit was never tested properly, since
getline was only ever reading one line. the intent was to read the
entire file, so use getdelim with the null byte as delimiter as a
cheap way to read a whole file into memory.
| Rich Felker | 2013-06-25 | 1 | -1/+1 |
| * | ensure that thread dtv pointer is never null to optimize __tls_get_addr | Rich Felker | 2013-06-03 | 1 | -4/+4 |
| * | make dynamic linker accept : or \n as path separator•••this allows /etc/ld-musl-$(ARCH).path to contain one path per line,
which is much more convenient for users than the :-delimited format,
which was a source of repeated and unnecessary confusion. for
simplicity, \n is also accepted in environment variables, though it
should probably not be used there.
at the same time, issues with overly long paths invoking UB or getting
truncated have been fixed. such issues should not have arisen with the
environment (which is size-limited) but could have been generated by a
path file larger than 2**31 bytes in length.
| Rich Felker | 2013-04-20 | 1 | -8/+8 |
| * | fix uninitialized map_len being used in munmap failure paths in load_library•••this bug seems to have been introduced when the map_library signatures
was changed to return the mapping in a temp dso structure instead of
into separate variables.
| Rich Felker | 2013-02-02 | 1 | -3/+2 |
| * | add support for RTLD_NOLOAD to dlopen•••based on patch by Pierre Carrier <pierre@gcarrier.fr> that just added
the flag constant, but with minimal additional code so that it
actually works as documented. this is a nonstandard option but some
major software (reportedly, Firefox) uses it and it was easy to add
anyway.
| Rich Felker | 2013-01-23 | 1 | -3/+7 |
| * | fix regression in dlsym: rejection of special RTLD_* handles as invalid | Rich Felker | 2013-01-23 | 1 | -1/+2 |
| * | fix warning building dynlink.c stub for static libc•••struct dso was not defined in this case, and it's not needed in the
code that was using it anyway; void pointers work just as well.
| Rich Felker | 2013-01-16 | 1 | -2/+2 |
| * | fix bug in dladdr that prevented resolving addresses in the PLT | Rich Felker | 2013-01-16 | 1 | -1/+1 |
| * | check for invalid handles in dlsym/dlclose•••this is wasteful and useless from a standpoint of sane programs, but
it is required by the standard, and the current requirements were
upheld with the closure of Austin Group issue #639:
http://austingroupbugs.net/view.php?id=639
| Rich Felker | 2013-01-10 | 1 | -1/+17 |
| * | fix breakage in ldd (failure to print library load address) | Rich Felker | 2012-12-15 | 1 | -2/+2 |
| * | fix ordering of shared library ctors with respect to libc init•••previously, shared library constructors were being called before
important internal things like the environment (extern char **environ)
and hwcap flags (needed for sjlj to work right with float on arm) were
initialized in __libc_start_main. rather than trying to have to
dynamic linker make sure this stuff all gets initialized right, I've
opted to just defer calling shared library constructors until after
the main program's entry point is reached. this also fixes the order
of ctors to be the exact reverse of dtors, which is a desirable
property and possibly even mandated by some languages.
the main practical effect of this change is that shared libraries
calling getenv from ctors will no longer fail.
| Rich Felker | 2012-11-30 | 1 | -3/+6 |