OLD | NEW |
1 // Copyright (c) 2008, Google Inc. | 1 // Copyright (c) 2008, Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 22 matching lines...) Expand all Loading... |
33 // Allow dynamic symbol lookup in the kernel VDSO page. | 33 // Allow dynamic symbol lookup in the kernel VDSO page. |
34 // | 34 // |
35 // VDSOSupport -- a class representing kernel VDSO (if present). | 35 // VDSOSupport -- a class representing kernel VDSO (if present). |
36 // | 36 // |
37 | 37 |
38 #include "base/vdso_support.h" | 38 #include "base/vdso_support.h" |
39 | 39 |
40 #ifdef HAVE_VDSO_SUPPORT // defined in vdso_support.h | 40 #ifdef HAVE_VDSO_SUPPORT // defined in vdso_support.h |
41 | 41 |
42 #include <fcntl.h> | 42 #include <fcntl.h> |
43 #include <stddef.h> // for ptrdiff_t | 43 #include <stddef.h> // for std::ptrdiff_t |
44 | 44 |
45 #include "base/atomicops.h" // for MemoryBarrier | 45 #include "base/atomicops.h" // for MemoryBarrier |
| 46 #include "base/logging.h" |
46 #include "base/linux_syscall_support.h" | 47 #include "base/linux_syscall_support.h" |
47 #include "base/logging.h" | |
48 #include "base/dynamic_annotations.h" | 48 #include "base/dynamic_annotations.h" |
49 #include "base/basictypes.h" // for COMPILE_ASSERT | 49 #include "base/basictypes.h" // for COMPILE_ASSERT |
50 | 50 |
51 using base::subtle::MemoryBarrier; | 51 using base::subtle::MemoryBarrier; |
52 | 52 |
53 #ifndef AT_SYSINFO_EHDR | 53 #ifndef AT_SYSINFO_EHDR |
54 #define AT_SYSINFO_EHDR 33 | 54 #define AT_SYSINFO_EHDR 33 |
55 #endif | 55 #endif |
56 | 56 |
57 // From binutils/include/elf/common.h (this doesn't appear to be documented | 57 // From binutils/include/elf/common.h (this doesn't appear to be documented |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 break; | 259 break; |
260 } | 260 } |
261 } | 261 } |
262 if (link_base_ == ~0L || !dynamic_program_header) { | 262 if (link_base_ == ~0L || !dynamic_program_header) { |
263 RAW_DCHECK(~0L != link_base_, "no PT_LOADs in VDSO"); | 263 RAW_DCHECK(~0L != link_base_, "no PT_LOADs in VDSO"); |
264 RAW_DCHECK(dynamic_program_header, "no PT_DYNAMIC in VDSO"); | 264 RAW_DCHECK(dynamic_program_header, "no PT_DYNAMIC in VDSO"); |
265 // Mark this image as not present. Can not recur infinitely. | 265 // Mark this image as not present. Can not recur infinitely. |
266 Init(0); | 266 Init(0); |
267 return; | 267 return; |
268 } | 268 } |
269 ptrdiff_t relocation = | 269 std::ptrdiff_t relocation = |
270 base_as_char - reinterpret_cast<const char *>(link_base_); | 270 base_as_char - reinterpret_cast<const char *>(link_base_); |
271 ElfW(Dyn) *dynamic_entry = | 271 ElfW(Dyn) *dynamic_entry = |
272 reinterpret_cast<ElfW(Dyn) *>(dynamic_program_header->p_vaddr + | 272 reinterpret_cast<ElfW(Dyn) *>(dynamic_program_header->p_vaddr + |
273 relocation); | 273 relocation); |
274 for (; dynamic_entry->d_tag != DT_NULL; ++dynamic_entry) { | 274 for (; dynamic_entry->d_tag != DT_NULL; ++dynamic_entry) { |
275 ElfW(Xword) value = dynamic_entry->d_un.d_val; | 275 ElfW(Xword) value = dynamic_entry->d_un.d_val; |
276 if (fake_vdso) { | 276 if (fake_vdso) { |
277 // A complication: in the real VDSO, dynamic entries are not relocated | 277 // A complication: in the real VDSO, dynamic entries are not relocated |
278 // (it wasn't loaded by a dynamic loader). But when testing with a | 278 // (it wasn't loaded by a dynamic loader). But when testing with a |
279 // "fake" dlopen()ed vdso library, the loader relocates some (but | 279 // "fake" dlopen()ed vdso library, the loader relocates some (but |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 // ensure it here, with a global constructor of our own. This | 554 // ensure it here, with a global constructor of our own. This |
555 // is an allowed exception to the normal rule against non-trivial | 555 // is an allowed exception to the normal rule against non-trivial |
556 // global constructors. | 556 // global constructors. |
557 static class VDSOInitHelper { | 557 static class VDSOInitHelper { |
558 public: | 558 public: |
559 VDSOInitHelper() { VDSOSupport::Init(); } | 559 VDSOInitHelper() { VDSOSupport::Init(); } |
560 } vdso_init_helper; | 560 } vdso_init_helper; |
561 } | 561 } |
562 | 562 |
563 #endif // HAVE_VDSO_SUPPORT | 563 #endif // HAVE_VDSO_SUPPORT |
OLD | NEW |