summaryrefslogtreecommitdiff
path: root/linker/linker_allocator.cpp
AgeCommit message (Collapse)Author
2019-01-25Move the linker allocator into libcRyan Prichard
Rename LinkerMemoryAllocator -> BionicAllocator Rename LinkerSmallObjectAllocator -> BionicSmallObjectAllocator libc and the linker need to share an instance of the allocator for allocating and freeing dynamic ELF TLS memory (DTVs and segments). The linker also continues to use this allocator. Bug: http://b/78026329 Test: /data/nativetest/bionic-unit-tests-static Test: /data/nativetest64/bionic-unit-tests-static Test: /data/nativetest/linker-unit-tests/linker-unit-tests32 Test: /data/nativetest64/linker-unit-tests/linker-unit-tests64 Change-Id: I2da037006ddf8041a75f3eba2071a8fcdcc223ce
2019-01-25Replace some of linker_allocator's header includesRyan Prichard
The <async_safe/log.h> include in linker_allocator.h was made unnecessary when the STL dependency was removed. Replace the linker_*.h header includes with private/bionic_*.h includes. This change prepares LinkerMemoryAllocator for use in libc allocating dynamic ELF TLS memory. Bug: http://b/78026329 Test: bionic unit tests Change-Id: I6ad62bd513e71dd3f91a4b724a92b19a1eb6c3b4
2018-12-12Further improve of linker memory allocatorsVic Yang
This includes: - Blocks allocated by small object allocators are now aligned to their block size. - Remove redundant free_blocks_cnt and allocated_blocks_cnt, as they sum up to a fixed number. - Remove a redundant padding word in small_object_page_info on 32-bit platform. Test: Build and boot cuttlefish. Change-Id: Ib922d7af739e3709e8a162c7f68e7f99bf95a914
2018-12-12Reduce LinkerSmallObjectAllocator memory overheadVic Yang
The current implementation of LinkerSmallObjectAllocator keeps record of pages in a vector, which uses its own page(s). This is at least a page overhead per LinkerSmallObjectAllocator. This change removes the page record vector by managing the pages in a doubly linked list. We also fix a bug where we are actually keeping up to 2 free pages instead of just one. The memory used by small objects when running 'dd', before this change: 72 KB [anon:linker_alloc_small_objects] 28 KB [anon:linker_alloc_vector] After this change: 60 KB [anon:linker_alloc_small_objects] Test: Boot cuttlefish and check memory used by linker. Change-Id: I3468fa4d853c78b4bc02bfb84a3531653f74fb17
2018-11-27Fix free pages count in LinkerSmallObjectAllocatorVic Yang
Free pages count should be incremented by 1 when a new page is allocated. Without this fix, free pages count underflows and the allocator ends up freeing a free page whenever the last object in that page is freed. In other words, it doesn't hold onto a free page as expected and thus we may see more mmap/munmap calls. Test: Set breakpoint at the end of __linker_init and check free_pages_cnt values are either 0 or 1. Change-Id: I259a3a27329aab6835c21b4aa7ddda89dac9655b
2018-08-22Add PR_SET_VMA and PR_SET_VMA_ANON_NAME to <sys/prctl.h>.Elliott Hughes
We've copied & pasted these to too many places. And if we're going to have another go at upstreaming these, that's probably yet another reason to have the *values* in just one place. (Even if upstream wants different names, we'll likely keep the legacy names around for a while for source compatibility.) Bug: http://b/111903542 Test: ran tests Change-Id: I8ccc557453d69530e5b74f865cbe0b458c84e3ba
2017-09-15Always log errno when aborting.Elliott Hughes
(Where errno is relevant.) Also consistently use -1 as the fd for anonymous mmaps. (It doesn't matter, but it's more common, and potentially more intention-revealing.) Bug: http://b/65608572 Test: ran tests Change-Id: Ie9a207632d8242f42086ba3ca862519014c3c102
2017-05-03Move libc_log code into libasync_safe.Christopher Ferris
This library is used by a number of different libraries in the system. Make it easy for platform libraries to use this library and create an actual exported include file. Change the names of the functions to reflect the new name of the library. Run clang_format on the async_safe_log.cpp file since the formatting is all over the place. Bug: 31919199 Test: Compiled for angler/bullhead, and booted. Test: Ran bionic unit tests. Test: Ran the malloc debug tests. Change-Id: I8071bf690c17b0ea3bc8dc5749cdd5b6ad58478a
2017-02-15Unify linker files under one license (BSD)Dimitry Ivanov
Historically we had part of the linker licensed under BSD and another part under Apache 2 license. This commit makes all the linker code licensed under BSD license. Test: m Change-Id: I11b8163ae75966b5768d3fe992679de376106515
2017-02-09Remove unnecessary memsets in linker allocatorsDimitry Ivanov
Test: linker-unit-tests Test: bionic-unit-tests --gtest_filter=dl*:Dl* Change-Id: I96f983dba77c9cb5698a9eb2e51b33bc128c6dd7
2016-07-29Improvements to initialization of linker_allocatorDimitry Ivanov
Make linker_allocator independent of the order of global constructors. Bug: http://b/30483811 Change-Id: I18a323175661b8e1c9e398f2d6112f7a08d2cceb Test: boot the device with I3ac91758a1a043146c65f2ae0f36fcfbe372c30f
2016-07-13Use trivial types to avoid calls to new for globalsDimitry Ivanov
To avoid initialization ordering problem avoid constructing non-trivial global objects for linker_logger. This patch also adds explicit check for bloc_size_ on alloc Change-Id: I2cb3b13a10b7fac1f52a20038af77266d3e1da96
2016-01-26Unify names for pages allocated for small objectsDimitry Ivanov
Bug: http://b/26776399 Change-Id: Id5b6f143a526cecca56de18ddad8857dfa1dd165
2016-01-21linker: align allocated blocks to 16 bytesDimitry Ivanov
C/C++ requires the result of malloc/new to be aligned for any primitive type. Change-Id: I715b7679e738f34b3b409993fb3ef242e1321b7f
2015-03-16General purpose memory allocator for linker.Dmitriy Ivanov
Add basic general purpose memory allocator to linker in order to enable usage of other libraries like libziparchive. Change-Id: I4a680ebb36ed5ba67c61249f81dba9f567808434
2015-03-10Refactoring: rename linker_allocator filesDmitriy Ivanov
Change-Id: Ifc08e64b3a85205f072b7abab1149c7ab71e2f75
2015-01-28Add missing includes.Elliott Hughes
Change-Id: Ibf549266a19a67eb9158d341a69dddfb654be669
2014-08-11Label pages mapped by linker_allocatorDmitriy Ivanov
Change-Id: I7e0bf29bc1a480e9be0d1ae573ca1063d90d82ff
2014-07-24Fix global variable initialization for linkerDmitriy Ivanov
Linker now calls init functions for itself. Change-Id: Ibd099812493041ac70f591e3f379ee742b4683b8
2014-05-14Improve detection of already loaded librariesDmitriy Ivanov
Linker is now able to resolve symlinked libraries correctly. soinfo is extended to save the graph of dependencies during load/unload. Dependencies are used only in CallConstructor. Bug: 9741592 Change-Id: Id9c48a74c46aa89bcdf3d54ec2f8ba3d398130b1
2014-05-14Fix for linker allocatorDmitriy Ivanov
Change-Id: I18a3f1a8515657f0deb69266184fb516a27f90e8
2014-05-13Remove page level mprotectsDmitriy Ivanov
Freeing block mprotects on the page which it turn may lead to application crash if linker subsequently tries to modify another block on the page. Bug: 14895266 Change-Id: I8ff7f5df467d7be184242de652032b3c84e24b76
2014-05-12Refactor linker allocatorDmitriy Ivanov
Makes it reusable for different fixed sized and not very big structures (<PAGE_SIZE). Change-Id: Id5ec13fc6541b1935ef7fe3671c22b98685abbae