/src/binutils-gdb/bfd/section.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* Object file "section" support for the BFD library. |
2 | | Copyright (C) 1990-2025 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 | | . {* Some internal packed boolean fields. *} |
385 | | . |
386 | | . {* See the vma field. *} |
387 | | . unsigned int user_set_vma : 1; |
388 | | . |
389 | | . {* A mark flag used by some of the linker backends. *} |
390 | | . unsigned int linker_mark : 1; |
391 | | . |
392 | | . {* Another mark flag used by some of the linker backends. Set for |
393 | | . output sections that have an input section. *} |
394 | | . unsigned int linker_has_input : 1; |
395 | | . |
396 | | . {* Mark flag used by some linker backends for garbage collection. *} |
397 | | . unsigned int gc_mark : 1; |
398 | | . |
399 | | . {* Section compression status. *} |
400 | | . unsigned int compress_status : 2; |
401 | | .#define COMPRESS_SECTION_NONE 0 |
402 | | .#define COMPRESS_SECTION_DONE 1 |
403 | | .#define DECOMPRESS_SECTION_ZLIB 2 |
404 | | .#define DECOMPRESS_SECTION_ZSTD 3 |
405 | | . |
406 | | . {* The following flags are used by the ELF linker. *} |
407 | | . |
408 | | . {* Mark sections which have been allocated to segments. *} |
409 | | . unsigned int segment_mark : 1; |
410 | | . |
411 | | . {* Type of sec_info information. *} |
412 | | . unsigned int sec_info_type:3; |
413 | | .#define SEC_INFO_TYPE_NONE 0 |
414 | | .#define SEC_INFO_TYPE_STABS 1 |
415 | | .#define SEC_INFO_TYPE_MERGE 2 |
416 | | .#define SEC_INFO_TYPE_EH_FRAME 3 |
417 | | .#define SEC_INFO_TYPE_JUST_SYMS 4 |
418 | | .#define SEC_INFO_TYPE_TARGET 5 |
419 | | .#define SEC_INFO_TYPE_EH_FRAME_ENTRY 6 |
420 | | .#define SEC_INFO_TYPE_SFRAME 7 |
421 | | . |
422 | | . {* Nonzero if this section uses RELA relocations, rather than REL. *} |
423 | | . unsigned int use_rela_p:1; |
424 | | . |
425 | | . {* Nonzero if section contents are mmapped. *} |
426 | | . unsigned int mmapped_p:1; |
427 | | . |
428 | | . {* Nonzero if section contents should not be freed. *} |
429 | | . unsigned int alloced:1; |
430 | | . |
431 | | . {* Bits used by various backends. The generic code doesn't touch |
432 | | . these fields. *} |
433 | | . |
434 | | . unsigned int sec_flg0:1; |
435 | | . unsigned int sec_flg1:1; |
436 | | . unsigned int sec_flg2:1; |
437 | | . unsigned int sec_flg3:1; |
438 | | . unsigned int sec_flg4:1; |
439 | | . unsigned int sec_flg5:1; |
440 | | . |
441 | | . {* End of internal packed boolean fields. *} |
442 | | . |
443 | | . {* The virtual memory address of the section - where it will be |
444 | | . at run time. The symbols are relocated against this. The |
445 | | . user_set_vma flag is maintained by bfd; if it's not set, the |
446 | | . backend can assign addresses (for example, in <<a.out>>, where |
447 | | . the default address for <<.data>> is dependent on the specific |
448 | | . target and various flags). *} |
449 | | . bfd_vma vma; |
450 | | . |
451 | | . {* The load address of the section - where it would be in a |
452 | | . rom image; really only used for writing section header |
453 | | . information. *} |
454 | | . bfd_vma lma; |
455 | | . |
456 | | . {* The size of the section in *octets*, as it will be output. |
457 | | . Contains a value even if the section has no contents (e.g., the |
458 | | . size of <<.bss>>). *} |
459 | | . bfd_size_type size; |
460 | | . |
461 | | . {* For input sections, the original size on disk of the section, in |
462 | | . octets. This field should be set for any section whose size is |
463 | | . changed by linker relaxation. It is required for sections where |
464 | | . the linker relaxation scheme doesn't cache altered section and |
465 | | . reloc contents (stabs, eh_frame, SEC_MERGE, some coff relaxing |
466 | | . targets), and thus the original size needs to be kept to read the |
467 | | . section multiple times. For output sections, rawsize holds the |
468 | | . section size calculated on a previous linker relaxation pass. *} |
469 | | . bfd_size_type rawsize; |
470 | | . |
471 | | . {* The compressed size of the section in octets. *} |
472 | | . bfd_size_type compressed_size; |
473 | | . |
474 | | . {* If this section is going to be output, then this value is the |
475 | | . offset in *bytes* into the output section of the first byte in the |
476 | | . input section (byte ==> smallest addressable unit on the |
477 | | . target). In most cases, if this was going to start at the |
478 | | . 100th octet (8-bit quantity) in the output section, this value |
479 | | . would be 100. However, if the target byte size is 16 bits |
480 | | . (bfd_octets_per_byte is "2"), this value would be 50. *} |
481 | | . bfd_vma output_offset; |
482 | | . |
483 | | . {* The output section through which to map on output. *} |
484 | | . struct bfd_section *output_section; |
485 | | . |
486 | | . {* If an input section, a pointer to a vector of relocation |
487 | | . records for the data in this section. *} |
488 | | . struct reloc_cache_entry *relocation; |
489 | | . |
490 | | . {* If an output section, a pointer to a vector of pointers to |
491 | | . relocation records for the data in this section. *} |
492 | | . struct reloc_cache_entry **orelocation; |
493 | | . |
494 | | . {* The number of relocation records in one of the above. *} |
495 | | . unsigned reloc_count; |
496 | | . |
497 | | . {* The alignment requirement of the section, as an exponent of 2 - |
498 | | . e.g., 3 aligns to 2^3 (or 8). *} |
499 | | . unsigned int alignment_power; |
500 | | . |
501 | | . {* Information below is back end specific - and not always used |
502 | | . or updated. *} |
503 | | . |
504 | | . {* File position of section data. *} |
505 | | . file_ptr filepos; |
506 | | . |
507 | | . {* File position of relocation info. *} |
508 | | . file_ptr rel_filepos; |
509 | | . |
510 | | . {* File position of line data. *} |
511 | | . file_ptr line_filepos; |
512 | | . |
513 | | . {* Pointer to data for applications. *} |
514 | | . void *userdata; |
515 | | . |
516 | | . {* If the SEC_IN_MEMORY flag is set, this points to the actual |
517 | | . contents. *} |
518 | | . bfd_byte *contents; |
519 | | . |
520 | | . {* Attached line number information. *} |
521 | | . alent *lineno; |
522 | | . |
523 | | . {* Number of line number records. *} |
524 | | . unsigned int lineno_count; |
525 | | . |
526 | | . {* Entity size for merging purposes. *} |
527 | | . unsigned int entsize; |
528 | | . |
529 | | . {* Points to the kept section if this section is a link-once section, |
530 | | . and is discarded. *} |
531 | | . struct bfd_section *kept_section; |
532 | | . |
533 | | . {* When a section is being output, this value changes as more |
534 | | . linenumbers are written out. *} |
535 | | . file_ptr moving_line_filepos; |
536 | | . |
537 | | . {* What the section number is in the target world. *} |
538 | | . int target_index; |
539 | | . |
540 | | . void *used_by_bfd; |
541 | | . |
542 | | . {* If this is a constructor section then here is a list of the |
543 | | . relocations created to relocate items within it. *} |
544 | | . struct relent_chain *constructor_chain; |
545 | | . |
546 | | . {* The BFD which owns the section. *} |
547 | | . bfd *owner; |
548 | | . |
549 | | . {* A symbol which points at this section only. *} |
550 | | . struct bfd_symbol *symbol; |
551 | | . |
552 | | . {* Early in the link process, map_head and map_tail are used to build |
553 | | . a list of input sections attached to an output section. Later, |
554 | | . output sections use these fields for a list of bfd_link_order |
555 | | . structs. The linked_to_symbol_name field is for ELF assembler |
556 | | . internal use. *} |
557 | | . union { |
558 | | . struct bfd_link_order *link_order; |
559 | | . struct bfd_section *s; |
560 | | . const char *linked_to_symbol_name; |
561 | | . } map_head, map_tail; |
562 | | . |
563 | | . {* Points to the output section this section is already assigned to, |
564 | | . if any. This is used when support for non-contiguous memory |
565 | | . regions is enabled. *} |
566 | | . struct bfd_section *already_assigned; |
567 | | . |
568 | | . {* Explicitly specified section type, if non-zero. *} |
569 | | . unsigned int type; |
570 | | . |
571 | | .} asection; |
572 | | . |
573 | | |
574 | | EXTERNAL |
575 | | .static inline const char * |
576 | | .bfd_section_name (const asection *sec) |
577 | | .{ |
578 | | . return sec->name; |
579 | | .} |
580 | | . |
581 | | .static inline bfd_size_type |
582 | | .bfd_section_size (const asection *sec) |
583 | | .{ |
584 | | . return sec->size; |
585 | | .} |
586 | | . |
587 | | .static inline bfd_vma |
588 | | .bfd_section_vma (const asection *sec) |
589 | | .{ |
590 | | . return sec->vma; |
591 | | .} |
592 | | . |
593 | | .static inline bfd_vma |
594 | | .bfd_section_lma (const asection *sec) |
595 | | .{ |
596 | | . return sec->lma; |
597 | | .} |
598 | | . |
599 | | .static inline unsigned int |
600 | | .bfd_section_alignment (const asection *sec) |
601 | | .{ |
602 | | . return sec->alignment_power; |
603 | | .} |
604 | | . |
605 | | .static inline flagword |
606 | | .bfd_section_flags (const asection *sec) |
607 | | .{ |
608 | | . return sec->flags; |
609 | | .} |
610 | | . |
611 | | .static inline void * |
612 | | .bfd_section_userdata (const asection *sec) |
613 | | .{ |
614 | | . return sec->userdata; |
615 | | .} |
616 | | .static inline bool |
617 | | .bfd_is_com_section (const asection *sec) |
618 | | .{ |
619 | | . return (sec->flags & SEC_IS_COMMON) != 0; |
620 | | .} |
621 | | . |
622 | | .{* Note: the following are provided as inline functions rather than macros |
623 | | . because not all callers use the return value. A macro implementation |
624 | | . would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some |
625 | | . compilers will complain about comma expressions that have no effect. *} |
626 | | .static inline bool |
627 | | .bfd_set_section_userdata (asection *sec, void *val) |
628 | | .{ |
629 | | . sec->userdata = val; |
630 | | . return true; |
631 | | .} |
632 | | . |
633 | | .static inline bool |
634 | | .bfd_set_section_vma (asection *sec, bfd_vma val) |
635 | | .{ |
636 | | . sec->vma = sec->lma = val; |
637 | | . sec->user_set_vma = true; |
638 | | . return true; |
639 | | .} |
640 | | . |
641 | | .static inline bool |
642 | | .bfd_set_section_lma (asection *sec, bfd_vma val) |
643 | | .{ |
644 | | . sec->lma = val; |
645 | | . return true; |
646 | | .} |
647 | | . |
648 | | .static inline bool |
649 | | .bfd_set_section_alignment (asection *sec, unsigned int val) |
650 | | .{ |
651 | | . if (val >= sizeof (bfd_vma) * 8 - 1) |
652 | | . return false; |
653 | | . sec->alignment_power = val; |
654 | | . return true; |
655 | | .} |
656 | | . |
657 | | .{* These sections are global, and are managed by BFD. The application |
658 | | . and target back end are not permitted to change the values in |
659 | | . these sections. *} |
660 | | .extern asection _bfd_std_section[4]; |
661 | | . |
662 | | .#define BFD_ABS_SECTION_NAME "*ABS*" |
663 | | .#define BFD_UND_SECTION_NAME "*UND*" |
664 | | .#define BFD_COM_SECTION_NAME "*COM*" |
665 | | .#define BFD_IND_SECTION_NAME "*IND*" |
666 | | . |
667 | | .{* GNU object-only section name. *} |
668 | | .#define GNU_OBJECT_ONLY_SECTION_NAME ".gnu_object_only" |
669 | | . |
670 | | .{* Pointer to the common section. *} |
671 | | .#define bfd_com_section_ptr (&_bfd_std_section[0]) |
672 | | .{* Pointer to the undefined section. *} |
673 | | .#define bfd_und_section_ptr (&_bfd_std_section[1]) |
674 | | .{* Pointer to the absolute section. *} |
675 | | .#define bfd_abs_section_ptr (&_bfd_std_section[2]) |
676 | | .{* Pointer to the indirect section. *} |
677 | | .#define bfd_ind_section_ptr (&_bfd_std_section[3]) |
678 | | . |
679 | | .static inline bool |
680 | | .bfd_is_und_section (const asection *sec) |
681 | | .{ |
682 | | . return sec == bfd_und_section_ptr; |
683 | | .} |
684 | | . |
685 | | .static inline bool |
686 | | .bfd_is_abs_section (const asection *sec) |
687 | | .{ |
688 | | . return sec == bfd_abs_section_ptr; |
689 | | .} |
690 | | . |
691 | | .static inline bool |
692 | | .bfd_is_ind_section (const asection *sec) |
693 | | .{ |
694 | | . return sec == bfd_ind_section_ptr; |
695 | | .} |
696 | | . |
697 | | .static inline bool |
698 | | .bfd_is_const_section (const asection *sec) |
699 | | .{ |
700 | | . return (sec >= _bfd_std_section |
701 | | . && sec < _bfd_std_section + (sizeof (_bfd_std_section) |
702 | | . / sizeof (_bfd_std_section[0]))); |
703 | | .} |
704 | | . |
705 | | .{* Return TRUE if input section SEC has been discarded. *} |
706 | | .static inline bool |
707 | | .discarded_section (const asection *sec) |
708 | | .{ |
709 | | . return (!bfd_is_abs_section (sec) |
710 | | . && bfd_is_abs_section (sec->output_section) |
711 | | . && sec->sec_info_type != SEC_INFO_TYPE_MERGE |
712 | | . && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS); |
713 | | .} |
714 | | . |
715 | | INTERNAL |
716 | | .#define BFD_FAKE_SECTION(SEC, SYM, NAME, IDX, FLAGS) \ |
717 | | . {* name, next, prev, id, section_id, index, flags, user_set_vma, *} \ |
718 | | . { NAME, NULL, NULL, IDX, 0, 0, FLAGS, 0, \ |
719 | | . \ |
720 | | . {* linker_mark, linker_has_input, gc_mark, decompress_status, *} \ |
721 | | . 0, 0, 1, 0, \ |
722 | | . \ |
723 | | . {* segment_mark, sec_info_type, use_rela_p, mmapped_p, alloced, *} \ |
724 | | . 0, 0, 0, 0, 0, \ |
725 | | . \ |
726 | | . {* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, *} \ |
727 | | . 0, 0, 0, 0, 0, 0, \ |
728 | | . \ |
729 | | . {* vma, lma, size, rawsize, compressed_size, *} \ |
730 | | . 0, 0, 0, 0, 0, \ |
731 | | . \ |
732 | | . {* output_offset, output_section, relocation, orelocation, *} \ |
733 | | . 0, &SEC, NULL, NULL, \ |
734 | | . \ |
735 | | . {* reloc_count, alignment_power, filepos, rel_filepos, *} \ |
736 | | . 0, 0, 0, 0, \ |
737 | | . \ |
738 | | . {* line_filepos, userdata, contents, lineno, lineno_count, *} \ |
739 | | . 0, NULL, NULL, NULL, 0, \ |
740 | | . \ |
741 | | . {* entsize, kept_section, moving_line_filepos, *} \ |
742 | | . 0, NULL, 0, \ |
743 | | . \ |
744 | | . {* target_index, used_by_bfd, constructor_chain, owner, *} \ |
745 | | . 0, NULL, NULL, NULL, \ |
746 | | . \ |
747 | | . {* symbol, *} \ |
748 | | . (struct bfd_symbol *) SYM, \ |
749 | | . \ |
750 | | . {* map_head, map_tail, already_assigned, type *} \ |
751 | | . { NULL }, { NULL }, NULL, 0 \ |
752 | | . \ |
753 | | . } |
754 | | . |
755 | | .#define GLOBAL_SYM_INIT(NAME, SECTION) \ |
756 | | . {* the_bfd, name, value, attr, section, udata *} \ |
757 | | . { 0, NAME, 0, BSF_SECTION_SYM, SECTION, { 0 } } |
758 | | . |
759 | | */ |
760 | | |
761 | | /* These symbols are global, not specific to any BFD. Therefore, anything |
762 | | that tries to change them is broken, and should be repaired. */ |
763 | | |
764 | | static const asymbol global_syms[] = |
765 | | { |
766 | | GLOBAL_SYM_INIT (BFD_COM_SECTION_NAME, bfd_com_section_ptr), |
767 | | GLOBAL_SYM_INIT (BFD_UND_SECTION_NAME, bfd_und_section_ptr), |
768 | | GLOBAL_SYM_INIT (BFD_ABS_SECTION_NAME, bfd_abs_section_ptr), |
769 | | GLOBAL_SYM_INIT (BFD_IND_SECTION_NAME, bfd_ind_section_ptr) |
770 | | }; |
771 | | |
772 | | #define STD_SECTION(NAME, IDX, FLAGS) \ |
773 | | BFD_FAKE_SECTION(_bfd_std_section[IDX], &global_syms[IDX], NAME, IDX, FLAGS) |
774 | | |
775 | | asection _bfd_std_section[] = { |
776 | | STD_SECTION (BFD_COM_SECTION_NAME, 0, SEC_IS_COMMON), |
777 | | STD_SECTION (BFD_UND_SECTION_NAME, 1, 0), |
778 | | STD_SECTION (BFD_ABS_SECTION_NAME, 2, 0), |
779 | | STD_SECTION (BFD_IND_SECTION_NAME, 3, 0) |
780 | | }; |
781 | | #undef STD_SECTION |
782 | | |
783 | | /* Initialize an entry in the section hash table. */ |
784 | | |
785 | | struct bfd_hash_entry * |
786 | | bfd_section_hash_newfunc (struct bfd_hash_entry *entry, |
787 | | struct bfd_hash_table *table, |
788 | | const char *string) |
789 | 162M | { |
790 | | /* Allocate the structure if it has not already been allocated by a |
791 | | subclass. */ |
792 | 162M | if (entry == NULL) |
793 | 162M | { |
794 | 162M | entry = (struct bfd_hash_entry *) |
795 | 162M | bfd_hash_allocate (table, sizeof (struct section_hash_entry)); |
796 | 162M | if (entry == NULL) |
797 | 0 | return entry; |
798 | 162M | } |
799 | | |
800 | | /* Call the allocation method of the superclass. */ |
801 | 162M | entry = bfd_hash_newfunc (entry, table, string); |
802 | 162M | if (entry != NULL) |
803 | 162M | memset (&((struct section_hash_entry *) entry)->section, 0, |
804 | 162M | sizeof (asection)); |
805 | | |
806 | 162M | return entry; |
807 | 162M | } |
808 | | |
809 | | #define section_hash_lookup(table, string, create, copy) \ |
810 | 186M | ((struct section_hash_entry *) \ |
811 | 186M | bfd_hash_lookup ((table), (string), (create), (copy))) |
812 | | |
813 | | /* Create a symbol whose only job is to point to this section. This |
814 | | is useful for things like relocs which are relative to the base |
815 | | of a section. */ |
816 | | |
817 | | bool |
818 | | _bfd_generic_new_section_hook (bfd *abfd, asection *newsect) |
819 | 162M | { |
820 | 162M | newsect->symbol = bfd_make_empty_symbol (abfd); |
821 | 162M | if (newsect->symbol == NULL) |
822 | 0 | return false; |
823 | | |
824 | 162M | newsect->symbol->name = newsect->name; |
825 | 162M | newsect->symbol->value = 0; |
826 | 162M | newsect->symbol->section = newsect; |
827 | 162M | newsect->symbol->flags = BSF_SECTION_SYM; |
828 | | |
829 | 162M | return true; |
830 | 162M | } |
831 | | |
832 | | unsigned int _bfd_section_id = 0x10; /* id 0 to 3 used by STD_SECTION. */ |
833 | | |
834 | | /* Initializes a new section. NEWSECT->NAME is already set. */ |
835 | | |
836 | | static asection * |
837 | | bfd_section_init (bfd *abfd, asection *newsect) |
838 | 162M | { |
839 | | /* Locking needed for the _bfd_section_id access. */ |
840 | 162M | if (!bfd_lock ()) |
841 | 0 | return NULL; |
842 | | |
843 | 162M | newsect->id = _bfd_section_id; |
844 | 162M | newsect->index = abfd->section_count; |
845 | 162M | newsect->owner = abfd; |
846 | | |
847 | 162M | if (! BFD_SEND (abfd, _new_section_hook, (abfd, newsect))) |
848 | 0 | return NULL; |
849 | | |
850 | 162M | _bfd_section_id++; |
851 | 162M | abfd->section_count++; |
852 | 162M | bfd_section_list_append (abfd, newsect); |
853 | | |
854 | 162M | if (!bfd_unlock ()) |
855 | 0 | return NULL; |
856 | | |
857 | 162M | return newsect; |
858 | 162M | } |
859 | | |
860 | | /* |
861 | | DOCDD |
862 | | INODE |
863 | | section prototypes, , typedef asection, Sections |
864 | | SUBSECTION |
865 | | Section prototypes |
866 | | |
867 | | These are the functions exported by the section handling part of BFD. |
868 | | */ |
869 | | |
870 | | /* |
871 | | FUNCTION |
872 | | bfd_section_list_clear |
873 | | |
874 | | SYNOPSIS |
875 | | void bfd_section_list_clear (bfd *); |
876 | | |
877 | | DESCRIPTION |
878 | | Clears the section list, and also resets the section count and |
879 | | hash table entries. |
880 | | */ |
881 | | |
882 | | void |
883 | | bfd_section_list_clear (bfd *abfd) |
884 | 923M | { |
885 | 923M | abfd->sections = NULL; |
886 | 923M | abfd->section_last = NULL; |
887 | 923M | abfd->section_count = 0; |
888 | 923M | memset (abfd->section_htab.table, 0, |
889 | 923M | abfd->section_htab.size * sizeof (struct bfd_hash_entry *)); |
890 | 923M | abfd->section_htab.count = 0; |
891 | 923M | } |
892 | | |
893 | | /* |
894 | | FUNCTION |
895 | | bfd_get_section_by_name |
896 | | |
897 | | SYNOPSIS |
898 | | asection *bfd_get_section_by_name (bfd *abfd, const char *name); |
899 | | |
900 | | DESCRIPTION |
901 | | Return the most recently created section attached to @var{abfd} |
902 | | named @var{name}. Return NULL if no such section exists. |
903 | | */ |
904 | | |
905 | | asection * |
906 | | bfd_get_section_by_name (bfd *abfd, const char *name) |
907 | 24.1M | { |
908 | 24.1M | struct section_hash_entry *sh; |
909 | | |
910 | 24.1M | if (name == NULL) |
911 | 0 | return NULL; |
912 | | |
913 | 24.1M | sh = section_hash_lookup (&abfd->section_htab, name, false, false); |
914 | 24.1M | if (sh != NULL) |
915 | 22.8M | return &sh->section; |
916 | | |
917 | 1.31M | return NULL; |
918 | 24.1M | } |
919 | | |
920 | | /* |
921 | | FUNCTION |
922 | | bfd_get_next_section_by_name |
923 | | |
924 | | SYNOPSIS |
925 | | asection *bfd_get_next_section_by_name (bfd *ibfd, asection *sec); |
926 | | |
927 | | DESCRIPTION |
928 | | Given @var{sec} is a section returned by @code{bfd_get_section_by_name}, |
929 | | return the next most recently created section attached to the same |
930 | | BFD with the same name, or if no such section exists in the same BFD and |
931 | | IBFD is non-NULL, the next section with the same name in any input |
932 | | BFD following IBFD. Return NULL on finding no section. |
933 | | */ |
934 | | |
935 | | asection * |
936 | | bfd_get_next_section_by_name (bfd *ibfd, asection *sec) |
937 | 98.4k | { |
938 | 98.4k | struct section_hash_entry *sh; |
939 | 98.4k | const char *name; |
940 | 98.4k | unsigned long hash; |
941 | | |
942 | 98.4k | sh = ((struct section_hash_entry *) |
943 | 98.4k | ((char *) sec - offsetof (struct section_hash_entry, section))); |
944 | | |
945 | 98.4k | hash = sh->root.hash; |
946 | 98.4k | name = sec->name; |
947 | 98.4k | for (sh = (struct section_hash_entry *) sh->root.next; |
948 | 105k | sh != NULL; |
949 | 98.4k | sh = (struct section_hash_entry *) sh->root.next) |
950 | 65.7k | if (sh->root.hash == hash |
951 | 65.7k | && strcmp (sh->root.string, name) == 0) |
952 | 58.6k | return &sh->section; |
953 | | |
954 | 39.8k | if (ibfd != NULL) |
955 | 0 | { |
956 | 0 | while ((ibfd = ibfd->link.next) != NULL) |
957 | 0 | { |
958 | 0 | asection *s = bfd_get_section_by_name (ibfd, name); |
959 | 0 | if (s != NULL) |
960 | 0 | return s; |
961 | 0 | } |
962 | 0 | } |
963 | | |
964 | 39.8k | return NULL; |
965 | 39.8k | } |
966 | | |
967 | | /* |
968 | | FUNCTION |
969 | | bfd_get_linker_section |
970 | | |
971 | | SYNOPSIS |
972 | | asection *bfd_get_linker_section (bfd *abfd, const char *name); |
973 | | |
974 | | DESCRIPTION |
975 | | Return the linker created section attached to @var{abfd} |
976 | | named @var{name}. Return NULL if no such section exists. |
977 | | */ |
978 | | |
979 | | asection * |
980 | | bfd_get_linker_section (bfd *abfd, const char *name) |
981 | 0 | { |
982 | 0 | asection *sec = bfd_get_section_by_name (abfd, name); |
983 | |
|
984 | 0 | while (sec != NULL && (sec->flags & SEC_LINKER_CREATED) == 0) |
985 | 0 | sec = bfd_get_next_section_by_name (NULL, sec); |
986 | 0 | return sec; |
987 | 0 | } |
988 | | |
989 | | /* |
990 | | FUNCTION |
991 | | bfd_get_section_by_name_if |
992 | | |
993 | | SYNOPSIS |
994 | | asection *bfd_get_section_by_name_if |
995 | | (bfd *abfd, |
996 | | const char *name, |
997 | | bool (*func) (bfd *abfd, asection *sect, void *obj), |
998 | | void *obj); |
999 | | |
1000 | | DESCRIPTION |
1001 | | Call the provided function @var{func} for each section |
1002 | | attached to the BFD @var{abfd} whose name matches @var{name}, |
1003 | | passing @var{obj} as an argument. The function will be called |
1004 | | as if by |
1005 | | |
1006 | | | func (abfd, the_section, obj); |
1007 | | |
1008 | | It returns the first section for which @var{func} returns true, |
1009 | | otherwise <<NULL>>. |
1010 | | |
1011 | | */ |
1012 | | |
1013 | | asection * |
1014 | | bfd_get_section_by_name_if (bfd *abfd, const char *name, |
1015 | | bool (*operation) (bfd *, asection *, void *), |
1016 | | void *user_storage) |
1017 | 288 | { |
1018 | 288 | struct section_hash_entry *sh; |
1019 | 288 | unsigned long hash; |
1020 | | |
1021 | 288 | if (name == NULL) |
1022 | 0 | return NULL; |
1023 | | |
1024 | 288 | sh = section_hash_lookup (&abfd->section_htab, name, false, false); |
1025 | 288 | if (sh == NULL) |
1026 | 197 | return NULL; |
1027 | | |
1028 | 91 | hash = sh->root.hash; |
1029 | 91 | for (; sh != NULL; sh = (struct section_hash_entry *) sh->root.next) |
1030 | 91 | if (sh->root.hash == hash |
1031 | 91 | && strcmp (sh->root.string, name) == 0 |
1032 | 91 | && (*operation) (abfd, &sh->section, user_storage)) |
1033 | 91 | return &sh->section; |
1034 | | |
1035 | 0 | return NULL; |
1036 | 91 | } |
1037 | | |
1038 | | /* |
1039 | | FUNCTION |
1040 | | bfd_get_unique_section_name |
1041 | | |
1042 | | SYNOPSIS |
1043 | | char *bfd_get_unique_section_name |
1044 | | (bfd *abfd, const char *templat, int *count); |
1045 | | |
1046 | | DESCRIPTION |
1047 | | Invent a section name that is unique in @var{abfd} by tacking |
1048 | | a dot and a digit suffix onto the original @var{templat}. If |
1049 | | @var{count} is non-NULL, then it specifies the first number |
1050 | | tried as a suffix to generate a unique name. The value |
1051 | | pointed to by @var{count} will be incremented in this case. |
1052 | | */ |
1053 | | |
1054 | | char * |
1055 | | bfd_get_unique_section_name (bfd *abfd, const char *templat, int *count) |
1056 | 0 | { |
1057 | 0 | int num; |
1058 | 0 | unsigned int len; |
1059 | 0 | char *sname; |
1060 | |
|
1061 | 0 | len = strlen (templat); |
1062 | 0 | sname = bfd_alloc (abfd, len + 8); |
1063 | 0 | if (sname == NULL) |
1064 | 0 | return NULL; |
1065 | 0 | memcpy (sname, templat, len); |
1066 | 0 | num = 1; |
1067 | 0 | if (count != NULL) |
1068 | 0 | num = *count; |
1069 | |
|
1070 | 0 | do |
1071 | 0 | { |
1072 | | /* If we have a million sections, something is badly wrong. */ |
1073 | 0 | if (num > 999999) |
1074 | 0 | abort (); |
1075 | 0 | sprintf (sname + len, ".%d", num++); |
1076 | 0 | } |
1077 | 0 | while (section_hash_lookup (&abfd->section_htab, sname, false, false)); |
1078 | | |
1079 | 0 | if (count != NULL) |
1080 | 0 | *count = num; |
1081 | 0 | return sname; |
1082 | 0 | } |
1083 | | |
1084 | | /* |
1085 | | FUNCTION |
1086 | | bfd_make_section_old_way |
1087 | | |
1088 | | SYNOPSIS |
1089 | | asection *bfd_make_section_old_way (bfd *abfd, const char *name); |
1090 | | |
1091 | | DESCRIPTION |
1092 | | Create a new empty section called @var{name} |
1093 | | and attach it to the end of the chain of sections for the |
1094 | | BFD @var{abfd}. An attempt to create a section with a name which |
1095 | | is already in use returns its pointer without changing the |
1096 | | section chain. |
1097 | | |
1098 | | It has the funny name since this is the way it used to be |
1099 | | before it was rewritten.... |
1100 | | |
1101 | | Possible errors are: |
1102 | | o <<bfd_error_invalid_operation>> - |
1103 | | If output has already started for this BFD. |
1104 | | o <<bfd_error_no_memory>> - |
1105 | | If memory allocation fails. |
1106 | | |
1107 | | */ |
1108 | | |
1109 | | asection * |
1110 | | bfd_make_section_old_way (bfd *abfd, const char *name) |
1111 | 325k | { |
1112 | 325k | asection *newsect; |
1113 | | |
1114 | 325k | if (abfd->output_has_begun) |
1115 | 0 | { |
1116 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1117 | 0 | return NULL; |
1118 | 0 | } |
1119 | | |
1120 | 325k | if (strcmp (name, BFD_ABS_SECTION_NAME) == 0) |
1121 | 6.96k | newsect = bfd_abs_section_ptr; |
1122 | 318k | else if (strcmp (name, BFD_COM_SECTION_NAME) == 0) |
1123 | 4.74k | newsect = bfd_com_section_ptr; |
1124 | 314k | else if (strcmp (name, BFD_UND_SECTION_NAME) == 0) |
1125 | 2.85k | newsect = bfd_und_section_ptr; |
1126 | 311k | else if (strcmp (name, BFD_IND_SECTION_NAME) == 0) |
1127 | 4.94k | newsect = bfd_ind_section_ptr; |
1128 | 306k | else |
1129 | 306k | { |
1130 | 306k | struct section_hash_entry *sh; |
1131 | | |
1132 | 306k | sh = section_hash_lookup (&abfd->section_htab, name, true, false); |
1133 | 306k | if (sh == NULL) |
1134 | 0 | return NULL; |
1135 | | |
1136 | 306k | newsect = &sh->section; |
1137 | 306k | if (newsect->name != NULL) |
1138 | 16.6k | { |
1139 | | /* Section already exists. */ |
1140 | 16.6k | return newsect; |
1141 | 16.6k | } |
1142 | | |
1143 | 289k | newsect->name = name; |
1144 | 289k | return bfd_section_init (abfd, newsect); |
1145 | 306k | } |
1146 | | |
1147 | 19.5k | return newsect; |
1148 | 325k | } |
1149 | | |
1150 | | /* |
1151 | | FUNCTION |
1152 | | bfd_make_section_anyway_with_flags |
1153 | | |
1154 | | SYNOPSIS |
1155 | | asection *bfd_make_section_anyway_with_flags |
1156 | | (bfd *abfd, const char *name, flagword flags); |
1157 | | |
1158 | | DESCRIPTION |
1159 | | Create a new empty section called @var{name} and attach it to the end of |
1160 | | the chain of sections for @var{abfd}. Create a new section even if there |
1161 | | is already a section with that name. Also set the attributes of the |
1162 | | new section to the value @var{flags}. |
1163 | | |
1164 | | Return <<NULL>> and set <<bfd_error>> on error; possible errors are: |
1165 | | o <<bfd_error_invalid_operation>> - If output has already started for @var{abfd}. |
1166 | | o <<bfd_error_no_memory>> - If memory allocation fails. |
1167 | | */ |
1168 | | |
1169 | | sec_ptr |
1170 | | bfd_make_section_anyway_with_flags (bfd *abfd, const char *name, |
1171 | | flagword flags) |
1172 | 159M | { |
1173 | 159M | struct section_hash_entry *sh; |
1174 | 159M | asection *newsect; |
1175 | | |
1176 | 159M | if (abfd->output_has_begun) |
1177 | 0 | { |
1178 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1179 | 0 | return NULL; |
1180 | 0 | } |
1181 | | |
1182 | 159M | sh = section_hash_lookup (&abfd->section_htab, name, true, false); |
1183 | 159M | if (sh == NULL) |
1184 | 0 | return NULL; |
1185 | | |
1186 | 159M | newsect = &sh->section; |
1187 | 159M | if (newsect->name != NULL) |
1188 | 92.2M | { |
1189 | | /* We are making a section of the same name. Put it in the |
1190 | | section hash table. Even though we can't find it directly by a |
1191 | | hash lookup, we'll be able to find the section by traversing |
1192 | | sh->root.next quicker than looking at all the bfd sections. */ |
1193 | 92.2M | struct section_hash_entry *new_sh; |
1194 | 92.2M | new_sh = (struct section_hash_entry *) |
1195 | 92.2M | bfd_section_hash_newfunc (NULL, &abfd->section_htab, name); |
1196 | 92.2M | if (new_sh == NULL) |
1197 | 0 | return NULL; |
1198 | | |
1199 | 92.2M | new_sh->root = sh->root; |
1200 | 92.2M | sh->root.next = &new_sh->root; |
1201 | 92.2M | newsect = &new_sh->section; |
1202 | 92.2M | } |
1203 | | |
1204 | 159M | newsect->flags = flags; |
1205 | 159M | newsect->name = name; |
1206 | 159M | return bfd_section_init (abfd, newsect); |
1207 | 159M | } |
1208 | | |
1209 | | /* |
1210 | | FUNCTION |
1211 | | bfd_make_section_anyway |
1212 | | |
1213 | | SYNOPSIS |
1214 | | asection *bfd_make_section_anyway (bfd *abfd, const char *name); |
1215 | | |
1216 | | DESCRIPTION |
1217 | | Create a new empty section called @var{name} and attach it to the end of |
1218 | | the chain of sections for @var{abfd}. Create a new section even if there |
1219 | | is already a section with that name. |
1220 | | |
1221 | | Return <<NULL>> and set <<bfd_error>> on error; possible errors are: |
1222 | | o <<bfd_error_invalid_operation>> - If output has already started for @var{abfd}. |
1223 | | o <<bfd_error_no_memory>> - If memory allocation fails. |
1224 | | */ |
1225 | | |
1226 | | sec_ptr |
1227 | | bfd_make_section_anyway (bfd *abfd, const char *name) |
1228 | 147M | { |
1229 | 147M | return bfd_make_section_anyway_with_flags (abfd, name, 0); |
1230 | 147M | } |
1231 | | |
1232 | | /* |
1233 | | FUNCTION |
1234 | | bfd_make_section_with_flags |
1235 | | |
1236 | | SYNOPSIS |
1237 | | asection *bfd_make_section_with_flags |
1238 | | (bfd *, const char *name, flagword flags); |
1239 | | |
1240 | | DESCRIPTION |
1241 | | Like <<bfd_make_section_anyway>>, but return <<NULL>> (without calling |
1242 | | bfd_set_error ()) without changing the section chain if there is already a |
1243 | | section named @var{name}. Also set the attributes of the new section to |
1244 | | the value @var{flags}. If there is an error, return <<NULL>> and set |
1245 | | <<bfd_error>>. |
1246 | | */ |
1247 | | |
1248 | | asection * |
1249 | | bfd_make_section_with_flags (bfd *abfd, const char *name, |
1250 | | flagword flags) |
1251 | 2.64M | { |
1252 | 2.64M | struct section_hash_entry *sh; |
1253 | 2.64M | asection *newsect; |
1254 | | |
1255 | 2.64M | if (abfd == NULL || name == NULL || abfd->output_has_begun) |
1256 | 0 | { |
1257 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1258 | 0 | return NULL; |
1259 | 0 | } |
1260 | | |
1261 | 2.64M | if (strcmp (name, BFD_ABS_SECTION_NAME) == 0 |
1262 | 2.64M | || strcmp (name, BFD_COM_SECTION_NAME) == 0 |
1263 | 2.64M | || strcmp (name, BFD_UND_SECTION_NAME) == 0 |
1264 | 2.64M | || strcmp (name, BFD_IND_SECTION_NAME) == 0) |
1265 | 524 | return NULL; |
1266 | | |
1267 | 2.64M | sh = section_hash_lookup (&abfd->section_htab, name, true, false); |
1268 | 2.64M | if (sh == NULL) |
1269 | 0 | return NULL; |
1270 | | |
1271 | 2.64M | newsect = &sh->section; |
1272 | 2.64M | if (newsect->name != NULL) |
1273 | 419 | { |
1274 | | /* Section already exists. */ |
1275 | 419 | return NULL; |
1276 | 419 | } |
1277 | | |
1278 | 2.64M | newsect->name = name; |
1279 | 2.64M | newsect->flags = flags; |
1280 | 2.64M | return bfd_section_init (abfd, newsect); |
1281 | 2.64M | } |
1282 | | |
1283 | | /* |
1284 | | FUNCTION |
1285 | | bfd_make_section |
1286 | | |
1287 | | SYNOPSIS |
1288 | | asection *bfd_make_section (bfd *, const char *name); |
1289 | | |
1290 | | DESCRIPTION |
1291 | | Like <<bfd_make_section_anyway>>, but return <<NULL>> (without calling |
1292 | | bfd_set_error ()) without changing the section chain if there is already a |
1293 | | section named @var{name}. If there is an error, return <<NULL>> and set |
1294 | | <<bfd_error>>. |
1295 | | */ |
1296 | | |
1297 | | asection * |
1298 | | bfd_make_section (bfd *abfd, const char *name) |
1299 | 2.42M | { |
1300 | 2.42M | return bfd_make_section_with_flags (abfd, name, 0); |
1301 | 2.42M | } |
1302 | | |
1303 | | /* |
1304 | | FUNCTION |
1305 | | bfd_set_section_flags |
1306 | | |
1307 | | SYNOPSIS |
1308 | | bool bfd_set_section_flags (asection *sec, flagword flags); |
1309 | | |
1310 | | DESCRIPTION |
1311 | | Set the attributes of the section @var{sec} to the value @var{flags}. |
1312 | | Return <<TRUE>> on success, <<FALSE>> on error. Possible error |
1313 | | returns are: |
1314 | | |
1315 | | o <<bfd_error_invalid_operation>> - |
1316 | | The section cannot have one or more of the attributes |
1317 | | requested. For example, a .bss section in <<a.out>> may not |
1318 | | have the <<SEC_HAS_CONTENTS>> field set. |
1319 | | |
1320 | | */ |
1321 | | |
1322 | | bool |
1323 | | bfd_set_section_flags (asection *section, flagword flags) |
1324 | 16.8M | { |
1325 | 16.8M | section->flags = flags; |
1326 | 16.8M | return true; |
1327 | 16.8M | } |
1328 | | |
1329 | | /* |
1330 | | FUNCTION |
1331 | | bfd_rename_section |
1332 | | |
1333 | | SYNOPSIS |
1334 | | void bfd_rename_section |
1335 | | (asection *sec, const char *newname); |
1336 | | |
1337 | | DESCRIPTION |
1338 | | Rename section @var{sec} to @var{newname}. |
1339 | | */ |
1340 | | |
1341 | | void |
1342 | | bfd_rename_section (asection *sec, const char *newname) |
1343 | 0 | { |
1344 | 0 | struct section_hash_entry *sh; |
1345 | |
|
1346 | 0 | sh = (struct section_hash_entry *) |
1347 | 0 | ((char *) sec - offsetof (struct section_hash_entry, section)); |
1348 | 0 | sh->section.name = newname; |
1349 | 0 | bfd_hash_rename (&sec->owner->section_htab, newname, &sh->root); |
1350 | 0 | } |
1351 | | |
1352 | | /* |
1353 | | FUNCTION |
1354 | | bfd_map_over_sections |
1355 | | |
1356 | | SYNOPSIS |
1357 | | void bfd_map_over_sections |
1358 | | (bfd *abfd, |
1359 | | void (*func) (bfd *abfd, asection *sect, void *obj), |
1360 | | void *obj); |
1361 | | |
1362 | | DESCRIPTION |
1363 | | Call the provided function @var{func} for each section |
1364 | | attached to the BFD @var{abfd}, passing @var{obj} as an |
1365 | | argument. The function will be called as if by |
1366 | | |
1367 | | | func (abfd, the_section, obj); |
1368 | | |
1369 | | This is the preferred method for iterating over sections; an |
1370 | | alternative would be to use a loop: |
1371 | | |
1372 | | | asection *p; |
1373 | | | for (p = abfd->sections; p != NULL; p = p->next) |
1374 | | | func (abfd, p, ...) |
1375 | | |
1376 | | */ |
1377 | | |
1378 | | void |
1379 | | bfd_map_over_sections (bfd *abfd, |
1380 | | void (*operation) (bfd *, asection *, void *), |
1381 | | void *user_storage) |
1382 | 472k | { |
1383 | 472k | asection *sect; |
1384 | 472k | unsigned int i = 0; |
1385 | | |
1386 | 26.8M | for (sect = abfd->sections; sect != NULL; i++, sect = sect->next) |
1387 | 26.3M | (*operation) (abfd, sect, user_storage); |
1388 | | |
1389 | 472k | if (i != abfd->section_count) /* Debugging */ |
1390 | 0 | abort (); |
1391 | 472k | } |
1392 | | |
1393 | | /* |
1394 | | FUNCTION |
1395 | | bfd_sections_find_if |
1396 | | |
1397 | | SYNOPSIS |
1398 | | asection *bfd_sections_find_if |
1399 | | (bfd *abfd, |
1400 | | bool (*operation) (bfd *abfd, asection *sect, void *obj), |
1401 | | void *obj); |
1402 | | |
1403 | | DESCRIPTION |
1404 | | Call the provided function @var{operation} for each section |
1405 | | attached to the BFD @var{abfd}, passing @var{obj} as an |
1406 | | argument. The function will be called as if by |
1407 | | |
1408 | | | operation (abfd, the_section, obj); |
1409 | | |
1410 | | It returns the first section for which @var{operation} returns true. |
1411 | | |
1412 | | */ |
1413 | | |
1414 | | asection * |
1415 | | bfd_sections_find_if (bfd *abfd, |
1416 | | bool (*operation) (bfd *, asection *, void *), |
1417 | | void *user_storage) |
1418 | 531 | { |
1419 | 531 | asection *sect; |
1420 | | |
1421 | 1.90k | for (sect = abfd->sections; sect != NULL; sect = sect->next) |
1422 | 1.45k | if ((*operation) (abfd, sect, user_storage)) |
1423 | 82 | break; |
1424 | | |
1425 | 531 | return sect; |
1426 | 531 | } |
1427 | | |
1428 | | /* |
1429 | | FUNCTION |
1430 | | bfd_set_section_size |
1431 | | |
1432 | | SYNOPSIS |
1433 | | bool bfd_set_section_size (asection *sec, bfd_size_type val); |
1434 | | |
1435 | | DESCRIPTION |
1436 | | Set @var{sec} to the size @var{val}. If the operation is |
1437 | | ok, then <<TRUE>> is returned, else <<FALSE>>. |
1438 | | |
1439 | | Possible error returns: |
1440 | | o <<bfd_error_invalid_operation>> - |
1441 | | Writing has started to the BFD, so setting the size is invalid. |
1442 | | |
1443 | | */ |
1444 | | |
1445 | | bool |
1446 | | bfd_set_section_size (asection *sec, bfd_size_type val) |
1447 | 5.98M | { |
1448 | | /* Once you've started writing to any section you cannot create or change |
1449 | | the size of any others. */ |
1450 | | |
1451 | 5.98M | if (sec->owner == NULL || sec->owner->output_has_begun) |
1452 | 15 | { |
1453 | 15 | bfd_set_error (bfd_error_invalid_operation); |
1454 | 15 | return false; |
1455 | 15 | } |
1456 | | |
1457 | 5.98M | sec->size = val; |
1458 | 5.98M | return true; |
1459 | 5.98M | } |
1460 | | |
1461 | | /* |
1462 | | FUNCTION |
1463 | | bfd_set_section_contents |
1464 | | |
1465 | | SYNOPSIS |
1466 | | bool bfd_set_section_contents |
1467 | | (bfd *abfd, asection *section, const void *data, |
1468 | | file_ptr offset, bfd_size_type count); |
1469 | | |
1470 | | DESCRIPTION |
1471 | | Sets the contents of the section @var{section} in BFD |
1472 | | @var{abfd} to the data starting in memory at @var{location}. |
1473 | | The data is written to the output section starting at offset |
1474 | | @var{offset} for @var{count} octets. |
1475 | | |
1476 | | Normally <<TRUE>> is returned, but <<FALSE>> is returned if |
1477 | | there was an error. Possible error returns are: |
1478 | | o <<bfd_error_no_contents>> - |
1479 | | The output section does not have the <<SEC_HAS_CONTENTS>> |
1480 | | attribute, so nothing can be written to it. |
1481 | | o <<bfd_error_bad_value>> - |
1482 | | The section is unable to contain all of the data. |
1483 | | o <<bfd_error_invalid_operation>> - |
1484 | | The BFD is not writeable. |
1485 | | o and some more too. |
1486 | | |
1487 | | This routine is front end to the back end function |
1488 | | <<_bfd_set_section_contents>>. |
1489 | | |
1490 | | */ |
1491 | | |
1492 | | bool |
1493 | | bfd_set_section_contents (bfd *abfd, |
1494 | | sec_ptr section, |
1495 | | const void *location, |
1496 | | file_ptr offset, |
1497 | | bfd_size_type count) |
1498 | 2.47k | { |
1499 | 2.47k | bfd_size_type sz; |
1500 | | |
1501 | 2.47k | if (!(bfd_section_flags (section) & SEC_HAS_CONTENTS)) |
1502 | 0 | { |
1503 | 0 | bfd_set_error (bfd_error_no_contents); |
1504 | 0 | return false; |
1505 | 0 | } |
1506 | | |
1507 | 2.47k | sz = section->size; |
1508 | 2.47k | if ((bfd_size_type) offset > sz |
1509 | 2.47k | || count > sz - offset |
1510 | 2.47k | || count != (size_t) count) |
1511 | 0 | { |
1512 | 0 | bfd_set_error (bfd_error_bad_value); |
1513 | 0 | return false; |
1514 | 0 | } |
1515 | | |
1516 | 2.47k | if (!bfd_write_p (abfd)) |
1517 | 0 | { |
1518 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1519 | 0 | return false; |
1520 | 0 | } |
1521 | | |
1522 | | /* Record a copy of the data in memory if desired. */ |
1523 | 2.47k | if (section->contents |
1524 | 2.47k | && location != section->contents + offset) |
1525 | 0 | memcpy (section->contents + offset, location, (size_t) count); |
1526 | | |
1527 | 2.47k | if (BFD_SEND (abfd, _bfd_set_section_contents, |
1528 | 2.47k | (abfd, section, location, offset, count))) |
1529 | 2.47k | { |
1530 | 2.47k | abfd->output_has_begun = true; |
1531 | 2.47k | return true; |
1532 | 2.47k | } |
1533 | | |
1534 | 1 | return false; |
1535 | 2.47k | } |
1536 | | |
1537 | | /* |
1538 | | FUNCTION |
1539 | | bfd_get_section_contents |
1540 | | |
1541 | | SYNOPSIS |
1542 | | bool bfd_get_section_contents |
1543 | | (bfd *abfd, asection *section, void *location, file_ptr offset, |
1544 | | bfd_size_type count); |
1545 | | |
1546 | | DESCRIPTION |
1547 | | Read data from @var{section} in BFD @var{abfd} |
1548 | | into memory starting at @var{location}. The data is read at an |
1549 | | offset of @var{offset} from the start of the input section, |
1550 | | and is read for @var{count} bytes. |
1551 | | |
1552 | | If the contents of a constructor with the <<SEC_CONSTRUCTOR>> |
1553 | | flag set are requested or if the section does not have the |
1554 | | <<SEC_HAS_CONTENTS>> flag set, then the @var{location} is filled |
1555 | | with zeroes. If no errors occur, <<TRUE>> is returned, else |
1556 | | <<FALSE>>. |
1557 | | |
1558 | | */ |
1559 | | bool |
1560 | | bfd_get_section_contents (bfd *abfd, |
1561 | | sec_ptr section, |
1562 | | void *location, |
1563 | | file_ptr offset, |
1564 | | bfd_size_type count) |
1565 | 4.60M | { |
1566 | 4.60M | bfd_size_type sz; |
1567 | | |
1568 | 4.60M | if (count == 0) |
1569 | | /* Don't bother. */ |
1570 | 27 | return true; |
1571 | | |
1572 | 4.60M | if (section == NULL) |
1573 | 0 | { |
1574 | 0 | bfd_set_error (bfd_error_bad_value); |
1575 | 0 | return false; |
1576 | 0 | } |
1577 | | |
1578 | 4.60M | if (location == NULL) |
1579 | 1.32k | { |
1580 | 1.32k | if (section->mmapped_p) |
1581 | 1.32k | { |
1582 | | /* Pass this request straight on to the target's function. |
1583 | | All of the code below assumes that location != NULL. |
1584 | | FIXME: Should we still check that count is sane ? */ |
1585 | 1.32k | return BFD_SEND (abfd, _bfd_get_section_contents, |
1586 | 1.32k | (abfd, section, location, offset, count)); |
1587 | 1.32k | } |
1588 | | |
1589 | 0 | bfd_set_error (bfd_error_bad_value); |
1590 | 0 | return false; |
1591 | 1.32k | } |
1592 | | |
1593 | 4.60M | if (section->flags & SEC_CONSTRUCTOR) |
1594 | 0 | { |
1595 | 0 | memset (location, 0, (size_t) count); |
1596 | 0 | return true; |
1597 | 0 | } |
1598 | | |
1599 | 4.60M | if ((section->flags & SEC_HAS_CONTENTS) == 0) |
1600 | 459k | { |
1601 | 459k | memset (location, 0, (size_t) count); |
1602 | 459k | return true; |
1603 | 459k | } |
1604 | | |
1605 | 4.14M | if (abfd == NULL) |
1606 | 0 | return false; |
1607 | | |
1608 | 4.14M | sz = bfd_get_section_limit_octets (abfd, section); |
1609 | 4.14M | if ((bfd_size_type) offset > sz |
1610 | 4.14M | || count > sz - offset |
1611 | 4.14M | || count != (size_t) count) |
1612 | 213k | { |
1613 | 213k | bfd_set_error (bfd_error_bad_value); |
1614 | 213k | return false; |
1615 | 213k | } |
1616 | | |
1617 | 3.93M | if ((section->flags & SEC_IN_MEMORY) != 0) |
1618 | 524 | { |
1619 | 524 | if (section->contents == NULL) |
1620 | 0 | { |
1621 | | /* This can happen because of errors earlier on in the linking process. |
1622 | | We do not want to seg-fault here, so clear the flag and return an |
1623 | | error code. */ |
1624 | 0 | section->flags &= ~ SEC_IN_MEMORY; |
1625 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1626 | 0 | return false; |
1627 | 0 | } |
1628 | | |
1629 | 524 | memmove (location, section->contents + offset, (size_t) count); |
1630 | 524 | return true; |
1631 | 524 | } |
1632 | | |
1633 | 3.93M | return BFD_SEND (abfd, _bfd_get_section_contents, |
1634 | 3.93M | (abfd, section, location, offset, count)); |
1635 | 3.93M | } |
1636 | | |
1637 | | /* |
1638 | | FUNCTION |
1639 | | bfd_malloc_and_get_section |
1640 | | |
1641 | | SYNOPSIS |
1642 | | bool bfd_malloc_and_get_section |
1643 | | (bfd *abfd, asection *section, bfd_byte **buf); |
1644 | | |
1645 | | DESCRIPTION |
1646 | | Read all data from @var{section} in BFD @var{abfd} |
1647 | | into a buffer, *@var{buf}, malloc'd by this function. |
1648 | | Return @code{true} on success, @code{false} on failure in which |
1649 | | case *@var{buf} will be NULL. |
1650 | | */ |
1651 | | |
1652 | | bool |
1653 | | bfd_malloc_and_get_section (bfd *abfd, sec_ptr sec, bfd_byte **buf) |
1654 | 1.04M | { |
1655 | | /* FIXME: We sometimes get here when sec->alloced is set. |
1656 | | arm, aarch64, and xtensa targets all abort on some ld tests |
1657 | | if we also test sec->alloced here. We really should not ever be |
1658 | | mallocing a buffer if we already have an alloced one. */ |
1659 | 1.04M | if (sec->mmapped_p) |
1660 | 0 | abort (); |
1661 | 1.04M | *buf = NULL; |
1662 | 1.04M | return bfd_get_full_section_contents (abfd, sec, buf); |
1663 | 1.04M | } |
1664 | | /* |
1665 | | FUNCTION |
1666 | | bfd_copy_private_section_data |
1667 | | |
1668 | | SYNOPSIS |
1669 | | bool bfd_copy_private_section_data |
1670 | | (bfd *ibfd, asection *isec, bfd *obfd, asection *osec); |
1671 | | |
1672 | | DESCRIPTION |
1673 | | Copy private section information from @var{isec} in the BFD |
1674 | | @var{ibfd} to the section @var{osec} in the BFD @var{obfd}. |
1675 | | Return <<TRUE>> on success, <<FALSE>> on error. Possible error |
1676 | | returns are: |
1677 | | |
1678 | | o <<bfd_error_no_memory>> - |
1679 | | Not enough memory exists to create private data for @var{osec}. |
1680 | | |
1681 | | .#define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \ |
1682 | | . BFD_SEND (obfd, _bfd_copy_private_section_data, \ |
1683 | | . (ibfd, isection, obfd, osection)) |
1684 | | */ |
1685 | | |
1686 | | /* |
1687 | | FUNCTION |
1688 | | bfd_generic_is_group_section |
1689 | | |
1690 | | SYNOPSIS |
1691 | | bool bfd_generic_is_group_section (bfd *, const asection *sec); |
1692 | | |
1693 | | DESCRIPTION |
1694 | | Returns TRUE if @var{sec} is a member of a group. |
1695 | | */ |
1696 | | |
1697 | | bool |
1698 | | bfd_generic_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, |
1699 | | const asection *sec ATTRIBUTE_UNUSED) |
1700 | 0 | { |
1701 | 0 | return false; |
1702 | 0 | } |
1703 | | |
1704 | | /* |
1705 | | FUNCTION |
1706 | | bfd_generic_group_name |
1707 | | |
1708 | | SYNOPSIS |
1709 | | const char *bfd_generic_group_name (bfd *, const asection *sec); |
1710 | | |
1711 | | DESCRIPTION |
1712 | | Returns group name if @var{sec} is a member of a group. |
1713 | | */ |
1714 | | |
1715 | | const char * |
1716 | | bfd_generic_group_name (bfd *abfd ATTRIBUTE_UNUSED, |
1717 | | const asection *sec ATTRIBUTE_UNUSED) |
1718 | 0 | { |
1719 | 0 | return NULL; |
1720 | 0 | } |
1721 | | |
1722 | | /* |
1723 | | FUNCTION |
1724 | | bfd_generic_discard_group |
1725 | | |
1726 | | SYNOPSIS |
1727 | | bool bfd_generic_discard_group (bfd *abfd, asection *group); |
1728 | | |
1729 | | DESCRIPTION |
1730 | | Remove all members of @var{group} from the output. |
1731 | | */ |
1732 | | |
1733 | | bool |
1734 | | bfd_generic_discard_group (bfd *abfd ATTRIBUTE_UNUSED, |
1735 | | asection *group ATTRIBUTE_UNUSED) |
1736 | 0 | { |
1737 | 0 | return true; |
1738 | 0 | } |
1739 | | |
1740 | | bool |
1741 | | _bfd_nowrite_set_section_contents (bfd *abfd, |
1742 | | sec_ptr section ATTRIBUTE_UNUSED, |
1743 | | const void *location ATTRIBUTE_UNUSED, |
1744 | | file_ptr offset ATTRIBUTE_UNUSED, |
1745 | | bfd_size_type count ATTRIBUTE_UNUSED) |
1746 | 0 | { |
1747 | 0 | return _bfd_bool_bfd_false_error (abfd); |
1748 | 0 | } |
1749 | | |
1750 | | /* |
1751 | | FUNCTION |
1752 | | bfd_section_size_insane |
1753 | | |
1754 | | SYNOPSIS |
1755 | | bool bfd_section_size_insane (bfd *abfd, asection *sec); |
1756 | | |
1757 | | DESCRIPTION |
1758 | | Returns true if the given section has a size that indicates |
1759 | | it cannot be read from file. Return false if the size is OK |
1760 | | *or* this function can't say one way or the other. |
1761 | | |
1762 | | */ |
1763 | | |
1764 | | bool |
1765 | | bfd_section_size_insane (bfd *abfd, asection *sec) |
1766 | 2.69M | { |
1767 | 2.69M | bfd_size_type size = bfd_get_section_limit_octets (abfd, sec); |
1768 | 2.69M | if (size == 0) |
1769 | 1.14k | return false; |
1770 | | |
1771 | 2.69M | if ((bfd_section_flags (sec) & SEC_IN_MEMORY) != 0 |
1772 | | /* PR 24753: Linker created sections can be larger than |
1773 | | the file size, eg if they are being used to hold stubs. */ |
1774 | 2.69M | || (bfd_section_flags (sec) & SEC_LINKER_CREATED) != 0 |
1775 | | /* PR 24753: Sections which have no content should also be |
1776 | | excluded as they contain no size on disk. */ |
1777 | 2.69M | || (bfd_section_flags (sec) & SEC_HAS_CONTENTS) == 0 |
1778 | | /* The MMO file format supports its own special compression |
1779 | | technique, but it uses COMPRESS_SECTION_NONE when loading |
1780 | | a section's contents. */ |
1781 | 2.69M | || bfd_get_flavour (abfd) == bfd_target_mmo_flavour) |
1782 | 702 | return false; |
1783 | | |
1784 | 2.69M | ufile_ptr filesize = bfd_get_file_size (abfd); |
1785 | 2.69M | if (filesize == 0) |
1786 | 0 | return false; |
1787 | | |
1788 | 2.69M | if (sec->compress_status == DECOMPRESS_SECTION_ZSTD |
1789 | 2.69M | || sec->compress_status == DECOMPRESS_SECTION_ZLIB) |
1790 | 179 | { |
1791 | | /* PR26946, PR28834: Sanity check compress header uncompressed |
1792 | | size against the original file size, and check that the |
1793 | | compressed section can be read from file. We choose an |
1794 | | arbitrary uncompressed size of 10x the file size, rather than |
1795 | | a compress ratio. The reason being that compiling |
1796 | | "int aaa..a;" with "a" repeated enough times can result in |
1797 | | compression ratios without limit for .debug_str, whereas such |
1798 | | a file will usually also have the enormous symbol |
1799 | | uncompressed in .symtab. */ |
1800 | 179 | if (size / 10 > filesize) |
1801 | 7 | { |
1802 | 7 | bfd_set_error (bfd_error_bad_value); |
1803 | 7 | return true; |
1804 | 7 | } |
1805 | 172 | size = sec->compressed_size; |
1806 | 172 | } |
1807 | | |
1808 | 2.69M | if ((ufile_ptr) sec->filepos > filesize || size > filesize - sec->filepos) |
1809 | 2.13M | { |
1810 | 2.13M | bfd_set_error (bfd_error_file_truncated); |
1811 | 2.13M | return true; |
1812 | 2.13M | } |
1813 | 557k | return false; |
1814 | 2.69M | } |