Linker now calls init functions for itself.
Change-Id: Ibd099812493041ac70f591e3f379ee742b4683b8
ldpreload_env = linker_env_get("LD_PRELOAD");
}
- // Linker does not call constructors for its own
- // global variables so we need to initialize
- // the allocators explicitly.
- g_soinfo_allocator.init();
- g_soinfo_links_allocator.init();
-
INFO("[ android linker & debugger ]");
soinfo* si = soinfo_alloc(args.argv[0], NULL);
_exit(EXIT_FAILURE);
}
+ // lets properly initialize global variables
+ linker_so.CallConstructors();
+
// We have successfully fixed our own relocations. It's safe to run
// the main part of the linker now.
args.abort_message_ptr = &g_abort_message;
size_t num_free_blocks;
};
-LinkerBlockAllocator::LinkerBlockAllocator()
- : block_size_(0),
+LinkerBlockAllocator::LinkerBlockAllocator(size_t block_size)
+ : block_size_(block_size < sizeof(FreeBlockInfo) ? sizeof(FreeBlockInfo) : block_size),
page_list_(nullptr),
free_block_list_(nullptr)
{}
-void LinkerBlockAllocator::init(size_t block_size) {
- block_size_ = block_size < sizeof(FreeBlockInfo) ? sizeof(FreeBlockInfo) : block_size;
-}
-
-
void* LinkerBlockAllocator::alloc() {
if (free_block_list_ == nullptr) {
create_new_page();
*/
class LinkerBlockAllocator {
public:
- LinkerBlockAllocator();
+ explicit LinkerBlockAllocator(size_t block_size);
- void init(size_t block_size);
void* alloc();
void free(void* block);
void protect_all(int prot);
template<typename T>
class LinkerAllocator {
public:
- LinkerAllocator() : block_allocator_() {}
- void init() { block_allocator_.init(sizeof(T)); }
+ LinkerAllocator() : block_allocator_(sizeof(T)) {}
T* alloc() { return reinterpret_cast<T*>(block_allocator_.alloc()); }
void free(T* t) { block_allocator_.free(t); }
void protect_all(int prot) { block_allocator_.protect_all(prot); }
TEST(linker_allocator, test_nominal) {
LinkerAllocator<test_struct_nominal> allocator;
- allocator.init();
test_struct_nominal* ptr1 = allocator.alloc();
ASSERT_TRUE(ptr1 != nullptr);
TEST(linker_allocator, test_small) {
LinkerAllocator<test_struct_small> allocator;
- allocator.init();
char* ptr1 = reinterpret_cast<char*>(allocator.alloc());
char* ptr2 = reinterpret_cast<char*>(allocator.alloc());
TEST(linker_allocator, test_larger) {
LinkerAllocator<test_struct_larger> allocator;
- allocator.init();
test_struct_larger* ptr1 = allocator.alloc();
test_struct_larger* ptr2 = allocator.alloc();
static void protect_all() {
LinkerAllocator<test_struct_larger> allocator;
- allocator.init();
// number of allocs to reach the end of first page
size_t n = kPageSize/sizeof(test_struct_larger) - 1;