summaryrefslogtreecommitdiffstats
path: root/linker
Commit message (Collapse)AuthorAgeFilesLines
* Fix a TEMP_FAILURE_RETRY usage error in the linker.Elliott Hughes2012-07-271-5/+4
| | | | | | | | Similar to the fix in c20d0f3993ebb0d3dec958a306a68ebb48bfeadd. grep(1) says this was the only other instance in bionic. Change-Id: I1729038762ee1c7c4743a6bd11d5558afd6f5749
* Merge "linker: Fix LD_PRELOADS for calling constructors"Nick Kralevich2012-07-181-0/+5
|\
| * linker: Fix LD_PRELOADS for calling constructorsKito Cheng2012-07-151-0/+5
| | | | | | | | Change-Id: I1eae77a4c59e8a5acc009127d271455bb6fc01b6
* | Merge "bionic: Report linker relocation address to gdb"Elliott Hughes2012-07-161-7/+8
|\ \
| * | bionic: Report linker relocation address to gdbRyan V. Bissell2012-07-161-7/+8
| |/ | | | | | | | | | | | | | | | | | | | | | | GDB needs the runtime linker's base address in order to locate the latter's ".text" and ".plt" sections, for the purpose of detecting solib trampolines. It also can potentially use this to calculate the relocated address of rtld_db_dlactivity. Bug: http://code.google.com/p/android/issues/detail?id=34856 Change-Id: I63d3e7ae4e20a684ceb25967f2241e7d58dd685d Signed-off-by: Ryan V. Bissell <ryan@bissell.org>
* | linker: cleanup of undefined state handling, which is really dead codeRobin Burchell2012-07-161-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Given that _elf_lookup (and thus, _do_lookup) cannot possibly return an undefined symbol (due to the check for SHN_UNDEF in _elf_lookup), there's no need for spurious checks for SHN_UNDEF on its return value. Conflicts: linker/linker.c Change-Id: Ic73cf439924b45f72d4d9ba3f64a888c96cbbd9b
* | linker: Use SHN_UNDEF instead of describing what it is trying to do.Robin Burchell2012-07-161-2/+2
| |
* | Use std=gnu99 for the dynamic linker as well as libc.Elliott Hughes2012-07-161-1/+2
|/ | | | Change-Id: I76dd78576c5af6eb6282555f069647b6260edc31
* am 67636eea: am 40e7ed58: Unhide rtld_db_dlactivity()Andrew Hsieh2012-07-092-3/+3
|\ | | | | | | | | * commit '67636eea20f7789e6689ee8cf6017e7d48735ca1': Unhide rtld_db_dlactivity()
| * am 40e7ed58: Unhide rtld_db_dlactivity()Andrew Hsieh2012-07-092-3/+3
| |\ | | | | | | | | | | | | * commit '40e7ed58d73eae59d0cf2fed61284d16692e307b': Unhide rtld_db_dlactivity()
| | * Unhide rtld_db_dlactivity()Andrew Hsieh2012-07-022-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | Since linker is built with -fvisibility=hidden rtld_db_dlactivity() if hidden from gdb. Unhide it otherwise gdb may not know linker activity and rescan solib Change-Id: Ia8cd8d9738c6ea5696ba2ef0ebf2cf783f9ca70a
* | | linker: improve loadable segment protection.David 'Digit' Turner2012-06-262-442/+98
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Use the functions in linker_phdr.c to load the PT_LOAD segments in memory, and toggle their mapping's writable protection bit as needed. In particular: - when loading a library, load the segments then unprotected them to allow relocations to work. - when relocating the linker of the executable, unprotect the segments loaded by the kernel to make relocations work too. - after all relocations are done, re-protect the segments, and apply GNU RELRO protection if needed. - just before calling the destructors, undo the GNU RELRO protection. Change-Id: I50e709f03958204b8d6140c0f51ebe24fe089a1b
* | | linker: simplify code for dynamic and ARM exidx sections.David 'Digit' Turner2012-06-261-43/+14
| | | | | | | | | | | | | | | | | | | | | This moves the code that determines where the .dynamic and .ARM.exidx sections are to a single place in soinfo_link_image(). Change-Id: I98adcb440577bed86442349f03f3c629c945efec
* | | linker: rename load_offset to load_bias.David 'Digit' Turner2012-06-252-18/+43
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch changes the definition of the 'load_offset' field in struct soinfo. The field is renamed because it is not the basic load bias to add to every p_vaddr value read from the ELF file to get the corresponding memory address. This also slightly simplifies the relocation code. + Fix for proper load_bias computation for relocatable executables. Change-Id: I72502c75a70751cba324deee7d313ae61f96609e
* | | linker: avoid mapping the whole library before load.David 'Digit' Turner2012-06-251-111/+61
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch changes the load_library() function in the dynamic linker to avoid reserving a huge read-only address-space range just to read the ELF header and program header (which are typically very small and easily fit in the first page). Instead, we use the functions in linker_phdr.c to only load the data that we need in a temporary mmap-allocated page of memory, which we release when the function exits. This avoids issues when loading very large libraries, or simply debug versions that only need to load a tiny percentage of their overall file content in RAM. Change-Id: Id3a189fad2119a870a1b3d43dd81380c54ea6044
* | | linker: Add PAGE_START/OFFSET/END convenience macrosDavid 'Digit' Turner2012-06-251-18/+15
| | | | | | | | | | | | | | | | | | | | | This patch adds a few macros related to memory pages to help clarify some of the code in linker.c Change-Id: I36c727132d257b1497398dd0a9e8a5a4505467ca
* | | linker: New sources to manage the ELF program header table.David 'Digit' Turner2012-06-254-1/+795
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch introduces two new source files containing a set of functions to manage the program header table in an ELF binary, including the ability to load PT_LOAD segments, and apply PT_GNU_RELRO protection. Note: the files are not used currently, this will appear in a series of future patches that will gradually modify linker.c to use the phdr_table_xxx functions properly. Change-Id: Ia3d4c1ff5fc3e265d8258b64b492f4e643f51bdc
* | | Add module base to main executable's ARM_exidx.Evgeniy Stepanov2012-06-221-1/+1
| | | | | | | | | | | | | | | | | | BUG:6697872 Change-Id: I448f4b86397307086231776da38a7af334a75fe5
* | | am fa136e8c: am a5948157: Merge "Define __stack_chk_fail_local.S"Andrew Hsieh2012-06-202-1/+4
|\ \ \ | |/ / | | | | | | | | | * commit 'fa136e8ca71cb20956cd1792251869cac8bed257': Define __stack_chk_fail_local.S
| * | am a5948157: Merge "Define __stack_chk_fail_local.S"Andrew Hsieh2012-06-202-1/+4
| |\ \ | | |/ | |/| | | | | | | * commit 'a5948157fd34acb2b1d1bfaf129901af865ab5fc': Define __stack_chk_fail_local.S
| | * Define __stack_chk_fail_local.SAndrew Hsieh2012-06-212-1/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With -fstack-protector, x86 -m32 needs __stack_chk_fail_local defined in crtbegin_*.o. Include __stack_chk_fail_local.S in begin.S otherwise linker (which is built w/o crt*) may not link. Change-Id: Id242fcf3eff157264afe3b04f27288ab7991220a
| | * Make the linker relocatable.Nick Kralevich2012-05-153-44/+121
| | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, the linker always loaded itself into the same location in memory, which inhibited the effectiveness of Android's ASLR implementation. Modify the linker code so it can be relocatable and link itself at runtime. Change-Id: Ia80273d7a00ff648b4da545f4b69debee6343968
| | * linker: set LOCAL_NO_CRT := trueNick Kralevich2012-05-151-8/+3
| | | | | | | | | | | | | | | | | | | | | | | | Use LOCAL_NO_CRT to prevent linking against crtbegin.o, rather than messing with build rules. This also prevents linking against crtend.o, which isn't needed for the linker. Change-Id: I0c5b9999be7e8676560fe145c1c033ffce8db4d1
| | * linker: Fix the computation of si->baseDavid 'Digit' Turner2012-05-151-1/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The computation of si->base assumed that the first entry in the program header table is a PT_PHDR. This results in the dynamic linker crashing with a SIGSEGV/MAPERR when trying to load some of the NDK unit test programs, which happen to have an EXIDX header first, followed byu a PHDR one. This patch fixes the computation by parsing the program header table, looking explicitely for the PHDR entry. This fixes the load of the NDK unit test programs, and doesn't affect system libraries. Change-Id: Id18ea6037dbe950b5abbbce816c2960321f0b81d
| | * Add linker support for PIENick Kralevich2012-05-151-14/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Modify the dynamic linker so that executables can be loaded at locations other than 0x00000000. Modify crtbegin* so that non-PIC compilant "thumb interwork veneers" are not created by the linker. Bug: 5323301 Change-Id: Iece0272e2b708c79034f302c20160e1fe9029588
* | | linker: reduce size by nearly 20KBDavid 'Digit' Turner2012-06-191-0/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch adds a trivial implementation of snprintf() that calls our internal vsnprintf(). Inspection of the generated machine code showed that the linker contained a full implementation of stdio's vfprintf. It was pulled in because the pthread implementation uses snprintf() somewhere. ProTip: It's possible to see why specific objects files are included in a final binary by adding the following to your Android.mk, then looking at the content of /tmp/MAP.TXT: LOCAL_LDFLAGS += -Wl,-Map=/tmp/MAP.TXT Change-Id: I325e71b0cad1d01116a2e00c09e30a80cb716aa3
* | | linker: small code-cleanupDavid 'Digit' Turner2012-06-134-69/+68
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch adds to make the linker a little bit easier to understand by making all functions that acts on a sofino object with a soinfo_ prefix. This is to more easily distinguish functions that operate on global state, and those that operate on individual libraries. This should be purely stylistic, i.e. no feature/behaviour change. Change-Id: Ie510d13d743aa4317644caefa9910b8af7e84f44
* | | am e4db460a: am b7630f01: Use new debuggerd protocol.Jeff Brown2012-06-081-4/+23
|\ \ \ | |/ / | | | | | | | | | * commit 'e4db460a54e4f024b83a7df9a3f9920d695da9f3': Use new debuggerd protocol.
| * | Use new debuggerd protocol.Jeff Brown2012-06-061-4/+23
| | | | | | | | | | | | | | | Bug: 6615693 Change-Id: Ibfddc0de3fa2a882f7d0238ab797e5b29296b54b
* | | Support non-zero p_vaddr in first PT_LOAD segmentJi-Hwan Lee2012-06-042-40/+83
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Before changing mmap() permission to PROT_NONE in alloc_mem_region(), such libraries once worked with a bug that uses mmap'ed region outside of memory region allocated by alloc_mem_region(). This possibly incurs SIGSEGV because it can overwrite memory region of previously loaded library, but it sometimes worked, depending on loading order. After PROT_NONE, this caused SIGSEGV earlier during calculation of si->phdr in load_library(), but this was fixed by: 75917c84d16c35b8fceff6977fa717a3de9ef65d Use mmap to read an ... Now the behaviour is the same as before applying PROT_NONE in alloc_mem_region(). This CL fixed the original issue, supporting shared libraries that have non-zero p_vaddr in first (= with lowest p_vaddr) PT_LOAD segment. Bug: 6561258 Change-Id: Ib6176dd3e44c4d99a340eb1cbd16fb037586b0bc
* | | Use mmap to read an initial ELF header of libraryJi-Hwan Lee2012-05-261-18/+17
|/ / | | | | | | | | | | | | | | | | | | | | | | | | Also, fixes SIGSEV during calculation of si->phdr in load_library(), which is caused by accessing PHDR area, which is not guaranteed to be loaded. Note that this usually does not happen because program header area is covered by immediately following PT_LOAD entry. But it does not hold always. Bug: 6561258 Change-Id: Ie376253c773b5420279ca89044e81b1aad5a5736
* | linker: remove STB_LOCAL hackNick Kralevich2012-04-231-37/+0
| | | | | | | | | | | | | | | | The ARM static linker wasn't properly handling __exidx_start and __exidx_end symbols. Now that the static linker has been fixed, we don't need the dynamic linker to work around this problem. Change-Id: I041b94903609fafab33663a7d441a5e70b7ffcdd
* | Initialize TLS before any application code is run.Evgeniy Stepanov2012-04-131-17/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since e19d702b8e33, dlsym and friends use recursive mutexes that require the current thread id, which is not available before the libc constructor. This prevents us from using dlsym() in .preinit_array. This change moves TLS initialization from libc constructor to the earliest possible point - immediately after linker itself is relocated. As a result, pthread_internal_t for the initial thread is available from the start. As a bonus, values stored in TLS in .preinit_array are not lost when libc is initialized. Change-Id: Iee5a710ee000173bff63e924adeb4a4c600c1e2d
* | Revert "linker: remove STB_LOCAL hack"Nick Kralevich2012-04-101-0/+37
| | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 61ff83475c6f3a3bb05a01ac89d668a331bfe9e9. This code is harmless, and only applies to the linker, so there's no harm in keeping it in the tree a little bit longer. Let's roll this back while we try to figure out the root cause of bug 6314858. Bug: 6314858 Change-Id: I9f5ed81d23a7abe273baf792aa8a0a2839ef094c
* | linker: remove STB_LOCAL hackNick Kralevich2012-04-091-37/+0
| | | | | | | | | | | | | | | | The ARM static linker wasn't properly handling __exidx_start and __exidx_end symbols. Now that the static linker has been fixed, we don't need the dynamic linker to work around this problem. Change-Id: Ic567122b6c7746cc016795e2befba2c6bd7c0478
* | linker: surround "debug_verbosity" by "#if LINKER_DEBUG"Nick Kralevich2012-04-041-0/+5
| | | | | | | | | | | | | | Avoid executing useless code when we're not compiled with debugging support. Change-Id: Iea1821b241acacdf65d1a91d743356058dfef273
* | linker: enable -fvisibility=hiddenNick Kralevich2012-04-041-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Compile the linker with -fvisibility=hidden. This reduces the number of symbols that show up in the .dynsym section of the linker. These symbols are never exported to other applications. In particular, this fixes a problem with setting -DLINKER_DEBUG=1 introduced in 468319ce4f3f7383d788b76c09cda2a405311f36. Because the symbols "debug_verbosity" and "format_log" have not been resolved before the linker links itself, any attempt to call PRINT / INFO / TRACE / WARN / ERROR will result in a segfault. This change allows the static linker to produce a relative reference to these symbols rather than relying on relocation. This also has a nice side effect of making the linker slightly smaller and slightly more optimized. The following symbols no longer in the .dynsym section of the linker after this change: -addr_to_name -call_constructors_recursi -calloc -debugger_init -debugger_signal_handler -debug_verbosity -dladdr -dlclose -dlerror -dl_lock -dlopen -dlsym -dl_unwind_find_exidx -find_containing_library -find_containing_symbol -find_library -format_buffer -free -libdl_info -linker_env_get -linker_env_init -linker_env_secure -linker_env_unset -linker_get_error -__linker_init -lookup -lookup_in_library -malloc -notify_gdb_of_libraries -notify_gdb_of_load -notify_gdb_of_unload -realloc -rtld_db_dlactivity -unload_library -vsnprintf Bug: 5827809 Change-Id: I5e8cd7dcf48c1d6831a970a67f63f24916c5e437
* | Merge "linker: fix off-by-one error in GNU_RELRO handling"Nick Kralevich2012-03-201-2/+2
|\ \
| * | linker: fix off-by-one error in GNU_RELRO handlingNick Kralevich2012-03-201-2/+2
| | | | | | | | | | | | | | | | | | | | | Fix a bug where the GNU_RELRO end address could be exactly the end of the loadable segment. Change-Id: If6c43acabc06e9aff9217c0f6016e158b28bb41f
* | | linker: initially reserved memory as PROT_NONENick Kralevich2012-03-161-8/+6
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the dynamic linker loads a shared library into memory, it initially allocates a chunk of memory. The memory is then carved into smaller chunks for each LOAD region, and appropriate memory protections applied. Modify the initial memory allocation so that the pages are mapped as PROT_NONE, rather than PROT_READ / PROT_EXEC. This ensures that gaps between LOAD regions are not inadvertantly readable / executable. (Long term, we should munmap() these gaps entirely) Change-Id: If128a203ccc6fe12dcbbd2bfe0cf13a2045675af
* | Re-throw signalsAndy McFadden2012-03-081-0/+20
| | | | | | | | | | | | | | | | If we catch a fatal signal that won't automatically re-throw when the thread resumes, re-throw it manually. (Common examples are SIGPIPE and the SIGFPE from integer division by zero.) Change-Id: I329e6d4db907047c555957b42cbd09c50fc808e7
* | Merge "Log the thread id and name for fatal signals."Marco Nelissen2012-03-071-2/+13
|\ \
| * | Log the thread id and name for fatal signals.Marco Nelissen2012-03-071-2/+13
| | | | | | | | | | | | | | | | | | | | | This adds the thread id and name to the "Fatal signal" logging, making it easier to track down where in process it actually crashed. Change-Id: I17a365042b2f10b161debe98bc2e7070af055dfb
* | | Add relro supportNick Kralevich2012-03-053-7/+67
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add support for PT_GNU_RELRO. This allows the static linker to indicate that certain regions of memory should be marked as "read-only" after dynamic linking is complete. See: * http://www.akkadia.org/drepper/nonselsec.pdf (section 6) * http://tk-blog.blogspot.com/2009/02/relro-not-so-well-known-memory.html Note that this change has no effect on Android right now, because we don't compile our code with relro enabled. Change-Id: I6541f8775367e8558b4388f7d105b1ae6e8f046b
* | am 49a05c06: am 62daffe1: am f9c5afb1: Merge "Redesign dlopen() locks to be ↵Jean-Baptiste Queru2012-02-231-1/+1
|\ \ | |/ | | | | | | | | | | recursive per thread." * commit '49a05c060acd4d3e17b2819f00a694271bf40977': Redesign dlopen() locks to be recursive per thread.
| * Redesign dlopen() locks to be recursive per thread.Pavel Chupin2012-02-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | That is to fix the bug: dlxxx functions can't be called recursively. For example, if we use dlopen() to use open one library whose constructor also calls dlopen() in order to open another library, then the thread is dead-blocked. By changing the dl_lock from a non-recursive lock to a recursive lock, we can prevent the thread from dead-blocked by recursive dlxxx calls in the same thread context. Change-Id: I1018b41c82f4641cc009c0a2eda31f5a47a534f9 Signed-off-by: Pavel Chupin <pavel.v.chupin@intel.com> Signed-off-by: Jack Ren <jack.ren@intel.com> Signed-off-by: Bruce Beare <bruce.j.beare@intel.com>
* | am 5d7181a7: am 68fc85ff: am 177a7706: linker: fix x86 buildDavid 'Digit' Turner2012-02-011-1/+1
|\ \ | |/ | | | | | | * commit '5d7181a71c0b066fe6c19b9c5906bd694a399a59': linker: fix x86 build
| * linker: fix x86 buildDavid 'Digit' Turner2012-02-011-1/+1
| | | | | | | | Change-Id: I47d76a0f50515013c37ccef89accba03cc69529d
* | Merge c4cb87f3Jean-Baptiste Queru2012-02-015-218/+3
|\ \ | |/ | | | | Change-Id: I4cc14eba43fde75a7702fdc7ad07d3d949e9c092
| * remove obsolete SuperH supportDavid 'Digit' Turner2012-01-315-218/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We don't have a toolchain anymore, we don't have working original kernel headers, and nobody is maintaining this so there is really no point in keeping this here. Details of the patch: - removed code paths from Android.mk files related to the SuperH architecture ("sh") - removed libc/arch-sh, linker/arch-sh, libc/kernel/arch-sh - simplified libc/SYSCALLS.TXT - simplified the scripts in libc/tools/ and libc/kernel/tools Change-Id: I26b0e1422bdc347489e4573e2fbec0e402f75560 Signed-off-by: David 'Digit' Turner <digit@android.com>