| Index: third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_loader.h
|
| diff --git a/third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_loader.h b/third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_loader.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4030f26c3e09d93449e898872d92999dbf15bad4
|
| --- /dev/null
|
| +++ b/third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_loader.h
|
| @@ -0,0 +1,87 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef CRAZY_LINKER_ELF_LOADER_H
|
| +#define CRAZY_LINKER_ELF_LOADER_H
|
| +
|
| +#include "crazy_linker_error.h"
|
| +#include "crazy_linker_system.h" // For ScopedFileDescriptor
|
| +#include "elf_traits.h"
|
| +
|
| +namespace crazy {
|
| +
|
| +// Helper class used to load an ELF binary in memory.
|
| +//
|
| +// Note that this doesn't not perform any relocation, the purpose
|
| +// of this class is strictly to map all loadable segments from the
|
| +// file to their correct location.
|
| +//
|
| +class ElfLoader {
|
| +public:
|
| + ElfLoader();
|
| + ~ElfLoader();
|
| +
|
| + // Try to load a library at a given address. On failure, this will
|
| + // update the linker error message and returns false.
|
| + //
|
| + // |lib_path| is the full library path, and |wanted_address| should
|
| + // be the desired load address, or 0 to enable randomization.
|
| + //
|
| + // |file_offset| is an offset in the file where the ELF header will
|
| + // be looked for.
|
| + //
|
| + // |wanted_address| is the wanted load address (of the first loadable
|
| + // segment), or 0 to enable randomization.
|
| + //
|
| + // On success, the library's loadable segments will be mapped in
|
| + // memory with their original protection. However, no further processing
|
| + // will be performed.
|
| + //
|
| + // On failure, returns false and assign an error message to |error|.
|
| + bool LoadAt(const char* lib_path,
|
| + off_t file_offset,
|
| + uintptr_t wanted_address,
|
| + Error* error);
|
| +
|
| + // Only call the following functions after a succesfull LoadAt() call.
|
| +
|
| + size_t phdr_count() { return phdr_num_; }
|
| + ELF::Addr load_start() { return reinterpret_cast<ELF::Addr>(load_start_); }
|
| + ELF::Addr load_size() { return load_size_; }
|
| + ELF::Addr load_bias() { return load_bias_; }
|
| + const ELF::Phdr* loaded_phdr() { return loaded_phdr_; }
|
| +
|
| +private:
|
| + FileDescriptor fd_;
|
| + const char* path_;
|
| +
|
| + ELF::Ehdr header_;
|
| + size_t phdr_num_;
|
| +
|
| + void* phdr_mmap_; // temporary copy of the program header.
|
| + ELF::Phdr* phdr_table_;
|
| + ELF::Addr phdr_size_; // and its size.
|
| +
|
| + off_t file_offset_;
|
| + void* wanted_load_address_;
|
| + void* load_start_; // First page of reserved address space.
|
| + ELF::Addr load_size_; // Size in bytes of reserved address space.
|
| + ELF::Addr load_bias_; // load_bias, add this value to all "vaddr"
|
| + // values in the library to get the corresponding
|
| + // memory address.
|
| +
|
| + const ELF::Phdr* loaded_phdr_; // points to the loaded program header.
|
| +
|
| + // Individual steps used by ::LoadAt()
|
| + bool ReadElfHeader(Error* error);
|
| + bool ReadProgramHeader(Error* error);
|
| + bool ReserveAddressSpace(Error* error);
|
| + bool LoadSegments(Error* error);
|
| + bool FindPhdr(Error* error);
|
| + bool CheckPhdr(ELF::Addr, Error* error);
|
| +};
|
| +
|
| +} // namespace crazy
|
| +
|
| +#endif // CRAZY_LINKER_ELF_LOADER_H
|
|
|