Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Unified Diff: third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_relro.h

Issue 23717023: Android: Add chrome-specific dynamic linker. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase to fix build. Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_relro.h
diff --git a/third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_relro.h b/third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_relro.h
new file mode 100644
index 0000000000000000000000000000000000000000..0f2591ad0e25e9ff1a7ec8fa7c55537a185546b9
--- /dev/null
+++ b/third_party/crazy_linker/crazy_linker/src/crazy_linker_elf_relro.h
@@ -0,0 +1,83 @@
+// 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_RELRO_H
+#define CRAZY_LINKER_ELF_RELRO_H
+
+#include "crazy_linker_ashmem.h"
+#include "crazy_linker_memory_mapping.h"
+#include "crazy_linker_system.h"
+#include "elf_traits.h"
+
+namespace crazy {
+
+class ElfView;
+
+// A class used to model a shared RELRO section backed by an Ashmem region.
+// The region is always owned by the SharedRelro, unless DetachFd() is called.
+// The SharedRelro may or may not be mapped into the process.
+class SharedRelro {
+ public:
+ // Create a new SharedRelro. Note that the object becomes the owner of
+ // |ashmem_fd|, unless DetachFd() is called after this.
+ SharedRelro() : start_(0), size_(0), ashmem_() {}
+
+ ~SharedRelro() {}
+
+ size_t start() const { return start_; }
+ size_t end() const { return start_ + size_; }
+ size_t size() const { return size_; }
+ int fd() const { return ashmem_.fd(); }
+
+ // Return the ashmem region's file descriptor, and detach it from the object.
+ // After this call, fd() will always return -1.
+ int DetachFd() { return ashmem_.Release(); }
+
+ // Allocate a new ashmem region of |relro_size| bytes for |library_name|.
+ // This operation doesn't change the process' mappings. On error, return
+ // false and set |error| message.
+ bool Allocate(size_t relro_size, const char* library_name, Error* error);
+
+ // Copy the content of the current process' RELRO into the ashmem region.
+ // |relro_start| is the RELRO address (page-aligned).
+ // |relro_size| is the RELRO size in bytes (page-aligned), and must match
+ // the allocation size passed to Allocate().
+ // On failure, return false and set |error| message.
+ bool CopyFrom(size_t relro_start, size_t relro_size, Error* error);
+
+ // Copy the contents of the current process' RELRO into the ashmem region
+ // but adjust any relocation targets within it to correspond to a new
+ // |load_address|. |view| must point to a mapped ELF binary for the current
+ // library. |relro_start| corresponds to the address of the current
+ // process' RELRO, i.e. is not relocated.
+ bool CopyFromRelocated(const ElfView* view,
+ size_t load_address,
+ size_t relro_start,
+ size_t relro_size,
+ Error* error);
+
+ // Force the section to be read-only.
+ bool ForceReadOnly(Error* error);
+
+ // Map the ashmem region's pages into the current process, doing a comparison
+ // to avoid corrupting parts of the RELRO section that are different in this
+ // one (e.g. due to symbolic relocations to randomized system libraries).
+ // This operation is _not_ atomic, i.e. no other thread should try to execute
+ // code that reads from the RELRO region during this call.
+ // On failure, return false and set |error| message.
+ // This operation does not transfer ownership of |ashmem_fd| to the object.
+ bool InitFrom(size_t relro_start,
+ size_t relro_size,
+ int ashmem_fd,
+ Error* error);
+
+ private:
+ size_t start_;
+ size_t size_;
+ AshmemRegion ashmem_;
+};
+
+} // namespace crazy
+
+#endif // CRAZY_LINKER_ELF_RELRO_H

Powered by Google App Engine
This is Rietveld 408576698