/src/binutils-gdb/bfd/section.c
Line | Count | Source |
1 | | /* Object file "section" support for the BFD library. |
2 | | Copyright (C) 1990-2026 Free Software Foundation, Inc. |
3 | | Written by Cygnus Support. |
4 | | |
5 | | This file is part of BFD, the Binary File Descriptor library. |
6 | | |
7 | | This program is free software; you can redistribute it and/or modify |
8 | | it under the terms of the GNU General Public License as published by |
9 | | the Free Software Foundation; either version 3 of the License, or |
10 | | (at your option) any later version. |
11 | | |
12 | | This program is distributed in the hope that it will be useful, |
13 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | | GNU General Public License for more details. |
16 | | |
17 | | You should have received a copy of the GNU General Public License |
18 | | along with this program; if not, write to the Free Software |
19 | | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
20 | | MA 02110-1301, USA. */ |
21 | | |
22 | | /* |
23 | | SECTION |
24 | | Sections |
25 | | |
26 | | The raw data contained within a BFD is maintained through the |
27 | | section abstraction. A single BFD may have any number of |
28 | | sections. It keeps hold of them by pointing to the first; |
29 | | each one points to the next in the list. |
30 | | |
31 | | Sections are supported in BFD in <<section.c>>. |
32 | | |
33 | | @menu |
34 | | @* Section Input:: |
35 | | @* Section Output:: |
36 | | @* typedef asection:: |
37 | | @* section prototypes:: |
38 | | @end menu |
39 | | |
40 | | INODE |
41 | | Section Input, Section Output, Sections, Sections |
42 | | SUBSECTION |
43 | | Section input |
44 | | |
45 | | When a BFD is opened for reading, the section structures are |
46 | | created and attached to the BFD. |
47 | | |
48 | | Each section has a name which describes the section in the |
49 | | outside world---for example, <<a.out>> would contain at least |
50 | | three sections, called <<.text>>, <<.data>> and <<.bss>>. |
51 | | |
52 | | Names need not be unique; for example a COFF file may have several |
53 | | sections named <<.data>>. |
54 | | |
55 | | Sometimes a BFD will contain more than the ``natural'' number of |
56 | | sections. A back end may attach other sections containing |
57 | | constructor data, or an application may add a section (using |
58 | | <<bfd_make_section>>) to the sections attached to an already open |
59 | | BFD. For example, the linker creates an extra section |
60 | | <<COMMON>> for each input file's BFD to hold information about |
61 | | common storage. |
62 | | |
63 | | The raw data is not necessarily read in when |
64 | | the section descriptor is created. Some targets may leave the |
65 | | data in place until a <<bfd_get_section_contents>> call is |
66 | | made. Other back ends may read in all the data at once. For |
67 | | example, an S-record file has to be read once to determine the |
68 | | size of the data. |
69 | | |
70 | | INODE |
71 | | Section Output, typedef asection, Section Input, Sections |
72 | | |
73 | | SUBSECTION |
74 | | Section output |
75 | | |
76 | | To write a new object style BFD, the various sections to be |
77 | | written have to be created. They are attached to the BFD in |
78 | | the same way as input sections; data is written to the |
79 | | sections using <<bfd_set_section_contents>>. |
80 | | |
81 | | Any program that creates or combines sections (e.g., the assembler |
82 | | and linker) must use the <<asection>> fields <<output_section>> and |
83 | | <<output_offset>> to indicate the file sections to which each |
84 | | section must be written. (If the section is being created from |
85 | | scratch, <<output_section>> should probably point to the section |
86 | | itself and <<output_offset>> should probably be zero.) |
87 | | |
88 | | The data to be written comes from input sections attached |
89 | | (via <<output_section>> pointers) to |
90 | | the output sections. The output section structure can be |
91 | | considered a filter for the input section: the output section |
92 | | determines the vma of the output data and the name, but the |
93 | | input section determines the offset into the output section of |
94 | | the data to be written. |
95 | | |
96 | | E.g., to create a section "O", starting at 0x100, 0x123 long, |
97 | | containing two subsections, "A" at offset 0x0 (i.e., at vma |
98 | | 0x100) and "B" at offset 0x20 (i.e., at vma 0x120) the <<asection>> |
99 | | structures would look like: |
100 | | |
101 | | | section name "A" |
102 | | | output_offset 0x00 |
103 | | | size 0x20 |
104 | | | output_section -----------> section name "O" |
105 | | | | vma 0x100 |
106 | | | section name "B" | size 0x123 |
107 | | | output_offset 0x20 | |
108 | | | size 0x103 | |
109 | | | output_section --------| |
110 | | |
111 | | SUBSECTION |
112 | | Link orders |
113 | | |
114 | | The data within a section is stored in a @dfn{link_order}. |
115 | | These are much like the fixups in <<gas>>. The link_order |
116 | | abstraction allows a section to grow and shrink within itself. |
117 | | |
118 | | A link_order knows how big it is, and which is the next |
119 | | link_order and where the raw data for it is; it also points to |
120 | | a list of relocations which apply to it. |
121 | | |
122 | | The link_order is used by the linker to perform relaxing on |
123 | | final code. The compiler creates code which is as big as |
124 | | necessary to make it work without relaxing, and the user can |
125 | | select whether to relax. Sometimes relaxing takes a lot of |
126 | | time. The linker runs around the relocations to see if any |
127 | | are attached to data which can be shrunk, if so it does it on |
128 | | a link_order by link_order basis. |
129 | | |
130 | | */ |
131 | | |
132 | | #include "sysdep.h" |
133 | | #include "bfd.h" |
134 | | #include "libbfd.h" |
135 | | #include "bfdlink.h" |
136 | | |
137 | | /* |
138 | | DOCDD |
139 | | INODE |
140 | | typedef asection, section prototypes, Section Output, Sections |
141 | | SUBSECTION |
142 | | typedef asection |
143 | | |
144 | | Here is the section structure: |
145 | | |
146 | | EXTERNAL |
147 | | .{* Linenumber stuff. *} |
148 | | .typedef struct lineno_cache_entry |
149 | | .{ |
150 | | . unsigned int line_number; {* Linenumber from start of function. *} |
151 | | . union |
152 | | . { |
153 | | . struct bfd_symbol *sym; {* Function name. *} |
154 | | . bfd_vma offset; {* Offset into section. *} |
155 | | . } u; |
156 | | .} |
157 | | .alent; |
158 | | . |
159 | | |
160 | | CODE_FRAGMENT |
161 | | .typedef struct bfd_section |
162 | | .{ |
163 | | . {* The name of the section; the name isn't a copy, the pointer is |
164 | | . the same as that passed to bfd_make_section. *} |
165 | | . const char *name; |
166 | | . |
167 | | . {* The next section in the list belonging to the BFD, or NULL. *} |
168 | | . struct bfd_section *next; |
169 | | . |
170 | | . {* The previous section in the list belonging to the BFD, or NULL. *} |
171 | | . struct bfd_section *prev; |
172 | | . |
173 | | . {* A unique sequence number. *} |
174 | | . unsigned int id; |
175 | | . |
176 | | . {* A unique section number which can be used by assembler to |
177 | | . distinguish different sections with the same section name. *} |
178 | | . unsigned int section_id; |
179 | | . |
180 | | . {* Which section in the bfd; 0..n-1 as sections are created in a bfd. *} |
181 | | . unsigned int index; |
182 | | . |
183 | | . {* The field flags contains attributes of the section. Some |
184 | | . flags are read in from the object file, and some are |
185 | | . synthesized from other information. *} |
186 | | . flagword flags; |
187 | | . |
188 | | .#define SEC_NO_FLAGS 0x0 |
189 | | . |
190 | | . {* Tells the OS to allocate space for this section when loading. |
191 | | . This is clear for a section containing debug information only. *} |
192 | | .#define SEC_ALLOC 0x1 |
193 | | . |
194 | | . {* Tells the OS to load the section from the file when loading. |
195 | | . This is clear for a .bss section. *} |
196 | | .#define SEC_LOAD 0x2 |
197 | | . |
198 | | . {* The section contains data still to be relocated, so there is |
199 | | . some relocation information too. *} |
200 | | .#define SEC_RELOC 0x4 |
201 | | . |
202 | | . {* A signal to the OS that the section contains read only data. *} |
203 | | .#define SEC_READONLY 0x8 |
204 | | . |
205 | | . {* The section contains code only. *} |
206 | | .#define SEC_CODE 0x10 |
207 | | . |
208 | | . {* The section contains data only. *} |
209 | | .#define SEC_DATA 0x20 |
210 | | . |
211 | | . {* The section will reside in ROM. *} |
212 | | .#define SEC_ROM 0x40 |
213 | | . |
214 | | . {* The section contains constructor information. This section |
215 | | . type is used by the linker to create lists of constructors and |
216 | | . destructors used by <<g++>>. When a back end sees a symbol |
217 | | . which should be used in a constructor list, it creates a new |
218 | | . section for the type of name (e.g., <<__CTOR_LIST__>>), attaches |
219 | | . the symbol to it, and builds a relocation. To build the lists |
220 | | . of constructors, all the linker has to do is catenate all the |
221 | | . sections called <<__CTOR_LIST__>> and relocate the data |
222 | | . contained within - exactly the operations it would peform on |
223 | | . standard data. *} |
224 | | .#define SEC_CONSTRUCTOR 0x80 |
225 | | . |
226 | | . {* The section has contents - a data section could be |
227 | | . <<SEC_ALLOC>> | <<SEC_HAS_CONTENTS>>; a debug section could be |
228 | | . <<SEC_HAS_CONTENTS>> *} |
229 | | .#define SEC_HAS_CONTENTS 0x100 |
230 | | . |
231 | | . {* An instruction to the linker to not output the section |
232 | | . even if it has information which would normally be written. *} |
233 | | .#define SEC_NEVER_LOAD 0x200 |
234 | | . |
235 | | . {* The section contains thread local data. *} |
236 | | .#define SEC_THREAD_LOCAL 0x400 |
237 | | . |
238 | | . {* The section's size is fixed. Generic linker code will not |
239 | | . recalculate it and it is up to whoever has set this flag to |
240 | | . get the size right. *} |
241 | | .#define SEC_FIXED_SIZE 0x800 |
242 | | . |
243 | | . {* The section contains common symbols (symbols may be defined |
244 | | . multiple times, the value of a symbol is the amount of |
245 | | . space it requires, and the largest symbol value is the one |
246 | | . used). Most targets have exactly one of these (which we |
247 | | . translate to bfd_com_section_ptr), but ECOFF has two. *} |
248 | | .#define SEC_IS_COMMON 0x1000 |
249 | | . |
250 | | . {* The section contains only debugging information. For |
251 | | . example, this is set for ELF .debug and .stab sections. |
252 | | . strip tests this flag to see if a section can be |
253 | | . discarded. *} |
254 | | .#define SEC_DEBUGGING 0x2000 |
255 | | . |
256 | | . {* The contents of this section are held in memory pointed to |
257 | | . by the contents field. This is checked by bfd_get_section_contents, |
258 | | . and the data is retrieved from memory if appropriate. *} |
259 | | .#define SEC_IN_MEMORY 0x4000 |
260 | | . |
261 | | . {* The contents of this section are to be excluded by the |
262 | | . linker for executable and shared objects unless those |
263 | | . objects are to be further relocated. *} |
264 | | .#define SEC_EXCLUDE 0x8000 |
265 | | . |
266 | | . {* The contents of this section are to be sorted based on the sum of |
267 | | . the symbol and addend values specified by the associated relocation |
268 | | . entries. Entries without associated relocation entries will be |
269 | | . appended to the end of the section in an unspecified order. *} |
270 | | .#define SEC_SORT_ENTRIES 0x10000 |
271 | | . |
272 | | . {* When linking, duplicate sections of the same name should be |
273 | | . discarded, rather than being combined into a single section as |
274 | | . is usually done. This is similar to how common symbols are |
275 | | . handled. See SEC_LINK_DUPLICATES below. *} |
276 | | .#define SEC_LINK_ONCE 0x20000 |
277 | | . |
278 | | . {* If SEC_LINK_ONCE is set, this bitfield describes how the linker |
279 | | . should handle duplicate sections. *} |
280 | | .#define SEC_LINK_DUPLICATES 0xc0000 |
281 | | . |
282 | | . {* This value for SEC_LINK_DUPLICATES means that duplicate |
283 | | . sections with the same name should simply be discarded. *} |
284 | | .#define SEC_LINK_DUPLICATES_DISCARD 0x0 |
285 | | . |
286 | | . {* This value for SEC_LINK_DUPLICATES means that the linker |
287 | | . should warn if there are any duplicate sections, although |
288 | | . it should still only link one copy. *} |
289 | | .#define SEC_LINK_DUPLICATES_ONE_ONLY 0x40000 |
290 | | . |
291 | | . {* This value for SEC_LINK_DUPLICATES means that the linker |
292 | | . should warn if any duplicate sections are a different size. *} |
293 | | .#define SEC_LINK_DUPLICATES_SAME_SIZE 0x80000 |
294 | | . |
295 | | . {* This value for SEC_LINK_DUPLICATES means that the linker |
296 | | . should warn if any duplicate sections contain different |
297 | | . contents. *} |
298 | | .#define SEC_LINK_DUPLICATES_SAME_CONTENTS \ |
299 | | . (SEC_LINK_DUPLICATES_ONE_ONLY | SEC_LINK_DUPLICATES_SAME_SIZE) |
300 | | . |
301 | | . {* This section was created by the linker as part of dynamic |
302 | | . relocation or other arcane processing. It is skipped when |
303 | | . going through the first-pass output, trusting that someone |
304 | | . else up the line will take care of it later. *} |
305 | | .#define SEC_LINKER_CREATED 0x100000 |
306 | | . |
307 | | . {* This section contains a section ID to distinguish different |
308 | | . sections with the same section name. *} |
309 | | .#define SEC_ASSEMBLER_SECTION_ID 0x100000 |
310 | | . |
311 | | . {* This section should not be subject to garbage collection. |
312 | | . Also set to inform the linker that this section should not be |
313 | | . listed in the link map as discarded. *} |
314 | | .#define SEC_KEEP 0x200000 |
315 | | . |
316 | | . {* This section contains "short" data, and should be placed |
317 | | . "near" the GP. *} |
318 | | .#define SEC_SMALL_DATA 0x400000 |
319 | | . |
320 | | . {* Attempt to merge identical entities in the section. |
321 | | . Entity size is given in the entsize field. *} |
322 | | .#define SEC_MERGE 0x800000 |
323 | | . |
324 | | . {* If given with SEC_MERGE, entities to merge are zero terminated |
325 | | . strings where entsize specifies character size instead of fixed |
326 | | . size entries. *} |
327 | | .#define SEC_STRINGS 0x1000000 |
328 | | . |
329 | | . {* This section contains data about section groups. *} |
330 | | .#define SEC_GROUP 0x2000000 |
331 | | . |
332 | | . {* The section is a COFF shared library section. This flag is |
333 | | . only for the linker. If this type of section appears in |
334 | | . the input file, the linker must copy it to the output file |
335 | | . without changing the vma or size. FIXME: Although this |
336 | | . was originally intended to be general, it really is COFF |
337 | | . specific (and the flag was renamed to indicate this). It |
338 | | . might be cleaner to have some more general mechanism to |
339 | | . allow the back end to control what the linker does with |
340 | | . sections. *} |
341 | | .#define SEC_COFF_SHARED_LIBRARY 0x4000000 |
342 | | . |
343 | | . {* This input section should be copied to output in reverse order |
344 | | . as an array of pointers. This is for ELF linker internal use |
345 | | . only. *} |
346 | | .#define SEC_ELF_REVERSE_COPY 0x4000000 |
347 | | . |
348 | | . {* This section contains data which may be shared with other |
349 | | . executables or shared objects. This is for COFF only. *} |
350 | | .#define SEC_COFF_SHARED 0x8000000 |
351 | | . |
352 | | . {* Indicate that section has the purecode flag set. *} |
353 | | .#define SEC_ELF_PURECODE 0x8000000 |
354 | | . |
355 | | . {* When a section with this flag is being linked, then if the size of |
356 | | . the input section is less than a page, it should not cross a page |
357 | | . boundary. If the size of the input section is one page or more, |
358 | | . it should be aligned on a page boundary. This is for TI |
359 | | . TMS320C54X only. *} |
360 | | .#define SEC_TIC54X_BLOCK 0x10000000 |
361 | | . |
362 | | . {* This section has the SHF_X86_64_LARGE flag. This is ELF x86-64 only. *} |
363 | | .#define SEC_ELF_LARGE 0x10000000 |
364 | | . |
365 | | . {* Conditionally link this section; do not link if there are no |
366 | | . references found to any symbol in the section. This is for TI |
367 | | . TMS320C54X only. *} |
368 | | .#define SEC_TIC54X_CLINK 0x20000000 |
369 | | . |
370 | | . {* This section contains vliw code. This is for Toshiba MeP only. *} |
371 | | .#define SEC_MEP_VLIW 0x20000000 |
372 | | . |
373 | | . {* All symbols, sizes and relocations in this section are octets |
374 | | . instead of bytes. Required for DWARF debug sections as DWARF |
375 | | . information is organized in octets, not bytes. *} |
376 | | .#define SEC_ELF_OCTETS 0x40000000 |
377 | | . |
378 | | . {* Indicate that section has the no read flag set. This happens |
379 | | . when memory read flag isn't set. *} |
380 | | .#define SEC_COFF_NOREAD 0x40000000 |
381 | | . |
382 | | . {* End of section flags. *} |
383 | | . |
384 | | . {* The virtual memory address of the section - where it will be |
385 | | . at run time. The symbols are relocated against this. The |
386 | | . user_set_vma flag is maintained by bfd; if it's not set, the |
387 | | . backend can assign addresses (for example, in <<a.out>>, where |
388 | | . the default address for <<.data>> is dependent on the specific |
389 | | . target and various flags). *} |
390 | | . bfd_vma vma; |
391 | | . |
392 | | . {* The load address of the section - where it would be in a |
393 | | . rom image; really only used for writing section header |
394 | | . information. *} |
395 | | . bfd_vma lma; |
396 | | . |
397 | | . {* The size of the section in *octets*, as it will be output. |
398 | | . Contains a value even if the section has no contents (e.g., the |
399 | | . size of <<.bss>>). *} |
400 | | . bfd_size_type size; |
401 | | . |
402 | | . {* For input sections, the original size on disk of the section, in |
403 | | . octets. This field should be set for any section whose size is |
404 | | . changed by linker relaxation. It is required for sections where |
405 | | . the linker relaxation scheme doesn't cache altered section and |
406 | | . reloc contents (stabs, eh_frame, SEC_MERGE, some coff relaxing |
407 | | . targets), and thus the original size needs to be kept to read the |
408 | | . section multiple times. For output sections, rawsize holds the |
409 | | . section size calculated on a previous linker relaxation pass. *} |
410 | | . bfd_size_type rawsize; |
411 | | . |
412 | | . {* The compressed size of the section in octets. *} |
413 | | . bfd_size_type compressed_size; |
414 | | . |
415 | | . {* If this section is going to be output, then this value is the |
416 | | . offset in *bytes* into the output section of the first byte in the |
417 | | . input section (byte ==> smallest addressable unit on the |
418 | | . target). In most cases, if this was going to start at the |
419 | | . 100th octet (8-bit quantity) in the output section, this value |
420 | | . would be 100. However, if the target byte size is 16 bits |
421 | | . (bfd_octets_per_byte is "2"), this value would be 50. *} |
422 | | . bfd_vma output_offset; |
423 | | . |
424 | | . {* The output section through which to map on output. *} |
425 | | . struct bfd_section *output_section; |
426 | | . |
427 | | . {* If an input section, a pointer to a vector of relocation |
428 | | . records for the data in this section. *} |
429 | | . struct reloc_cache_entry *relocation; |
430 | | . |
431 | | . {* If an output section, a pointer to a vector of pointers to |
432 | | . relocation records for the data in this section. *} |
433 | | . struct reloc_cache_entry **orelocation; |
434 | | . |
435 | | . {* The number of relocation records in one of the above. *} |
436 | | . unsigned reloc_count; |
437 | | . |
438 | | . {* The alignment requirement of the section, as an exponent of 2 - |
439 | | . e.g., 3 aligns to 2^3 (or 8). *} |
440 | | . unsigned int alignment_power; |
441 | | . |
442 | | . {* Information below is back end specific - and not always used |
443 | | . or updated. *} |
444 | | . |
445 | | . {* File position of section data. *} |
446 | | . file_ptr filepos; |
447 | | . |
448 | | . {* File position of relocation info. *} |
449 | | . file_ptr rel_filepos; |
450 | | . |
451 | | . {* File position of line data. *} |
452 | | . file_ptr line_filepos; |
453 | | . |
454 | | . {* Pointer to data for applications. *} |
455 | | . void *userdata; |
456 | | . |
457 | | . {* If the SEC_IN_MEMORY flag is set, this points to the actual |
458 | | . contents. *} |
459 | | . bfd_byte *contents; |
460 | | . |
461 | | . {* Attached line number information. *} |
462 | | . alent *lineno; |
463 | | . |
464 | | . {* Number of line number records. *} |
465 | | . unsigned int lineno_count; |
466 | | . |
467 | | . {* Entity size for merging purposes. *} |
468 | | . unsigned int entsize; |
469 | | . |
470 | | . {* Points to the kept section if this section is a link-once section, |
471 | | . and is discarded. *} |
472 | | . struct bfd_section *kept_section; |
473 | | . |
474 | | . {* When a section is being output, this value changes as more |
475 | | . linenumbers are written out. *} |
476 | | . file_ptr moving_line_filepos; |
477 | | . |
478 | | . void *used_by_bfd; |
479 | | . |
480 | | . {* If this is a constructor section then here is a list of the |
481 | | . relocations created to relocate items within it. *} |
482 | | . struct relent_chain *constructor_chain; |
483 | | . |
484 | | . {* The BFD which owns the section. *} |
485 | | . bfd *owner; |
486 | | . |
487 | | . {* A symbol which points at this section only. *} |
488 | | . struct bfd_symbol *symbol; |
489 | | . |
490 | | . {* Early in the link process, map_head and map_tail are used to build |
491 | | . a list of input sections attached to an output section. Later, |
492 | | . output sections use these fields for a list of bfd_link_order |
493 | | . structs. The linked_to_symbol_name field is for ELF assembler |
494 | | . internal use. *} |
495 | | . union { |
496 | | . struct bfd_link_order *link_order; |
497 | | . struct bfd_section *s; |
498 | | . const char *linked_to_symbol_name; |
499 | | . } map_head, map_tail; |
500 | | . |
501 | | . {* Points to the output section this section is already assigned to, |
502 | | . if any. This is used when support for non-contiguous memory |
503 | | . regions is enabled. *} |
504 | | . struct bfd_section *already_assigned; |
505 | | . |
506 | | . {* A pointer used for various section optimizations. sec_info_type |
507 | | . qualifies which one it is. *} |
508 | | . void *sec_info; |
509 | | . |
510 | | . {* Explicitly specified section type, if non-zero. *} |
511 | | . unsigned int type; |
512 | | . |
513 | | . {* What the section number is in the target world. *} |
514 | | . int target_index; |
515 | | . |
516 | | . {* Some internal packed boolean fields. *} |
517 | | . |
518 | | . {* See the vma field. *} |
519 | | . unsigned int user_set_vma : 1; |
520 | | . |
521 | | . {* A mark flag used by some of the linker backends. *} |
522 | | . unsigned int linker_mark : 1; |
523 | | . |
524 | | . {* Another mark flag used by some of the linker backends. Set for |
525 | | . output sections that have an input section. *} |
526 | | . unsigned int linker_has_input : 1; |
527 | | . |
528 | | . {* Mark flag used by some linker backends for garbage collection. *} |
529 | | . unsigned int gc_mark : 1; |
530 | | . |
531 | | . {* Section compression status. *} |
532 | | . unsigned int compress_status : 2; |
533 | | .#define COMPRESS_SECTION_NONE 0 |
534 | | .#define COMPRESS_SECTION_DONE 1 |
535 | | .#define DECOMPRESS_SECTION_ZLIB 2 |
536 | | .#define DECOMPRESS_SECTION_ZSTD 3 |
537 | | . |
538 | | . {* The following flags are used by the ELF linker. *} |
539 | | . |
540 | | . {* Mark sections which have been allocated to segments. *} |
541 | | . unsigned int segment_mark : 1; |
542 | | . |
543 | | . {* Type of sec_info information. *} |
544 | | . unsigned int sec_info_type:3; |
545 | | .#define SEC_INFO_TYPE_NONE 0 |
546 | | .#define SEC_INFO_TYPE_STABS 1 |
547 | | .#define SEC_INFO_TYPE_MERGE 2 |
548 | | .#define SEC_INFO_TYPE_EH_FRAME 3 |
549 | | .#define SEC_INFO_TYPE_JUST_SYMS 4 |
550 | | .#define SEC_INFO_TYPE_TARGET 5 |
551 | | .#define SEC_INFO_TYPE_EH_FRAME_ENTRY 6 |
552 | | .#define SEC_INFO_TYPE_SFRAME 7 |
553 | | . |
554 | | . {* Nonzero if this section uses RELA relocations, rather than REL. *} |
555 | | . unsigned int use_rela_p:1; |
556 | | . |
557 | | . {* Nonzero if section contents are mmapped. *} |
558 | | . unsigned int mmapped_p:1; |
559 | | . |
560 | | . {* Nonzero if section contents should not be freed. *} |
561 | | . unsigned int alloced:1; |
562 | | . |
563 | | . {* Indicate that the section contains branch veneers. This is used when |
564 | | . support for non-contiguous memory regions is enabled. The veneers have |
565 | | . to be allocated to the same memory region as the code they are refered |
566 | | . by, i.e. they cannot be moved to a subsequent memory region. *} |
567 | | . unsigned int veneer : 1; |
568 | | . |
569 | | . {* Bits used by various backends. The generic code doesn't touch |
570 | | . these fields. *} |
571 | | . |
572 | | . unsigned int sec_flg0:1; |
573 | | . unsigned int sec_flg1:1; |
574 | | . unsigned int sec_flg2:1; |
575 | | . unsigned int sec_flg3:1; |
576 | | . unsigned int sec_flg4:1; |
577 | | . unsigned int sec_flg5:1; |
578 | | . |
579 | | . {* End of internal packed boolean fields. *} |
580 | | . |
581 | | .} asection; |
582 | | . |
583 | | |
584 | | EXTERNAL |
585 | | .static inline const char * |
586 | | .bfd_section_name (const asection *sec) |
587 | | .{ |
588 | | . return sec->name; |
589 | | .} |
590 | | . |
591 | | .static inline bfd_size_type |
592 | | .bfd_section_size (const asection *sec) |
593 | | .{ |
594 | | . return sec->size; |
595 | | .} |
596 | | . |
597 | | .static inline bfd_vma |
598 | | .bfd_section_vma (const asection *sec) |
599 | | .{ |
600 | | . return sec->vma; |
601 | | .} |
602 | | . |
603 | | .static inline bfd_vma |
604 | | .bfd_section_lma (const asection *sec) |
605 | | .{ |
606 | | . return sec->lma; |
607 | | .} |
608 | | . |
609 | | .static inline unsigned int |
610 | | .bfd_section_alignment (const asection *sec) |
611 | | .{ |
612 | | . return sec->alignment_power; |
613 | | .} |
614 | | . |
615 | | .static inline flagword |
616 | | .bfd_section_flags (const asection *sec) |
617 | | .{ |
618 | | . return sec->flags; |
619 | | .} |
620 | | . |
621 | | .static inline void * |
622 | | .bfd_section_userdata (const asection *sec) |
623 | | .{ |
624 | | . return sec->userdata; |
625 | | .} |
626 | | .static inline bool |
627 | | .bfd_is_com_section (const asection *sec) |
628 | | .{ |
629 | | . return (sec->flags & SEC_IS_COMMON) != 0; |
630 | | .} |
631 | | . |
632 | | .{* Note: the following are provided as inline functions rather than macros |
633 | | . because not all callers use the return value. A macro implementation |
634 | | . would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some |
635 | | . compilers will complain about comma expressions that have no effect. *} |
636 | | .static inline bool |
637 | | .bfd_set_section_userdata (asection *sec, void *val) |
638 | | .{ |
639 | | . sec->userdata = val; |
640 | | . return true; |
641 | | .} |
642 | | . |
643 | | .static inline bool |
644 | | .bfd_set_section_vma (asection *sec, bfd_vma val) |
645 | | .{ |
646 | | . sec->vma = sec->lma = val; |
647 | | . sec->user_set_vma = true; |
648 | | . return true; |
649 | | .} |
650 | | . |
651 | | .static inline bool |
652 | | .bfd_set_section_lma (asection *sec, bfd_vma val) |
653 | | .{ |
654 | | . sec->lma = val; |
655 | | . return true; |
656 | | .} |
657 | | . |
658 | | .static inline bool |
659 | | .bfd_set_section_alignment (asection *sec, unsigned int val) |
660 | | .{ |
661 | | . if (val >= sizeof (bfd_vma) * 8 - 1) |
662 | | . return false; |
663 | | . sec->alignment_power = val; |
664 | | . return true; |
665 | | .} |
666 | | . |
667 | | .{* These sections are global, and are managed by BFD. The application |
668 | | . and target back end are not permitted to change the values in |
669 | | . these sections. *} |
670 | | .extern asection _bfd_std_section[4]; |
671 | | . |
672 | | .#define BFD_ABS_SECTION_NAME "*ABS*" |
673 | | .#define BFD_UND_SECTION_NAME "*UND*" |
674 | | .#define BFD_COM_SECTION_NAME "*COM*" |
675 | | .#define BFD_IND_SECTION_NAME "*IND*" |
676 | | . |
677 | | .{* GNU object-only section name. *} |
678 | | .#define GNU_OBJECT_ONLY_SECTION_NAME ".gnu_object_only" |
679 | | . |
680 | | .{* Pointer to the common section. *} |
681 | | .#define bfd_com_section_ptr (&_bfd_std_section[0]) |
682 | | .{* Pointer to the undefined section. *} |
683 | | .#define bfd_und_section_ptr (&_bfd_std_section[1]) |
684 | | .{* Pointer to the absolute section. *} |
685 | | .#define bfd_abs_section_ptr (&_bfd_std_section[2]) |
686 | | .{* Pointer to the indirect section. *} |
687 | | .#define bfd_ind_section_ptr (&_bfd_std_section[3]) |
688 | | . |
689 | | .static inline bool |
690 | | .bfd_is_und_section (const asection *sec) |
691 | | .{ |
692 | | . return sec == bfd_und_section_ptr; |
693 | | .} |
694 | | . |
695 | | .static inline bool |
696 | | .bfd_is_abs_section (const asection *sec) |
697 | | .{ |
698 | | . return sec == bfd_abs_section_ptr; |
699 | | .} |
700 | | . |
701 | | .static inline bool |
702 | | .bfd_is_ind_section (const asection *sec) |
703 | | .{ |
704 | | . return sec == bfd_ind_section_ptr; |
705 | | .} |
706 | | . |
707 | | .static inline bool |
708 | | .bfd_is_const_section (const asection *sec) |
709 | | .{ |
710 | | . return (sec >= _bfd_std_section |
711 | | . && sec < _bfd_std_section + (sizeof (_bfd_std_section) |
712 | | . / sizeof (_bfd_std_section[0]))); |
713 | | .} |
714 | | . |
715 | | .{* Return TRUE if input section SEC has been discarded. *} |
716 | | .static inline bool |
717 | | .discarded_section (const asection *sec) |
718 | | .{ |
719 | | . return (!bfd_is_abs_section (sec) |
720 | | . && bfd_is_abs_section (sec->output_section) |
721 | | . && sec->sec_info_type != SEC_INFO_TYPE_MERGE |
722 | | . && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS); |
723 | | .} |
724 | | . |
725 | | INTERNAL |
726 | | .#define BFD_FAKE_SECTION(SEC, SYM, NAME, IDX, FLAGS) \ |
727 | | . { .name = NAME, \ |
728 | | . .id = IDX, \ |
729 | | . .flags = FLAGS, \ |
730 | | . .gc_mark = 1, \ |
731 | | . .output_section = &SEC, \ |
732 | | . .symbol = (struct bfd_symbol *) SYM \ |
733 | | . } |
734 | | . |
735 | | .#define GLOBAL_SYM_INIT(NAME, SECTION) \ |
736 | | . { .name = NAME, \ |
737 | | . .section = SECTION, \ |
738 | | . .flags = BSF_SECTION_SYM \ |
739 | | . } |
740 | | . |
741 | | */ |
742 | | |
743 | | /* These symbols are global, not specific to any BFD. Therefore, anything |
744 | | that tries to change them is broken, and should be repaired. */ |
745 | | |
746 | | static const asymbol global_syms[] = |
747 | | { |
748 | | GLOBAL_SYM_INIT (BFD_COM_SECTION_NAME, bfd_com_section_ptr), |
749 | | GLOBAL_SYM_INIT (BFD_UND_SECTION_NAME, bfd_und_section_ptr), |
750 | | GLOBAL_SYM_INIT (BFD_ABS_SECTION_NAME, bfd_abs_section_ptr), |
751 | | GLOBAL_SYM_INIT (BFD_IND_SECTION_NAME, bfd_ind_section_ptr) |
752 | | }; |
753 | | |
754 | | #define STD_SECTION(NAME, IDX, FLAGS) \ |
755 | | BFD_FAKE_SECTION(_bfd_std_section[IDX], &global_syms[IDX], NAME, IDX, FLAGS) |
756 | | |
757 | | asection _bfd_std_section[] = { |
758 | | STD_SECTION (BFD_COM_SECTION_NAME, 0, SEC_IS_COMMON), |
759 | | STD_SECTION (BFD_UND_SECTION_NAME, 1, 0), |
760 | | STD_SECTION (BFD_ABS_SECTION_NAME, 2, 0), |
761 | | STD_SECTION (BFD_IND_SECTION_NAME, 3, 0) |
762 | | }; |
763 | | #undef STD_SECTION |
764 | | |
765 | | /* Initialize an entry in the section hash table. */ |
766 | | |
767 | | struct bfd_hash_entry * |
768 | | bfd_section_hash_newfunc (struct bfd_hash_entry *entry, |
769 | | struct bfd_hash_table *table, |
770 | | const char *string) |
771 | 3.72M | { |
772 | | /* Allocate the structure if it has not already been allocated by a |
773 | | subclass. */ |
774 | 3.72M | if (entry == NULL) |
775 | 3.72M | { |
776 | 3.72M | entry = (struct bfd_hash_entry *) |
777 | 3.72M | bfd_hash_allocate (table, sizeof (struct section_hash_entry)); |
778 | 3.72M | if (entry == NULL) |
779 | 0 | return entry; |
780 | 3.72M | } |
781 | | |
782 | | /* Call the allocation method of the superclass. */ |
783 | 3.72M | entry = bfd_hash_newfunc (entry, table, string); |
784 | 3.72M | if (entry != NULL) |
785 | 3.72M | memset (&((struct section_hash_entry *) entry)->section, 0, |
786 | 3.72M | sizeof (asection)); |
787 | | |
788 | 3.72M | return entry; |
789 | 3.72M | } |
790 | | |
791 | | #define section_hash_lookup(table, string, create, copy) \ |
792 | 4.08M | ((struct section_hash_entry *) \ |
793 | 4.08M | bfd_hash_lookup ((table), (string), (create), (copy))) |
794 | | |
795 | | /* Create a symbol whose only job is to point to this section. This |
796 | | is useful for things like relocs which are relative to the base |
797 | | of a section. */ |
798 | | |
799 | | bool |
800 | | _bfd_generic_new_section_hook (bfd *abfd, asection *newsect) |
801 | 3.72M | { |
802 | 3.72M | newsect->symbol = bfd_make_empty_symbol (abfd); |
803 | 3.72M | if (newsect->symbol == NULL) |
804 | 0 | return false; |
805 | | |
806 | 3.72M | newsect->symbol->name = newsect->name; |
807 | 3.72M | newsect->symbol->value = 0; |
808 | 3.72M | newsect->symbol->section = newsect; |
809 | 3.72M | newsect->symbol->flags = BSF_SECTION_SYM; |
810 | | |
811 | 3.72M | return true; |
812 | 3.72M | } |
813 | | |
814 | | unsigned int _bfd_section_id = 0x10; /* id 0 to 3 used by STD_SECTION. */ |
815 | | |
816 | | /* Initializes a new section. NEWSECT->NAME is already set. */ |
817 | | |
818 | | static asection * |
819 | | bfd_section_init (bfd *abfd, asection *newsect) |
820 | 3.72M | { |
821 | | /* Locking needed for the _bfd_section_id access. */ |
822 | 3.72M | if (!bfd_lock ()) |
823 | 0 | return NULL; |
824 | | |
825 | 3.72M | newsect->id = _bfd_section_id; |
826 | 3.72M | newsect->index = abfd->section_count; |
827 | 3.72M | newsect->owner = abfd; |
828 | | |
829 | 3.72M | if (! BFD_SEND (abfd, _new_section_hook, (abfd, newsect))) |
830 | 0 | return NULL; |
831 | | |
832 | 3.72M | _bfd_section_id++; |
833 | 3.72M | abfd->section_count++; |
834 | 3.72M | bfd_section_list_append (abfd, newsect); |
835 | | |
836 | 3.72M | if (!bfd_unlock ()) |
837 | 0 | return NULL; |
838 | | |
839 | 3.72M | return newsect; |
840 | 3.72M | } |
841 | | |
842 | | /* |
843 | | DOCDD |
844 | | INODE |
845 | | section prototypes, , typedef asection, Sections |
846 | | SUBSECTION |
847 | | Section prototypes |
848 | | |
849 | | These are the functions exported by the section handling part of BFD. |
850 | | */ |
851 | | |
852 | | /* |
853 | | FUNCTION |
854 | | bfd_section_list_clear |
855 | | |
856 | | SYNOPSIS |
857 | | void bfd_section_list_clear (bfd *); |
858 | | |
859 | | DESCRIPTION |
860 | | Clears the section list, and also resets the section count and |
861 | | hash table entries. |
862 | | */ |
863 | | |
864 | | void |
865 | | bfd_section_list_clear (bfd *abfd) |
866 | 43.2M | { |
867 | 43.2M | abfd->sections = NULL; |
868 | 43.2M | abfd->section_last = NULL; |
869 | 43.2M | abfd->section_count = 0; |
870 | 43.2M | memset (abfd->section_htab.table, 0, |
871 | 43.2M | abfd->section_htab.size * sizeof (struct bfd_hash_entry *)); |
872 | 43.2M | abfd->section_htab.count = 0; |
873 | 43.2M | } |
874 | | |
875 | | /* |
876 | | FUNCTION |
877 | | bfd_get_section_by_name |
878 | | |
879 | | SYNOPSIS |
880 | | asection *bfd_get_section_by_name (bfd *abfd, const char *name); |
881 | | |
882 | | DESCRIPTION |
883 | | Return the most recently created section attached to @var{abfd} |
884 | | named @var{name}. Return NULL if no such section exists. |
885 | | */ |
886 | | |
887 | | asection * |
888 | | bfd_get_section_by_name (bfd *abfd, const char *name) |
889 | 342k | { |
890 | 342k | struct section_hash_entry *sh; |
891 | | |
892 | 342k | if (name == NULL) |
893 | 0 | return NULL; |
894 | | |
895 | 342k | sh = section_hash_lookup (&abfd->section_htab, name, false, false); |
896 | 342k | if (sh != NULL) |
897 | 118k | return &sh->section; |
898 | | |
899 | 224k | return NULL; |
900 | 342k | } |
901 | | |
902 | | /* |
903 | | FUNCTION |
904 | | bfd_get_next_section_by_name |
905 | | |
906 | | SYNOPSIS |
907 | | asection *bfd_get_next_section_by_name (bfd *ibfd, asection *sec); |
908 | | |
909 | | DESCRIPTION |
910 | | Given @var{sec} is a section returned by @code{bfd_get_section_by_name}, |
911 | | return the next most recently created section attached to the same |
912 | | BFD with the same name, or if no such section exists in the same BFD and |
913 | | IBFD is non-NULL, the next section with the same name in any input |
914 | | BFD following IBFD. Return NULL on finding no section. |
915 | | */ |
916 | | |
917 | | asection * |
918 | | bfd_get_next_section_by_name (bfd *ibfd, asection *sec) |
919 | 5.52k | { |
920 | 5.52k | struct section_hash_entry *sh; |
921 | 5.52k | const char *name; |
922 | 5.52k | unsigned long hash; |
923 | | |
924 | 5.52k | sh = ((struct section_hash_entry *) |
925 | 5.52k | ((char *) sec - offsetof (struct section_hash_entry, section))); |
926 | | |
927 | 5.52k | hash = sh->root.hash; |
928 | 5.52k | name = sec->name; |
929 | 5.52k | for (sh = (struct section_hash_entry *) sh->root.next; |
930 | 5.54k | sh != NULL; |
931 | 5.52k | sh = (struct section_hash_entry *) sh->root.next) |
932 | 5.13k | if (sh->root.hash == hash |
933 | 5.12k | && strcmp (sh->root.string, name) == 0) |
934 | 5.11k | return &sh->section; |
935 | | |
936 | 413 | if (ibfd != NULL) |
937 | 0 | { |
938 | 0 | while ((ibfd = ibfd->link.next) != NULL) |
939 | 0 | { |
940 | 0 | asection *s = bfd_get_section_by_name (ibfd, name); |
941 | 0 | if (s != NULL) |
942 | 0 | return s; |
943 | 0 | } |
944 | 0 | } |
945 | | |
946 | 413 | return NULL; |
947 | 413 | } |
948 | | |
949 | | /* |
950 | | FUNCTION |
951 | | bfd_get_linker_section |
952 | | |
953 | | SYNOPSIS |
954 | | asection *bfd_get_linker_section (bfd *abfd, const char *name); |
955 | | |
956 | | DESCRIPTION |
957 | | Return the linker created section attached to @var{abfd} |
958 | | named @var{name}. Return NULL if no such section exists. |
959 | | */ |
960 | | |
961 | | asection * |
962 | | bfd_get_linker_section (bfd *abfd, const char *name) |
963 | 0 | { |
964 | 0 | asection *sec = bfd_get_section_by_name (abfd, name); |
965 | |
|
966 | 0 | while (sec != NULL && (sec->flags & SEC_LINKER_CREATED) == 0) |
967 | 0 | sec = bfd_get_next_section_by_name (NULL, sec); |
968 | 0 | return sec; |
969 | 0 | } |
970 | | |
971 | | /* |
972 | | FUNCTION |
973 | | bfd_get_section_by_name_if |
974 | | |
975 | | SYNOPSIS |
976 | | asection *bfd_get_section_by_name_if |
977 | | (bfd *abfd, |
978 | | const char *name, |
979 | | bool (*func) (bfd *abfd, asection *sect, void *obj), |
980 | | void *obj); |
981 | | |
982 | | DESCRIPTION |
983 | | Call the provided function @var{func} for each section |
984 | | attached to the BFD @var{abfd} whose name matches @var{name}, |
985 | | passing @var{obj} as an argument. The function will be called |
986 | | as if by |
987 | | |
988 | | | func (abfd, the_section, obj); |
989 | | |
990 | | It returns the first section for which @var{func} returns true, |
991 | | otherwise <<NULL>>. |
992 | | |
993 | | */ |
994 | | |
995 | | asection * |
996 | | bfd_get_section_by_name_if (bfd *abfd, const char *name, |
997 | | bool (*operation) (bfd *, asection *, void *), |
998 | | void *user_storage) |
999 | 7.39k | { |
1000 | 7.39k | struct section_hash_entry *sh; |
1001 | 7.39k | unsigned long hash; |
1002 | | |
1003 | 7.39k | if (name == NULL) |
1004 | 0 | return NULL; |
1005 | | |
1006 | 7.39k | sh = section_hash_lookup (&abfd->section_htab, name, false, false); |
1007 | 7.39k | if (sh == NULL) |
1008 | 166 | return NULL; |
1009 | | |
1010 | 7.22k | hash = sh->root.hash; |
1011 | 349k | for (; sh != NULL; sh = (struct section_hash_entry *) sh->root.next) |
1012 | 347k | if (sh->root.hash == hash |
1013 | 344k | && strcmp (sh->root.string, name) == 0 |
1014 | 344k | && (*operation) (abfd, &sh->section, user_storage)) |
1015 | 5.25k | return &sh->section; |
1016 | | |
1017 | 1.97k | return NULL; |
1018 | 7.22k | } |
1019 | | |
1020 | | /* |
1021 | | FUNCTION |
1022 | | bfd_get_unique_section_name |
1023 | | |
1024 | | SYNOPSIS |
1025 | | char *bfd_get_unique_section_name |
1026 | | (bfd *abfd, const char *templat, int *count); |
1027 | | |
1028 | | DESCRIPTION |
1029 | | Invent a section name that is unique in @var{abfd} by tacking |
1030 | | a dot and a digit suffix onto the original @var{templat}. If |
1031 | | @var{count} is non-NULL, then it specifies the first number |
1032 | | tried as a suffix to generate a unique name. The value |
1033 | | pointed to by @var{count} will be incremented in this case. |
1034 | | */ |
1035 | | |
1036 | | char * |
1037 | | bfd_get_unique_section_name (bfd *abfd, const char *templat, int *count) |
1038 | 0 | { |
1039 | 0 | int num; |
1040 | 0 | unsigned int len; |
1041 | 0 | char *sname; |
1042 | |
|
1043 | 0 | len = strlen (templat); |
1044 | 0 | sname = bfd_alloc (abfd, len + 8); |
1045 | 0 | if (sname == NULL) |
1046 | 0 | return NULL; |
1047 | 0 | memcpy (sname, templat, len); |
1048 | 0 | num = 1; |
1049 | 0 | if (count != NULL) |
1050 | 0 | num = *count; |
1051 | |
|
1052 | 0 | do |
1053 | 0 | { |
1054 | | /* If we have a million sections, something is badly wrong. */ |
1055 | 0 | if (num > 999999) |
1056 | 0 | abort (); |
1057 | 0 | sprintf (sname + len, ".%d", num++); |
1058 | 0 | } |
1059 | 0 | while (section_hash_lookup (&abfd->section_htab, sname, false, false)); |
1060 | | |
1061 | 0 | if (count != NULL) |
1062 | 0 | *count = num; |
1063 | 0 | return sname; |
1064 | 0 | } |
1065 | | |
1066 | | /* |
1067 | | FUNCTION |
1068 | | bfd_make_section_old_way |
1069 | | |
1070 | | SYNOPSIS |
1071 | | asection *bfd_make_section_old_way (bfd *abfd, const char *name); |
1072 | | |
1073 | | DESCRIPTION |
1074 | | Create a new empty section called @var{name} |
1075 | | and attach it to the end of the chain of sections for the |
1076 | | BFD @var{abfd}. An attempt to create a section with a name which |
1077 | | is already in use returns its pointer without changing the |
1078 | | section chain. |
1079 | | |
1080 | | It has the funny name since this is the way it used to be |
1081 | | before it was rewritten.... |
1082 | | |
1083 | | Possible errors are: |
1084 | | o <<bfd_error_invalid_operation>> - |
1085 | | If output has already started for this BFD. |
1086 | | o <<bfd_error_no_memory>> - |
1087 | | If memory allocation fails. |
1088 | | |
1089 | | */ |
1090 | | |
1091 | | asection * |
1092 | | bfd_make_section_old_way (bfd *abfd, const char *name) |
1093 | 21.3k | { |
1094 | 21.3k | asection *newsect; |
1095 | | |
1096 | 21.3k | if (abfd->output_has_begun) |
1097 | 0 | { |
1098 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1099 | 0 | return NULL; |
1100 | 0 | } |
1101 | | |
1102 | 21.3k | if (strcmp (name, BFD_ABS_SECTION_NAME) == 0) |
1103 | 1.76k | newsect = bfd_abs_section_ptr; |
1104 | 19.6k | else if (strcmp (name, BFD_COM_SECTION_NAME) == 0) |
1105 | 2.25k | newsect = bfd_com_section_ptr; |
1106 | 17.3k | else if (strcmp (name, BFD_UND_SECTION_NAME) == 0) |
1107 | 2.07k | newsect = bfd_und_section_ptr; |
1108 | 15.2k | else if (strcmp (name, BFD_IND_SECTION_NAME) == 0) |
1109 | 1.32k | newsect = bfd_ind_section_ptr; |
1110 | 13.9k | else |
1111 | 13.9k | { |
1112 | 13.9k | struct section_hash_entry *sh; |
1113 | | |
1114 | 13.9k | sh = section_hash_lookup (&abfd->section_htab, name, true, false); |
1115 | 13.9k | if (sh == NULL) |
1116 | 0 | return NULL; |
1117 | | |
1118 | 13.9k | newsect = &sh->section; |
1119 | 13.9k | if (newsect->name != NULL) |
1120 | 7.07k | { |
1121 | | /* Section already exists. */ |
1122 | 7.07k | return newsect; |
1123 | 7.07k | } |
1124 | | |
1125 | 6.89k | newsect->name = name; |
1126 | 6.89k | return bfd_section_init (abfd, newsect); |
1127 | 13.9k | } |
1128 | | |
1129 | 7.42k | return newsect; |
1130 | 21.3k | } |
1131 | | |
1132 | | /* |
1133 | | FUNCTION |
1134 | | bfd_make_section_anyway_with_flags |
1135 | | |
1136 | | SYNOPSIS |
1137 | | asection *bfd_make_section_anyway_with_flags |
1138 | | (bfd *abfd, const char *name, flagword flags); |
1139 | | |
1140 | | DESCRIPTION |
1141 | | Create a new empty section called @var{name} and attach it to the end of |
1142 | | the chain of sections for @var{abfd}. Create a new section even if there |
1143 | | is already a section with that name. Also set the attributes of the |
1144 | | new section to the value @var{flags}. |
1145 | | |
1146 | | Return <<NULL>> and set <<bfd_error>> on error; possible errors are: |
1147 | | o <<bfd_error_invalid_operation>> - If output has already started for @var{abfd}. |
1148 | | o <<bfd_error_no_memory>> - If memory allocation fails. |
1149 | | */ |
1150 | | |
1151 | | sec_ptr |
1152 | | bfd_make_section_anyway_with_flags (bfd *abfd, const char *name, |
1153 | | flagword flags) |
1154 | 2.98M | { |
1155 | 2.98M | struct section_hash_entry *sh; |
1156 | 2.98M | asection *newsect; |
1157 | | |
1158 | 2.98M | if (abfd->output_has_begun) |
1159 | 0 | { |
1160 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1161 | 0 | return NULL; |
1162 | 0 | } |
1163 | | |
1164 | 2.98M | sh = section_hash_lookup (&abfd->section_htab, name, true, false); |
1165 | 2.98M | if (sh == NULL) |
1166 | 0 | return NULL; |
1167 | | |
1168 | 2.98M | newsect = &sh->section; |
1169 | 2.98M | if (newsect->name != NULL) |
1170 | 1.96M | { |
1171 | | /* We are making a section of the same name. Put it in the |
1172 | | section hash table. Even though we can't find it directly by a |
1173 | | hash lookup, we'll be able to find the section by traversing |
1174 | | sh->root.next quicker than looking at all the bfd sections. */ |
1175 | 1.96M | struct section_hash_entry *new_sh; |
1176 | 1.96M | new_sh = (struct section_hash_entry *) |
1177 | 1.96M | bfd_section_hash_newfunc (NULL, &abfd->section_htab, name); |
1178 | 1.96M | if (new_sh == NULL) |
1179 | 0 | return NULL; |
1180 | | |
1181 | 1.96M | new_sh->root = sh->root; |
1182 | 1.96M | sh->root.next = &new_sh->root; |
1183 | 1.96M | newsect = &new_sh->section; |
1184 | 1.96M | } |
1185 | | |
1186 | 2.98M | newsect->flags = flags; |
1187 | 2.98M | newsect->name = name; |
1188 | 2.98M | return bfd_section_init (abfd, newsect); |
1189 | 2.98M | } |
1190 | | |
1191 | | /* |
1192 | | FUNCTION |
1193 | | bfd_make_section_anyway |
1194 | | |
1195 | | SYNOPSIS |
1196 | | asection *bfd_make_section_anyway (bfd *abfd, const char *name); |
1197 | | |
1198 | | DESCRIPTION |
1199 | | Create a new empty section called @var{name} and attach it to the end of |
1200 | | the chain of sections for @var{abfd}. Create a new section even if there |
1201 | | is already a section with that name. |
1202 | | |
1203 | | Return <<NULL>> and set <<bfd_error>> on error; possible errors are: |
1204 | | o <<bfd_error_invalid_operation>> - If output has already started for @var{abfd}. |
1205 | | o <<bfd_error_no_memory>> - If memory allocation fails. |
1206 | | */ |
1207 | | |
1208 | | sec_ptr |
1209 | | bfd_make_section_anyway (bfd *abfd, const char *name) |
1210 | 2.54M | { |
1211 | 2.54M | return bfd_make_section_anyway_with_flags (abfd, name, 0); |
1212 | 2.54M | } |
1213 | | |
1214 | | /* |
1215 | | FUNCTION |
1216 | | bfd_make_section_with_flags |
1217 | | |
1218 | | SYNOPSIS |
1219 | | asection *bfd_make_section_with_flags |
1220 | | (bfd *, const char *name, flagword flags); |
1221 | | |
1222 | | DESCRIPTION |
1223 | | Like <<bfd_make_section_anyway>>, but return <<NULL>> (without calling |
1224 | | bfd_set_error ()) without changing the section chain if there is already a |
1225 | | section named @var{name}. Also set the attributes of the new section to |
1226 | | the value @var{flags}. If there is an error, return <<NULL>> and set |
1227 | | <<bfd_error>>. |
1228 | | */ |
1229 | | |
1230 | | asection * |
1231 | | bfd_make_section_with_flags (bfd *abfd, const char *name, |
1232 | | flagword flags) |
1233 | 731k | { |
1234 | 731k | struct section_hash_entry *sh; |
1235 | 731k | asection *newsect; |
1236 | | |
1237 | 731k | if (abfd == NULL || name == NULL || abfd->output_has_begun) |
1238 | 0 | { |
1239 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1240 | 0 | return NULL; |
1241 | 0 | } |
1242 | | |
1243 | 731k | if (strcmp (name, BFD_ABS_SECTION_NAME) == 0 |
1244 | 731k | || strcmp (name, BFD_COM_SECTION_NAME) == 0 |
1245 | 731k | || strcmp (name, BFD_UND_SECTION_NAME) == 0 |
1246 | 731k | || strcmp (name, BFD_IND_SECTION_NAME) == 0) |
1247 | 67 | return NULL; |
1248 | | |
1249 | 731k | sh = section_hash_lookup (&abfd->section_htab, name, true, false); |
1250 | 731k | if (sh == NULL) |
1251 | 0 | return NULL; |
1252 | | |
1253 | 731k | newsect = &sh->section; |
1254 | 731k | if (newsect->name != NULL) |
1255 | 7 | { |
1256 | | /* Section already exists. */ |
1257 | 7 | return NULL; |
1258 | 7 | } |
1259 | | |
1260 | 731k | newsect->name = name; |
1261 | 731k | newsect->flags = flags; |
1262 | 731k | return bfd_section_init (abfd, newsect); |
1263 | 731k | } |
1264 | | |
1265 | | /* |
1266 | | FUNCTION |
1267 | | bfd_make_section |
1268 | | |
1269 | | SYNOPSIS |
1270 | | asection *bfd_make_section (bfd *, const char *name); |
1271 | | |
1272 | | DESCRIPTION |
1273 | | Like <<bfd_make_section_anyway>>, but return <<NULL>> (without calling |
1274 | | bfd_set_error ()) without changing the section chain if there is already a |
1275 | | section named @var{name}. If there is an error, return <<NULL>> and set |
1276 | | <<bfd_error>>. |
1277 | | */ |
1278 | | |
1279 | | asection * |
1280 | | bfd_make_section (bfd *abfd, const char *name) |
1281 | 720k | { |
1282 | 720k | return bfd_make_section_with_flags (abfd, name, 0); |
1283 | 720k | } |
1284 | | |
1285 | | /* |
1286 | | FUNCTION |
1287 | | bfd_set_section_flags |
1288 | | |
1289 | | SYNOPSIS |
1290 | | bool bfd_set_section_flags (asection *sec, flagword flags); |
1291 | | |
1292 | | DESCRIPTION |
1293 | | Set the attributes of the section @var{sec} to the value @var{flags}. |
1294 | | Return <<TRUE>> on success, <<FALSE>> on error. Possible error |
1295 | | returns are: |
1296 | | |
1297 | | o <<bfd_error_invalid_operation>> - |
1298 | | The section cannot have one or more of the attributes |
1299 | | requested. For example, a .bss section in <<a.out>> may not |
1300 | | have the <<SEC_HAS_CONTENTS>> field set. |
1301 | | |
1302 | | */ |
1303 | | |
1304 | | bool |
1305 | | bfd_set_section_flags (asection *section, flagword flags) |
1306 | 871k | { |
1307 | 871k | section->flags = flags; |
1308 | 871k | return true; |
1309 | 871k | } |
1310 | | |
1311 | | /* |
1312 | | FUNCTION |
1313 | | bfd_rename_section |
1314 | | |
1315 | | SYNOPSIS |
1316 | | void bfd_rename_section |
1317 | | (asection *sec, const char *newname); |
1318 | | |
1319 | | DESCRIPTION |
1320 | | Rename section @var{sec} to @var{newname}. |
1321 | | */ |
1322 | | |
1323 | | void |
1324 | | bfd_rename_section (asection *sec, const char *newname) |
1325 | 0 | { |
1326 | 0 | struct section_hash_entry *sh; |
1327 | |
|
1328 | 0 | sh = (struct section_hash_entry *) |
1329 | 0 | ((char *) sec - offsetof (struct section_hash_entry, section)); |
1330 | 0 | sh->section.name = newname; |
1331 | 0 | bfd_hash_rename (&sec->owner->section_htab, newname, &sh->root); |
1332 | 0 | } |
1333 | | |
1334 | | /* |
1335 | | FUNCTION |
1336 | | bfd_map_over_sections |
1337 | | |
1338 | | SYNOPSIS |
1339 | | void bfd_map_over_sections |
1340 | | (bfd *abfd, |
1341 | | void (*func) (bfd *abfd, asection *sect, void *obj), |
1342 | | void *obj); |
1343 | | |
1344 | | DESCRIPTION |
1345 | | Call the provided function @var{func} for each section |
1346 | | attached to the BFD @var{abfd}, passing @var{obj} as an |
1347 | | argument. The function will be called as if by |
1348 | | |
1349 | | | func (abfd, the_section, obj); |
1350 | | |
1351 | | This is the preferred method for iterating over sections; an |
1352 | | alternative would be to use a loop: |
1353 | | |
1354 | | | asection *p; |
1355 | | | for (p = abfd->sections; p != NULL; p = p->next) |
1356 | | | func (abfd, p, ...) |
1357 | | |
1358 | | */ |
1359 | | |
1360 | | void |
1361 | | bfd_map_over_sections (bfd *abfd, |
1362 | | void (*operation) (bfd *, asection *, void *), |
1363 | | void *user_storage) |
1364 | 209k | { |
1365 | 209k | asection *sect; |
1366 | 209k | unsigned int i = 0; |
1367 | | |
1368 | 6.17M | for (sect = abfd->sections; sect != NULL; i++, sect = sect->next) |
1369 | 5.96M | (*operation) (abfd, sect, user_storage); |
1370 | | |
1371 | 209k | if (i != abfd->section_count) /* Debugging */ |
1372 | 0 | abort (); |
1373 | 209k | } |
1374 | | |
1375 | | /* |
1376 | | FUNCTION |
1377 | | bfd_sections_find_if |
1378 | | |
1379 | | SYNOPSIS |
1380 | | asection *bfd_sections_find_if |
1381 | | (bfd *abfd, |
1382 | | bool (*operation) (bfd *abfd, asection *sect, void *obj), |
1383 | | void *obj); |
1384 | | |
1385 | | DESCRIPTION |
1386 | | Call the provided function @var{operation} for each section |
1387 | | attached to the BFD @var{abfd}, passing @var{obj} as an |
1388 | | argument. The function will be called as if by |
1389 | | |
1390 | | | operation (abfd, the_section, obj); |
1391 | | |
1392 | | It returns the first section for which @var{operation} returns true. |
1393 | | |
1394 | | */ |
1395 | | |
1396 | | asection * |
1397 | | bfd_sections_find_if (bfd *abfd, |
1398 | | bool (*operation) (bfd *, asection *, void *), |
1399 | | void *user_storage) |
1400 | 24 | { |
1401 | 24 | asection *sect; |
1402 | | |
1403 | 82 | for (sect = abfd->sections; sect != NULL; sect = sect->next) |
1404 | 67 | if ((*operation) (abfd, sect, user_storage)) |
1405 | 9 | break; |
1406 | | |
1407 | 24 | return sect; |
1408 | 24 | } |
1409 | | |
1410 | | /* |
1411 | | FUNCTION |
1412 | | bfd_set_section_size |
1413 | | |
1414 | | SYNOPSIS |
1415 | | bool bfd_set_section_size (asection *sec, bfd_size_type val); |
1416 | | |
1417 | | DESCRIPTION |
1418 | | Set @var{sec} to the size @var{val}. If the operation is |
1419 | | ok, then <<TRUE>> is returned, else <<FALSE>>. |
1420 | | |
1421 | | Possible error returns: |
1422 | | o <<bfd_error_invalid_operation>> - |
1423 | | Writing has started to the BFD, so setting the size is invalid. |
1424 | | |
1425 | | */ |
1426 | | |
1427 | | bool |
1428 | | bfd_set_section_size (asection *sec, bfd_size_type val) |
1429 | 437k | { |
1430 | | /* Once you've started writing to any section you cannot create or change |
1431 | | the size of any others. */ |
1432 | | |
1433 | 437k | if (sec->owner == NULL || sec->owner->output_has_begun) |
1434 | 6 | { |
1435 | 6 | bfd_set_error (bfd_error_invalid_operation); |
1436 | 6 | return false; |
1437 | 6 | } |
1438 | | |
1439 | 437k | sec->size = val; |
1440 | 437k | return true; |
1441 | 437k | } |
1442 | | |
1443 | | /* |
1444 | | FUNCTION |
1445 | | bfd_set_section_contents |
1446 | | |
1447 | | SYNOPSIS |
1448 | | bool bfd_set_section_contents |
1449 | | (bfd *abfd, asection *section, const void *data, |
1450 | | file_ptr offset, bfd_size_type count); |
1451 | | |
1452 | | DESCRIPTION |
1453 | | Sets the contents of the section @var{section} in BFD |
1454 | | @var{abfd} to the data starting in memory at @var{location}. |
1455 | | The data is written to the output section starting at offset |
1456 | | @var{offset} for @var{count} octets. |
1457 | | |
1458 | | Normally <<TRUE>> is returned, but <<FALSE>> is returned if |
1459 | | there was an error. Possible error returns are: |
1460 | | o <<bfd_error_no_contents>> - |
1461 | | The output section does not have the <<SEC_HAS_CONTENTS>> |
1462 | | attribute, so nothing can be written to it. |
1463 | | o <<bfd_error_bad_value>> - |
1464 | | The section is unable to contain all of the data. |
1465 | | o <<bfd_error_invalid_operation>> - |
1466 | | The BFD is not writeable. |
1467 | | o and some more too. |
1468 | | |
1469 | | This routine is front end to the back end function |
1470 | | <<_bfd_set_section_contents>>. |
1471 | | |
1472 | | */ |
1473 | | |
1474 | | bool |
1475 | | bfd_set_section_contents (bfd *abfd, |
1476 | | sec_ptr section, |
1477 | | const void *location, |
1478 | | file_ptr offset, |
1479 | | bfd_size_type count) |
1480 | 1.27k | { |
1481 | 1.27k | bfd_size_type sz; |
1482 | | |
1483 | 1.27k | if (!(bfd_section_flags (section) & SEC_HAS_CONTENTS)) |
1484 | 0 | { |
1485 | 0 | bfd_set_error (bfd_error_no_contents); |
1486 | 0 | return false; |
1487 | 0 | } |
1488 | | |
1489 | 1.27k | sz = section->size; |
1490 | 1.27k | if ((bfd_size_type) offset > sz |
1491 | 1.27k | || count > sz - offset |
1492 | 1.27k | || count != (size_t) count) |
1493 | 0 | { |
1494 | 0 | bfd_set_error (bfd_error_bad_value); |
1495 | 0 | return false; |
1496 | 0 | } |
1497 | | |
1498 | 1.27k | if (!bfd_write_p (abfd)) |
1499 | 0 | { |
1500 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1501 | 0 | return false; |
1502 | 0 | } |
1503 | | |
1504 | | /* Record a copy of the data in memory if desired. */ |
1505 | 1.27k | if (section->contents |
1506 | 0 | && location != section->contents + offset) |
1507 | 0 | memcpy (section->contents + offset, location, (size_t) count); |
1508 | | |
1509 | 1.27k | if (BFD_SEND (abfd, _bfd_set_section_contents, |
1510 | 1.27k | (abfd, section, location, offset, count))) |
1511 | 1.27k | { |
1512 | 1.27k | abfd->output_has_begun = true; |
1513 | 1.27k | return true; |
1514 | 1.27k | } |
1515 | | |
1516 | 5 | return false; |
1517 | 1.27k | } |
1518 | | |
1519 | | /* |
1520 | | FUNCTION |
1521 | | bfd_get_section_contents |
1522 | | |
1523 | | SYNOPSIS |
1524 | | bool bfd_get_section_contents |
1525 | | (bfd *abfd, asection *section, void *location, file_ptr offset, |
1526 | | bfd_size_type count); |
1527 | | |
1528 | | DESCRIPTION |
1529 | | Read data from @var{section} in BFD @var{abfd} |
1530 | | into memory starting at @var{location}. The data is read at an |
1531 | | offset of @var{offset} from the start of the input section, |
1532 | | and is read for @var{count} bytes. |
1533 | | |
1534 | | If the contents of a constructor with the <<SEC_CONSTRUCTOR>> |
1535 | | flag set are requested or if the section does not have the |
1536 | | <<SEC_HAS_CONTENTS>> flag set, then the @var{location} is filled |
1537 | | with zeroes. If no errors occur, <<TRUE>> is returned, else |
1538 | | <<FALSE>>. |
1539 | | |
1540 | | */ |
1541 | | bool |
1542 | | bfd_get_section_contents (bfd *abfd, |
1543 | | sec_ptr section, |
1544 | | void *location, |
1545 | | file_ptr offset, |
1546 | | bfd_size_type count) |
1547 | 1.01M | { |
1548 | 1.01M | bfd_size_type sz; |
1549 | | |
1550 | 1.01M | if (count == 0) |
1551 | | /* Don't bother. */ |
1552 | 6 | return true; |
1553 | | |
1554 | 1.01M | if (section == NULL) |
1555 | 0 | { |
1556 | 0 | bfd_set_error (bfd_error_bad_value); |
1557 | 0 | return false; |
1558 | 0 | } |
1559 | | |
1560 | 1.01M | if (location == NULL) |
1561 | 0 | { |
1562 | 0 | if (section->mmapped_p) |
1563 | 0 | { |
1564 | | /* Pass this request straight on to the target's function. |
1565 | | All of the code below assumes that location != NULL. |
1566 | | FIXME: Should we still check that count is sane ? */ |
1567 | 0 | return BFD_SEND (abfd, _bfd_get_section_contents, |
1568 | 0 | (abfd, section, location, offset, count)); |
1569 | 0 | } |
1570 | | |
1571 | 0 | bfd_set_error (bfd_error_bad_value); |
1572 | 0 | return false; |
1573 | 0 | } |
1574 | | |
1575 | 1.01M | if (section->flags & SEC_CONSTRUCTOR) |
1576 | 0 | { |
1577 | 0 | memset (location, 0, (size_t) count); |
1578 | 0 | return true; |
1579 | 0 | } |
1580 | | |
1581 | 1.01M | if ((section->flags & SEC_HAS_CONTENTS) == 0) |
1582 | 125k | { |
1583 | 125k | memset (location, 0, (size_t) count); |
1584 | 125k | return true; |
1585 | 125k | } |
1586 | | |
1587 | 886k | if (abfd == NULL) |
1588 | 0 | return false; |
1589 | | |
1590 | 886k | sz = bfd_get_section_limit_octets (abfd, section); |
1591 | 886k | if ((bfd_size_type) offset > sz |
1592 | 886k | || count > sz - offset |
1593 | 843k | || count != (size_t) count) |
1594 | 42.6k | { |
1595 | 42.6k | bfd_set_error (bfd_error_bad_value); |
1596 | 42.6k | return false; |
1597 | 42.6k | } |
1598 | | |
1599 | 843k | if ((section->flags & SEC_IN_MEMORY) != 0) |
1600 | 142 | { |
1601 | 142 | if (section->contents == NULL) |
1602 | 0 | { |
1603 | | /* This can happen because of errors earlier on in the linking process. |
1604 | | We do not want to seg-fault here, so clear the flag and return an |
1605 | | error code. */ |
1606 | 0 | section->flags &= ~ SEC_IN_MEMORY; |
1607 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1608 | 0 | return false; |
1609 | 0 | } |
1610 | | |
1611 | 142 | memmove (location, section->contents + offset, (size_t) count); |
1612 | 142 | return true; |
1613 | 142 | } |
1614 | | |
1615 | 843k | return BFD_SEND (abfd, _bfd_get_section_contents, |
1616 | 843k | (abfd, section, location, offset, count)); |
1617 | 843k | } |
1618 | | |
1619 | | /* |
1620 | | FUNCTION |
1621 | | bfd_malloc_and_get_section |
1622 | | |
1623 | | SYNOPSIS |
1624 | | bool bfd_malloc_and_get_section |
1625 | | (bfd *abfd, asection *section, bfd_byte **buf); |
1626 | | |
1627 | | DESCRIPTION |
1628 | | Read all data from @var{section} in BFD @var{abfd} |
1629 | | into a buffer, *@var{buf}, malloc'd by this function. |
1630 | | Return @code{true} on success, @code{false} on failure in which |
1631 | | case *@var{buf} will be NULL. |
1632 | | */ |
1633 | | |
1634 | | bool |
1635 | | bfd_malloc_and_get_section (bfd *abfd, sec_ptr sec, bfd_byte **buf) |
1636 | 314k | { |
1637 | | /* FIXME: We sometimes get here when sec->alloced is set. |
1638 | | arm, aarch64, and xtensa targets all abort on some ld tests |
1639 | | if we also test sec->alloced here. We really should not ever be |
1640 | | mallocing a buffer if we already have an alloced one. */ |
1641 | 314k | if (sec->mmapped_p) |
1642 | 0 | abort (); |
1643 | 314k | *buf = NULL; |
1644 | 314k | return bfd_get_full_section_contents (abfd, sec, buf); |
1645 | 314k | } |
1646 | | /* |
1647 | | FUNCTION |
1648 | | bfd_copy_private_section_data |
1649 | | |
1650 | | DESCRIPTION |
1651 | | Copy private section information from @var{isec} in the BFD |
1652 | | @var{ibfd} to the section @var{osec} in the BFD @var{obfd}. |
1653 | | Return <<TRUE>> on success, <<FALSE>> on error. Possible error |
1654 | | returns are: |
1655 | | |
1656 | | o <<bfd_error_no_memory>> - |
1657 | | Not enough memory exists to create private data for @var{osec}. |
1658 | | |
1659 | | .#define bfd_copy_private_section_data(ibfd, isec, obfd, osec, link_info) \ |
1660 | | . BFD_SEND (obfd, _bfd_copy_private_section_data, \ |
1661 | | . (ibfd, isec, obfd, osec, link_info)) |
1662 | | */ |
1663 | | |
1664 | | /* |
1665 | | FUNCTION |
1666 | | bfd_generic_is_group_section |
1667 | | |
1668 | | SYNOPSIS |
1669 | | bool bfd_generic_is_group_section (bfd *, const asection *sec); |
1670 | | |
1671 | | DESCRIPTION |
1672 | | Returns TRUE if @var{sec} is a member of a group. |
1673 | | */ |
1674 | | |
1675 | | bool |
1676 | | bfd_generic_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, |
1677 | | const asection *sec ATTRIBUTE_UNUSED) |
1678 | 0 | { |
1679 | 0 | return false; |
1680 | 0 | } |
1681 | | |
1682 | | /* |
1683 | | FUNCTION |
1684 | | bfd_generic_group_name |
1685 | | |
1686 | | SYNOPSIS |
1687 | | const char *bfd_generic_group_name (bfd *, const asection *sec); |
1688 | | |
1689 | | DESCRIPTION |
1690 | | Returns group name if @var{sec} is a member of a group. |
1691 | | */ |
1692 | | |
1693 | | const char * |
1694 | | bfd_generic_group_name (bfd *abfd ATTRIBUTE_UNUSED, |
1695 | | const asection *sec ATTRIBUTE_UNUSED) |
1696 | 0 | { |
1697 | 0 | return NULL; |
1698 | 0 | } |
1699 | | |
1700 | | /* |
1701 | | FUNCTION |
1702 | | bfd_generic_discard_group |
1703 | | |
1704 | | SYNOPSIS |
1705 | | bool bfd_generic_discard_group (bfd *abfd, asection *group); |
1706 | | |
1707 | | DESCRIPTION |
1708 | | Remove all members of @var{group} from the output. |
1709 | | */ |
1710 | | |
1711 | | bool |
1712 | | bfd_generic_discard_group (bfd *abfd ATTRIBUTE_UNUSED, |
1713 | | asection *group ATTRIBUTE_UNUSED) |
1714 | 0 | { |
1715 | 0 | return true; |
1716 | 0 | } |
1717 | | |
1718 | | bool |
1719 | | _bfd_nowrite_set_section_contents (bfd *abfd, |
1720 | | sec_ptr section ATTRIBUTE_UNUSED, |
1721 | | const void *location ATTRIBUTE_UNUSED, |
1722 | | file_ptr offset ATTRIBUTE_UNUSED, |
1723 | | bfd_size_type count ATTRIBUTE_UNUSED) |
1724 | 0 | { |
1725 | 0 | return _bfd_bool_bfd_false_error (abfd); |
1726 | 0 | } |
1727 | | |
1728 | | /* |
1729 | | FUNCTION |
1730 | | bfd_section_size_insane |
1731 | | |
1732 | | SYNOPSIS |
1733 | | bool bfd_section_size_insane (bfd *abfd, asection *sec); |
1734 | | |
1735 | | DESCRIPTION |
1736 | | Returns true if the given section has a size that indicates |
1737 | | it cannot be read from file. Return false if the size is OK |
1738 | | *or* this function can't say one way or the other. |
1739 | | |
1740 | | */ |
1741 | | |
1742 | | bool |
1743 | | bfd_section_size_insane (bfd *abfd, asection *sec) |
1744 | 672k | { |
1745 | 672k | bfd_size_type size = bfd_get_section_limit_octets (abfd, sec); |
1746 | 672k | if (size == 0) |
1747 | 474 | return false; |
1748 | | |
1749 | 672k | if ((bfd_section_flags (sec) & SEC_IN_MEMORY) != 0 |
1750 | | /* PR 24753: Linker created sections can be larger than |
1751 | | the file size, eg if they are being used to hold stubs. */ |
1752 | 672k | || (bfd_section_flags (sec) & SEC_LINKER_CREATED) != 0 |
1753 | | /* PR 24753: Sections which have no content should also be |
1754 | | excluded as they contain no size on disk. */ |
1755 | 672k | || (bfd_section_flags (sec) & SEC_HAS_CONTENTS) == 0 |
1756 | | /* The MMO file format supports its own special compression |
1757 | | technique, but it uses COMPRESS_SECTION_NONE when loading |
1758 | | a section's contents. */ |
1759 | 672k | || bfd_get_flavour (abfd) == bfd_target_mmo_flavour) |
1760 | 286 | return false; |
1761 | | |
1762 | 672k | ufile_ptr filesize = bfd_get_file_size (abfd); |
1763 | 672k | if (filesize == 0) |
1764 | 0 | return false; |
1765 | | |
1766 | 672k | if (sec->compress_status == DECOMPRESS_SECTION_ZSTD |
1767 | 672k | || sec->compress_status == DECOMPRESS_SECTION_ZLIB) |
1768 | 3 | { |
1769 | | /* PR26946, PR28834: Sanity check compress header uncompressed |
1770 | | size against the original file size, and check that the |
1771 | | compressed section can be read from file. We choose an |
1772 | | arbitrary uncompressed size of 10x the file size, rather than |
1773 | | a compress ratio. The reason being that compiling |
1774 | | "int aaa..a;" with "a" repeated enough times can result in |
1775 | | compression ratios without limit for .debug_str, whereas such |
1776 | | a file will usually also have the enormous symbol |
1777 | | uncompressed in .symtab. */ |
1778 | 3 | if (size / 10 > filesize) |
1779 | 1 | { |
1780 | 1 | bfd_set_error (bfd_error_bad_value); |
1781 | 1 | return true; |
1782 | 1 | } |
1783 | 2 | size = sec->compressed_size; |
1784 | 2 | } |
1785 | | |
1786 | 672k | if ((ufile_ptr) sec->filepos > filesize || size > filesize - sec->filepos) |
1787 | 530k | { |
1788 | 530k | bfd_set_error (bfd_error_file_truncated); |
1789 | 530k | return true; |
1790 | 530k | } |
1791 | 141k | return false; |
1792 | 672k | } |