Commit | Line | Data |
---|---|---|
28c9d252 | 1 | /* AVR-specific support for 32-bit ELF. |
82704155 | 2 | Copyright (C) 2006-2019 Free Software Foundation, Inc. |
28c9d252 NC |
3 | |
4 | Written by Bjoern Haase <bjoern.m.haase@web.de> | |
5 | ||
6 | This file is part of BFD, the Binary File Descriptor library. | |
7 | ||
8 | This program is free software; you can redistribute it and/or modify | |
9 | it under the terms of the GNU General Public License as published by | |
cd123cb7 | 10 | the Free Software Foundation; either version 3 of the License, or |
28c9d252 NC |
11 | (at your option) any later version. |
12 | ||
13 | This program is distributed in the hope that it will be useful, | |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
19 | along with this program; if not, write to the Free Software | |
68ffbac6 | 20 | Foundation, Inc., 51 Franklin Street - Fifth Floor, |
28c9d252 NC |
21 | Boston, MA 02110-1301, USA. */ |
22 | ||
23 | ||
24 | /* These four functions will be called from the ld back-end. */ | |
25 | ||
26 | extern void | |
27 | elf32_avr_setup_params (struct bfd_link_info *, bfd *, asection *, | |
07d6d2b8 AM |
28 | bfd_boolean, bfd_boolean, bfd_boolean, |
29 | bfd_vma, bfd_boolean); | |
28c9d252 NC |
30 | |
31 | extern int | |
32 | elf32_avr_setup_section_lists (bfd *, struct bfd_link_info *); | |
33 | ||
34 | extern bfd_boolean | |
35 | elf32_avr_size_stubs (bfd *, struct bfd_link_info *, bfd_boolean); | |
36 | ||
37 | extern bfd_boolean | |
38 | elf32_avr_build_stubs (struct bfd_link_info *); | |
fdd410ac AB |
39 | |
40 | /* The name of the section into which the property records are stored. */ | |
41 | #define AVR_PROPERTY_RECORD_SECTION_NAME ".avr.prop" | |
42 | ||
43 | /* The current version number for the format of the property records. */ | |
44 | #define AVR_PROPERTY_RECORDS_VERSION 1 | |
45 | ||
46 | /* The size of the header that is written to the property record section | |
47 | before the property records are written out. */ | |
48 | #define AVR_PROPERTY_SECTION_HEADER_SIZE 4 | |
49 | ||
50 | /* This holds a single property record in memory, the structure of this | |
51 | data when written out to the ELF section is more compressed. */ | |
52 | ||
53 | struct avr_property_record | |
54 | { | |
55 | /* The section and offset for this record. */ | |
56 | asection *section; | |
57 | bfd_vma offset; | |
58 | ||
59 | /* The type of this record. */ | |
60 | enum { | |
61 | RECORD_ORG = 0, | |
62 | RECORD_ORG_AND_FILL = 1, | |
63 | RECORD_ALIGN = 2, | |
64 | RECORD_ALIGN_AND_FILL = 3 | |
65 | } type; | |
66 | ||
67 | /* Type specific data. */ | |
68 | union | |
69 | { | |
70 | /* RECORD_ORG and RECORD_ORG_AND_FILL. */ | |
71 | struct | |
72 | { | |
73 | unsigned long fill; | |
74 | } org; | |
75 | ||
76 | /* RECORD_ALIGN and RECORD_ALIGN_AND_FILL. */ | |
77 | struct | |
78 | { | |
79 | unsigned long bytes; | |
80 | unsigned long fill; | |
81 | ||
82 | /* This field is used during linker relaxation to track the number of | |
07d6d2b8 AM |
83 | bytes that have been opened up before this alignment directive. |
84 | When we have enough bytes available it is possible to move the | |
85 | re-align this directive backwards while still maintaining the | |
86 | alignment requirement. */ | |
fdd410ac AB |
87 | unsigned long preceding_deleted; |
88 | } align; | |
89 | } data; | |
90 | }; | |
137c83d6 AB |
91 | |
92 | struct avr_property_record_list | |
93 | { | |
94 | /* The version number tells us the structure of the property record data | |
95 | within the section. See AVR_PROPERTY_RECORDS_VERSION. */ | |
96 | bfd_byte version; | |
97 | ||
98 | /* The flags field is currently unused. This should be set to 0. */ | |
99 | bfd_byte flags; | |
100 | ||
101 | /* The number of property records. This is stored as a 2-byte value in | |
102 | the section contents. */ | |
103 | unsigned long record_count; | |
104 | ||
105 | /* The section from which the property records were loaded. This is the | |
106 | actual section containing the records, not the section(s) to which the | |
107 | records apply. */ | |
108 | asection *section; | |
109 | ||
110 | /* The actual property records. */ | |
111 | struct avr_property_record *records; | |
112 | }; | |
113 | ||
114 | /* Load the property records from ABFD, return NULL if there are non | |
115 | found, otherwise return pointer to dynamically allocated memory. The | |
116 | memory for the header and all of the records are allocated in a single | |
117 | block, as such only the header needs to be freed. */ | |
118 | ||
119 | extern struct avr_property_record_list *avr_elf32_load_property_records (bfd *abfd); | |
120 | ||
121 | /* Return a string that is the name of the property record pointed to by REC. */ | |
122 | extern const char *avr_elf32_property_record_name (struct avr_property_record *rec); |