Fix global variable initialization for linker
Linker now calls init functions for itself. Change-Id: Ibd099812493041ac70f591e3f379ee742b4683b8
This commit is contained in:
parent
7d22a45196
commit
4151ea73b7
@ -2077,12 +2077,6 @@ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args, ElfW(
|
||||
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);
|
||||
@ -2271,6 +2265,9 @@ extern "C" ElfW(Addr) __linker_init(void* raw_args) {
|
||||
_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;
|
||||
|
@ -28,17 +28,12 @@ struct FreeBlockInfo {
|
||||
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();
|
||||
|
@ -32,9 +32,8 @@ struct LinkerAllocatorPage;
|
||||
*/
|
||||
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);
|
||||
@ -60,8 +59,7 @@ class LinkerBlockAllocator {
|
||||
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); }
|
||||
|
@ -50,7 +50,6 @@ static size_t kPageSize = sysconf(_SC_PAGE_SIZE);
|
||||
|
||||
TEST(linker_allocator, test_nominal) {
|
||||
LinkerAllocator<test_struct_nominal> allocator;
|
||||
allocator.init();
|
||||
|
||||
test_struct_nominal* ptr1 = allocator.alloc();
|
||||
ASSERT_TRUE(ptr1 != nullptr);
|
||||
@ -67,7 +66,6 @@ TEST(linker_allocator, test_nominal) {
|
||||
|
||||
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());
|
||||
@ -79,7 +77,6 @@ TEST(linker_allocator, test_small) {
|
||||
|
||||
TEST(linker_allocator, test_larger) {
|
||||
LinkerAllocator<test_struct_larger> allocator;
|
||||
allocator.init();
|
||||
|
||||
test_struct_larger* ptr1 = allocator.alloc();
|
||||
test_struct_larger* ptr2 = allocator.alloc();
|
||||
@ -103,7 +100,6 @@ TEST(linker_allocator, test_larger) {
|
||||
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user