• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *  * Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *  * Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in
12  *    the documentation and/or other materials provided with the
13  *    distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 #ifndef LINKER_PHDR_H
29 #define LINKER_PHDR_H
30 
31 /* Declarations related to the ELF program header table and segments.
32  *
33  * The design goal is to provide an API that is as close as possible
34  * to the ELF spec, and does not depend on linker-specific data
35  * structures (e.g. the exact layout of struct soinfo).
36  */
37 
38 #include "linker.h"
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 /* See linker_phdr.c for all usage documentation */
45 
46 int
47 phdr_table_load(int                fd,
48                 Elf32_Addr         phdr_offset,
49                 Elf32_Half         phdr_num,
50                 void**             phdr_mmap,
51                 Elf32_Addr*        phdr_size,
52                 const Elf32_Phdr** phdr_table);
53 
54 void
55 phdr_table_unload(void* phdr_mmap, Elf32_Addr phdr_memsize);
56 
57 Elf32_Addr
58 phdr_table_get_load_size(const Elf32_Phdr* phdr_table,
59                          size_t phdr_count);
60 
61 int
62 phdr_table_reserve_memory(const Elf32_Phdr* phdr_table,
63                           size_t phdr_count,
64                           void** load_start,
65                           Elf32_Addr* load_size,
66                           Elf32_Addr* load_bias);
67 
68 int
69 phdr_table_load_segments(const Elf32_Phdr* phdr_table,
70                          int               phdr_count,
71                          Elf32_Addr        load_bias,
72                          int               fd);
73 
74 int
75 phdr_table_protect_segments(const Elf32_Phdr* phdr_table,
76                             int               phdr_count,
77                             Elf32_Addr        load_bias);
78 
79 int
80 phdr_table_unprotect_segments(const Elf32_Phdr* phdr_table,
81                               int               phdr_count,
82                               Elf32_Addr        load_bias);
83 
84 int
85 phdr_table_protect_gnu_relro(const Elf32_Phdr* phdr_table,
86                              int               phdr_count,
87                              Elf32_Addr        load_bias);
88 
89 const Elf32_Phdr*
90 phdr_table_get_loaded_phdr(const Elf32_Phdr*   phdr_table,
91                            int                 phdr_count,
92                            Elf32_Addr          load_bias);
93 
94 #ifdef ANDROID_ARM_LINKER
95 int
96 phdr_table_get_arm_exidx(const Elf32_Phdr* phdr_table,
97                          int               phdr_count,
98                          Elf32_Addr        load_bias,
99                          Elf32_Addr**      arm_exidx,
100                          unsigned*         arm_exidix_count);
101 #endif
102 
103 void
104 phdr_table_get_dynamic_section(const Elf32_Phdr* phdr_table,
105                                int               phdr_count,
106                                Elf32_Addr        load_bias,
107                                Elf32_Addr**      dynamic,
108                                size_t*           dynamic_count);
109 
110 #ifdef __cplusplus
111 };
112 #endif
113 
114 #endif /* LINKER_PHDR_H */
115