Skip to content

Commit

Permalink
Fix global variable initialization for linker
Browse files Browse the repository at this point in the history
 Linker now calls init functions for itself.

(cherry picked from commit 4151ea7)

Change-Id: I3300fe22de8ad8466a5b1c2d551429769a42852d
  • Loading branch information
dimitry- committed Jul 24, 2014
1 parent 34b258d commit 6554996
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 21 deletions.
9 changes: 3 additions & 6 deletions linker/linker.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
9 changes: 2 additions & 7 deletions linker/linker_allocator.cpp
Expand Up @@ -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();
Expand Down
6 changes: 2 additions & 4 deletions linker/linker_allocator.h
Expand Up @@ -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);
Expand All @@ -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); }
Expand Down
4 changes: 0 additions & 4 deletions linker/tests/linker_allocator_test.cpp
Expand Up @@ -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);
Expand All @@ -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());
Expand All @@ -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();
Expand All @@ -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;
Expand Down

0 comments on commit 6554996

Please sign in to comment.