4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright (c) 1988 AT&T
26 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
30 * Module sections. Initialize special sections
33 #define ELF_TARGET_AMD64
44 remove_local(Ofl_desc
*ofl
, Sym_desc
*sdp
, int allow_ldynsym
)
46 Sym
*sym
= sdp
->sd_sym
;
47 uchar_t type
= ELF_ST_TYPE(sym
->st_info
);
48 /* LINTED - only used for assert() */
51 if ((ofl
->ofl_flags
& FLG_OF_REDLSYM
) == 0) {
54 err
= st_delstring(ofl
->ofl_strtab
, sdp
->sd_name
);
57 if (allow_ldynsym
&& ldynsym_symtype
[type
]) {
58 ofl
->ofl_dynlocscnt
--;
60 err
= st_delstring(ofl
->ofl_dynstrtab
, sdp
->sd_name
);
62 /* Remove from sort section? */
63 DYNSORT_COUNT(sdp
, sym
, type
, --);
66 sdp
->sd_flags
|= FLG_SY_ISDISC
;
70 remove_scoped(Ofl_desc
*ofl
, Sym_desc
*sdp
, int allow_ldynsym
)
72 Sym
*sym
= sdp
->sd_sym
;
73 uchar_t type
= ELF_ST_TYPE(sym
->st_info
);
74 /* LINTED - only used for assert() */
80 err
= st_delstring(ofl
->ofl_strtab
, sdp
->sd_name
);
83 if (allow_ldynsym
&& ldynsym_symtype
[type
]) {
84 ofl
->ofl_dynscopecnt
--;
86 err
= st_delstring(ofl
->ofl_dynstrtab
, sdp
->sd_name
);
88 /* Remove from sort section? */
89 DYNSORT_COUNT(sdp
, sym
, type
, --);
91 sdp
->sd_flags
|= FLG_SY_ELIM
;
95 ignore_sym(Ofl_desc
*ofl
, Ifl_desc
*ifl
, Sym_desc
*sdp
, int allow_ldynsym
)
98 Is_desc
*isp
= sdp
->sd_isc
;
99 uchar_t bind
= ELF_ST_BIND(sdp
->sd_sym
->st_info
);
101 if (bind
== STB_LOCAL
) {
102 uchar_t type
= ELF_ST_TYPE(sdp
->sd_sym
->st_info
);
105 * Skip section symbols, these were never collected in the
108 if (type
== STT_SECTION
)
112 * Determine if the whole file is being removed. Remove any
113 * file symbol, and any symbol that is not associated with a
114 * section, provided the symbol has not been identified as
117 if (((ifl
->ifl_flags
& FLG_IF_FILEREF
) == 0) &&
118 ((type
== STT_FILE
) || ((isp
== NULL
) &&
119 ((sdp
->sd_flags
& FLG_SY_UPREQD
) == 0)))) {
120 DBG_CALL(Dbg_syms_discarded(ofl
->ofl_lml
, sdp
));
121 if (ifl
->ifl_flags
& FLG_IF_IGNORE
)
122 remove_local(ofl
, sdp
, allow_ldynsym
);
128 * Global symbols can only be eliminated when the interfaces of
129 * an object have been defined via versioning/scoping.
131 if (!SYM_IS_HIDDEN(sdp
))
135 * Remove any unreferenced symbols that are not associated with
138 if ((isp
== NULL
) && ((sdp
->sd_flags
& FLG_SY_UPREQD
) == 0)) {
139 DBG_CALL(Dbg_syms_discarded(ofl
->ofl_lml
, sdp
));
140 if (ifl
->ifl_flags
& FLG_IF_IGNORE
)
141 remove_scoped(ofl
, sdp
, allow_ldynsym
);
147 * Do not discard any symbols that are associated with non-allocable
150 if (isp
&& ((isp
->is_flags
& FLG_IS_SECTREF
) == 0) &&
151 ((osp
= isp
->is_osdesc
) != 0) &&
152 (osp
->os_sgdesc
->sg_phdr
.p_type
== PT_LOAD
)) {
153 DBG_CALL(Dbg_syms_discarded(ofl
->ofl_lml
, sdp
));
154 if (ifl
->ifl_flags
& FLG_IF_IGNORE
) {
155 if (bind
== STB_LOCAL
)
156 remove_local(ofl
, sdp
, allow_ldynsym
);
158 remove_scoped(ofl
, sdp
, allow_ldynsym
);
164 isdesc_discarded(Is_desc
*isp
)
166 Ifl_desc
*ifl
= isp
->is_file
;
167 Os_desc
*osp
= isp
->is_osdesc
;
168 Word ptype
= osp
->os_sgdesc
->sg_phdr
.p_type
;
170 if (isp
->is_flags
& FLG_IS_DISCARD
)
174 * If the file is discarded, it will take
175 * the section with it.
178 (((ifl
->ifl_flags
& FLG_IF_FILEREF
) == 0) ||
179 ((ptype
== PT_LOAD
) &&
180 ((isp
->is_flags
& FLG_IS_SECTREF
) == 0) &&
181 (isp
->is_shdr
->sh_size
> 0))) &&
182 (ifl
->ifl_flags
& FLG_IF_IGNORE
))
189 * There are situations where we may count output sections (ofl_shdrcnt)
190 * that are subsequently eliminated from the output object. Whether or
191 * not this happens cannot be known until all input has been seen and
192 * section elimination code has run. However, the situations where this
193 * outcome is possible are known, and are flagged by setting FLG_OF_ADJOSCNT.
195 * If FLG_OF_ADJOSCNT is set, this routine makes a pass over the output
196 * sections. If an unused output section is encountered, we decrement
197 * ofl->ofl_shdrcnt and remove the section name from the .shstrtab string
198 * table (ofl->ofl_shdrsttab).
200 * This code must be kept in sync with the similar code
201 * found in outfile.c:ld_create_outfile().
204 adjust_os_count(Ofl_desc
*ofl
)
211 if ((ofl
->ofl_flags
& FLG_OF_ADJOSCNT
) == 0)
215 * For each output section, look at the input sections to find at least
216 * one input section that has not been eliminated. If none are found,
217 * the -z ignore processing above has eliminated that output section.
219 for (APLIST_TRAVERSE(ofl
->ofl_segs
, idx1
, sgp
)) {
222 for (APLIST_TRAVERSE(sgp
->sg_osdescs
, idx2
, osp
)) {
224 int keep
= 0, os_isdescs_idx
;
226 OS_ISDESCS_TRAVERSE(os_isdescs_idx
, osp
, idx3
, isp
) {
228 * We have found a kept input section,
229 * so the output section will be created.
231 if (!isdesc_discarded(isp
)) {
237 * If no section of this name was kept, decrement
238 * the count and remove the name from .shstrtab.
241 /* LINTED - only used for assert() */
245 err
= st_delstring(ofl
->ofl_shdrsttab
,
254 * If -zignore has been in effect, scan all input files to determine if the
255 * file, or sections from the file, have been referenced. If not, the file or
256 * some of the files sections can be discarded. If sections are to be
257 * discarded, rescan the output relocations and the symbol table and remove
258 * the relocations and symbol entries that are no longer required.
260 * Note: It's possible that a section which is being discarded has contributed
261 * to the GOT table or the PLT table. However, we can't at this point
262 * eliminate the corresponding entries. This is because there could well
263 * be other sections referencing those same entries, but we don't have
264 * the infrastructure to determine this. So, keep the PLT and GOT
265 * entries in the table in case someone wants them.
266 * Note: The section to be affected needs to be allocatable.
267 * So even if -zignore is in effect, if the section is not allocatable,
268 * we do not eliminate it.
271 ignore_section_processing(Ofl_desc
*ofl
)
279 int allow_ldynsym
= OFL_ALLOW_LDYNSYM(ofl
);
282 for (APLIST_TRAVERSE(ofl
->ofl_objs
, idx1
, ifl
)) {
286 * Diagnose (-D unused) a completely unreferenced file.
288 if ((ifl
->ifl_flags
& FLG_IF_FILEREF
) == 0)
289 DBG_CALL(Dbg_unused_file(ofl
->ofl_lml
,
290 ifl
->ifl_name
, 0, 0));
291 if (((ofl
->ofl_flags1
& FLG_OF1_IGNPRC
) == 0) ||
292 ((ifl
->ifl_flags
& FLG_IF_IGNORE
) == 0))
296 * Before scanning the whole symbol table to determine if
297 * symbols should be discard - quickly (relatively) scan the
298 * sections to determine if any are to be discarded.
301 if (ifl
->ifl_flags
& FLG_IF_FILEREF
) {
302 for (num
= 1; num
< ifl
->ifl_shnum
; num
++) {
303 if (((isp
= ifl
->ifl_isdesc
[num
]) != NULL
) &&
304 ((isp
->is_flags
& FLG_IS_SECTREF
) == 0) &&
305 ((osp
= isp
->is_osdesc
) != NULL
) &&
306 ((sgp
= osp
->os_sgdesc
) != NULL
) &&
307 (sgp
->sg_phdr
.p_type
== PT_LOAD
)) {
315 * No sections are to be 'ignored'
317 if ((discard
== 0) && (ifl
->ifl_flags
& FLG_IF_FILEREF
))
321 * We know that we have discarded sections. Scan the symbol
322 * table for this file to determine if symbols need to be
323 * discarded that are associated with the 'ignored' sections.
325 for (num
= 1; num
< ifl
->ifl_symscnt
; num
++) {
329 * If the symbol definition has been resolved to another
330 * file, or the symbol has already been discarded or
331 * eliminated, skip it.
333 sdp
= ifl
->ifl_oldndx
[num
];
334 if ((sdp
->sd_file
!= ifl
) ||
336 (FLG_SY_ISDISC
| FLG_SY_INVALID
| FLG_SY_ELIM
)))
340 * Complete the investigation of the symbol.
342 ignore_sym(ofl
, ifl
, sdp
, allow_ldynsym
);
347 * If we were only here to solicit debugging diagnostics, we're done.
349 if ((ofl
->ofl_flags1
& FLG_OF1_IGNPRC
) == 0)
353 * Scan all output relocations searching for those against discarded or
354 * ignored sections. If one is found, decrement the total outrel count.
356 REL_CACHE_TRAVERSE(&ofl
->ofl_outrels
, idx1
, rcbp
, rsp
) {
357 Is_desc
*isc
= rsp
->rel_isdesc
;
358 uint_t flags
, entsize
;
361 if ((isc
== NULL
) || ((isc
->is_flags
& (FLG_IS_SECTREF
))) ||
362 ((ifl
= isc
->is_file
) == NULL
) ||
363 ((ifl
->ifl_flags
& FLG_IF_IGNORE
) == 0) ||
364 ((shdr
= isc
->is_shdr
) == NULL
) ||
365 ((shdr
->sh_flags
& SHF_ALLOC
) == 0))
368 flags
= rsp
->rel_flags
;
370 if (flags
& (FLG_REL_GOT
| FLG_REL_BSS
|
371 FLG_REL_NOINFO
| FLG_REL_PLT
))
374 osp
= RELAUX_GET_OSDESC(rsp
);
376 if (rsp
->rel_flags
& FLG_REL_RELA
)
377 entsize
= sizeof (Rela
);
379 entsize
= sizeof (Rel
);
381 assert(osp
->os_szoutrels
> 0);
382 osp
->os_szoutrels
-= entsize
;
384 if (!(flags
& FLG_REL_PLT
))
385 ofl
->ofl_reloccntsub
++;
387 if (rsp
->rel_rtype
== ld_targ
.t_m
.m_r_relative
)
388 ofl
->ofl_relocrelcnt
--;
392 * As a result of our work here, the number of output sections may
393 * have decreased. Trigger a call to adjust_os_count().
395 ofl
->ofl_flags
|= FLG_OF_ADJOSCNT
;
401 * Allocate Elf_Data, Shdr, and Is_desc structures for a new
405 * ofl - Output file descriptor
406 * shtype - SHT_ type code for section.
407 * shname - String giving the name for the new section.
408 * entcnt - # of items contained in the data part of the new section.
409 * This value is multiplied against the known element size
410 * for the section type to determine the size of the data
411 * area for the section. It is only meaningful in cases where
412 * the section type has a non-zero element size. In other cases,
413 * the caller must set the size fields in the *ret_data and
414 * *ret_shdr structs manually.
415 * ret_isec, ret_shdr, ret_data - Address of pointers to
416 * receive address of newly allocated structs.
419 * On error, returns S_ERROR. On success, returns (1), and the
420 * ret_ pointers have been updated to point at the new structures,
421 * which have been filled in. To finish the task, the caller must
422 * update any fields within the supplied descriptors that differ
423 * from its needs, and then call ld_place_section().
426 new_section(Ofl_desc
*ofl
, Word shtype
, const char *shname
, Xword entcnt
,
427 Is_desc
**ret_isec
, Shdr
**ret_shdr
, Elf_Data
**ret_data
)
429 typedef struct sec_info
{
431 Word align
; /* Used in both data and section header */
436 const SEC_INFO_T
*sec_info
;
444 * For each type of section, we have a distinct set of
445 * SEC_INFO_T values. This macro defines a static structure
446 * containing those values and generates code to set the sec_info
447 * pointer to refer to it. The pointer in sec_info remains valid
448 * outside of the declaration scope because the info_s struct is static.
450 * We can't determine the value of M_WORD_ALIGN at compile time, so
451 * a different variant is used for those cases.
453 #define SET_SEC_INFO(d_type, d_align, sh_flags, sh_entsize) \
455 static const SEC_INFO_T info_s = { d_type, d_align, sh_flags, \
457 sec_info = &info_s; \
459 #define SET_SEC_INFO_WORD_ALIGN(d_type, sh_flags, sh_entsize) \
461 static SEC_INFO_T info_s = { d_type, 0, sh_flags, \
463 info_s.align = ld_targ.t_m.m_word_align; \
464 sec_info = &info_s; \
470 * SHT_PROGBITS sections contain are used for many
471 * different sections. Alignments and flags differ.
472 * Some have a standard entsize, and others don't.
473 * We set some defaults here, but there is no expectation
474 * that they are correct or complete for any specific
475 * purpose. The caller must provide the correct values.
477 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE
, SHF_ALLOC
, 0)
481 SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM
, 0, sizeof (Sym
))
485 SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM
, SHF_ALLOC
, sizeof (Sym
))
488 case SHT_SUNW_LDYNSYM
:
489 ofl
->ofl_flags
|= FLG_OF_OSABI
;
490 SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM
, SHF_ALLOC
, sizeof (Sym
))
495 * A string table may or may not be allocable, depending
496 * on context, so we leave that flag unset and leave it to
497 * the caller to add it if necessary.
499 * String tables do not have a standard entsize, so
502 SET_SEC_INFO(ELF_T_BYTE
, 1, SHF_STRINGS
, 0)
507 * Relocations with an addend (Everything except 32-bit X86).
508 * The caller is expected to set all section header flags.
510 SET_SEC_INFO_WORD_ALIGN(ELF_T_RELA
, 0, sizeof (Rela
))
515 * Relocations without an addend (32-bit X86 only).
516 * The caller is expected to set all section header flags.
518 SET_SEC_INFO_WORD_ALIGN(ELF_T_REL
, 0, sizeof (Rel
))
522 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD
, SHF_ALLOC
, sizeof (Word
))
525 case SHT_SUNW_symsort
:
526 case SHT_SUNW_tlssort
:
527 ofl
->ofl_flags
|= FLG_OF_OSABI
;
528 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD
, SHF_ALLOC
, sizeof (Word
))
533 * A dynamic section may or may not be allocable, and may or
534 * may not be writable, depending on context, so we leave the
535 * flags unset and leave it to the caller to add them if
538 SET_SEC_INFO_WORD_ALIGN(ELF_T_DYN
, 0, sizeof (Dyn
))
543 * SHT_NOBITS is used for BSS-type sections. The size and
544 * alignment depend on the specific use and must be adjusted
547 SET_SEC_INFO(ELF_T_BYTE
, 0, SHF_ALLOC
| SHF_WRITE
, 0)
552 case SHT_PREINIT_ARRAY
:
553 SET_SEC_INFO(ELF_T_ADDR
, sizeof (Addr
), SHF_ALLOC
| SHF_WRITE
,
557 case SHT_SYMTAB_SHNDX
:
559 * Note that these sections are created to be associated
560 * with both symtab and dynsym symbol tables. However, they
561 * are non-allocable in all cases, because the runtime
562 * linker has no need for this information. It is purely
563 * informational, used by elfdump(1), debuggers, etc.
565 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD
, 0, sizeof (Word
));
569 ofl
->ofl_flags
|= FLG_OF_OSABI
;
570 SET_SEC_INFO_WORD_ALIGN(ELF_T_CAP
, SHF_ALLOC
, sizeof (Cap
));
573 case SHT_SUNW_capchain
:
574 ofl
->ofl_flags
|= FLG_OF_OSABI
;
575 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD
, SHF_ALLOC
,
579 case SHT_SUNW_capinfo
:
580 ofl
->ofl_flags
|= FLG_OF_OSABI
;
582 SET_SEC_INFO(ELF_T_XWORD
, sizeof (Xword
), SHF_ALLOC
,
585 SET_SEC_INFO(ELF_T_WORD
, sizeof (Word
), SHF_ALLOC
,
591 ofl
->ofl_flags
|= FLG_OF_OSABI
;
592 SET_SEC_INFO(ELF_T_BYTE
, sizeof (Lword
),
593 SHF_ALLOC
| SHF_WRITE
, sizeof (Move
));
596 case SHT_SUNW_syminfo
:
597 ofl
->ofl_flags
|= FLG_OF_OSABI
;
599 * The sh_info field of the SHT_*_syminfo section points
600 * to the header index of the associated .dynamic section,
601 * so we also set SHF_INFO_LINK.
603 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE
,
604 SHF_ALLOC
| SHF_INFO_LINK
, sizeof (Syminfo
));
607 case SHT_SUNW_verneed
:
608 case SHT_SUNW_verdef
:
609 ofl
->ofl_flags
|= FLG_OF_OSABI
;
611 * The info for verneed and versym happen to be the same.
612 * The entries in these sections are not of uniform size,
613 * so we set the entsize to 0.
615 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE
, SHF_ALLOC
, 0);
618 case SHT_SUNW_versym
:
619 ofl
->ofl_flags
|= FLG_OF_OSABI
;
620 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE
, SHF_ALLOC
,
625 /* Should not happen: fcn called with unknown section type */
630 #undef SET_SEC_INFO_WORD_ALIGN
632 size
= entcnt
* sec_info
->sh_entsize
;
635 * Allocate and initialize the Elf_Data structure.
637 if ((data
= libld_calloc(sizeof (Elf_Data
), 1)) == NULL
)
639 data
->d_type
= sec_info
->d_type
;
641 data
->d_align
= sec_info
->align
;
642 data
->d_version
= ofl
->ofl_dehdr
->e_version
;
645 * Allocate and initialize the Shdr structure.
647 if ((shdr
= libld_calloc(sizeof (Shdr
), 1)) == NULL
)
649 shdr
->sh_type
= shtype
;
650 shdr
->sh_size
= size
;
651 shdr
->sh_flags
= sec_info
->sh_flags
;
652 shdr
->sh_addralign
= sec_info
->align
;
653 shdr
->sh_entsize
= sec_info
->sh_entsize
;
656 * Allocate and initialize the Is_desc structure.
658 if ((isec
= libld_calloc(1, sizeof (Is_desc
))) == NULL
)
660 isec
->is_name
= shname
;
661 isec
->is_shdr
= shdr
;
662 isec
->is_indata
= data
;
672 * Use an existing input section as a template to create a new
673 * input section with the same values as the original, other than
674 * the size of the data area which is supplied by the caller.
677 * ofl - Output file descriptor
678 * ifl - Input file section to use as a template
679 * size - Size of data area for new section
680 * ret_isec, ret_shdr, ret_data - Address of pointers to
681 * receive address of newly allocated structs.
684 * On error, returns S_ERROR. On success, returns (1), and the
685 * ret_ pointers have been updated to point at the new structures,
686 * which have been filled in. To finish the task, the caller must
687 * update any fields within the supplied descriptors that differ
688 * from its needs, and then call ld_place_section().
691 new_section_from_template(Ofl_desc
*ofl
, Is_desc
*tmpl_isp
, size_t size
,
692 Is_desc
**ret_isec
, Shdr
**ret_shdr
, Elf_Data
**ret_data
)
699 * Allocate and initialize the Elf_Data structure.
701 if ((data
= libld_calloc(sizeof (Elf_Data
), 1)) == NULL
)
703 data
->d_type
= tmpl_isp
->is_indata
->d_type
;
705 data
->d_align
= tmpl_isp
->is_shdr
->sh_addralign
;
706 data
->d_version
= ofl
->ofl_dehdr
->e_version
;
709 * Allocate and initialize the Shdr structure.
711 if ((shdr
= libld_malloc(sizeof (Shdr
))) == NULL
)
713 *shdr
= *tmpl_isp
->is_shdr
;
716 shdr
->sh_size
= size
;
719 * Allocate and initialize the Is_desc structure.
721 if ((isec
= libld_calloc(1, sizeof (Is_desc
))) == NULL
)
723 isec
->is_name
= tmpl_isp
->is_name
;
724 isec
->is_shdr
= shdr
;
725 isec
->is_indata
= data
;
735 * Build a .bss section for allocation of tentative definitions. Any `static'
736 * .bss definitions would have been associated to their own .bss sections and
737 * thus collected from the input files. `global' .bss definitions are tagged
738 * as COMMON and do not cause any associated .bss section elements to be
739 * generated. Here we add up all these COMMON symbols and generate the .bss
740 * section required to represent them.
743 ld_make_bss(Ofl_desc
*ofl
, Xword size
, Xword align
, uint_t ident
)
749 Xword rsize
= (Xword
)ofl
->ofl_relocbsssz
;
752 * Allocate header structs. We will set the name ourselves below,
753 * and there is no entcnt for a BSS. So, the shname and entcnt
756 if (new_section(ofl
, SHT_NOBITS
, NULL
, 0,
757 &isec
, &shdr
, &data
) == S_ERROR
)
760 data
->d_size
= (size_t)size
;
761 data
->d_align
= (size_t)align
;
763 shdr
->sh_size
= size
;
764 shdr
->sh_addralign
= align
;
766 if (ident
== ld_targ
.t_id
.id_tlsbss
) {
767 isec
->is_name
= MSG_ORIG(MSG_SCN_TBSS
);
768 ofl
->ofl_istlsbss
= isec
;
769 shdr
->sh_flags
|= SHF_TLS
;
771 } else if (ident
== ld_targ
.t_id
.id_bss
) {
772 isec
->is_name
= MSG_ORIG(MSG_SCN_BSS
);
773 ofl
->ofl_isbss
= isec
;
776 } else if ((ld_targ
.t_m
.m_mach
== EM_AMD64
) &&
777 (ident
== ld_targ
.t_id
.id_lbss
)) {
778 isec
->is_name
= MSG_ORIG(MSG_SCN_LBSS
);
779 ofl
->ofl_islbss
= isec
;
780 shdr
->sh_flags
|= SHF_AMD64_LARGE
;
785 * Retain this .*bss input section as this will be where global symbol
786 * references are added.
788 if ((osp
= ld_place_section(ofl
, isec
, NULL
, ident
, NULL
)) ==
793 * If relocations exist against a .*bss section, a section symbol must
794 * be created for the section in the .dynsym symbol table.
796 if (!(osp
->os_flags
& FLG_OS_OUTREL
)) {
797 ofl_flag_t flagtotest
;
799 if (ident
== ld_targ
.t_id
.id_tlsbss
)
800 flagtotest
= FLG_OF1_TLSOREL
;
802 flagtotest
= FLG_OF1_BSSOREL
;
804 if (ofl
->ofl_flags1
& flagtotest
) {
805 ofl
->ofl_dynshdrcnt
++;
806 osp
->os_flags
|= FLG_OS_OUTREL
;
810 osp
->os_szoutrels
= rsize
;
815 * Build a SHT_{INIT|FINI|PREINIT}ARRAY section (specified via
816 * ld -z *array=name).
819 make_array(Ofl_desc
*ofl
, Word shtype
, const char *sectname
, APlist
*alp
)
836 for (APLIST_TRAVERSE(alp
, idx
, sdp
))
839 if (new_section(ofl
, shtype
, sectname
, entcount
, &isec
, &shdr
, &data
) ==
843 if ((data
->d_buf
= libld_calloc(sizeof (Addr
), entcount
)) == NULL
)
846 if (ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_array
, NULL
) ==
850 osp
= isec
->is_osdesc
;
852 if ((ofl
->ofl_osinitarray
== NULL
) && (shtype
== SHT_INIT_ARRAY
))
853 ofl
->ofl_osinitarray
= osp
;
854 if ((ofl
->ofl_ospreinitarray
== NULL
) && (shtype
== SHT_PREINIT_ARRAY
))
855 ofl
->ofl_ospreinitarray
= osp
;
856 else if ((ofl
->ofl_osfiniarray
== NULL
) && (shtype
== SHT_FINI_ARRAY
))
857 ofl
->ofl_osfiniarray
= osp
;
860 * Create relocations against this section to initialize it to the
861 * function addresses.
863 reld
.rel_isdesc
= isec
;
865 reld
.rel_flags
= FLG_REL_LOAD
;
868 * Fabricate the relocation information (as if a relocation record had
869 * been input - see init_rel()).
871 reld
.rel_rtype
= ld_targ
.t_m
.m_r_arrayaddr
;
872 reld
.rel_roffset
= 0;
873 reld
.rel_raddend
= 0;
876 * Create a minimal relocation record to satisfy process_sym_reloc()
877 * debugging requirements.
880 reloc
.r_info
= ELF_R_INFO(0, ld_targ
.t_m
.m_r_arrayaddr
);
883 DBG_CALL(Dbg_reloc_generate(ofl
->ofl_lml
, osp
,
884 ld_targ
.t_m
.m_rel_sht_type
));
885 for (APLIST_TRAVERSE(alp
, idx
, sdp
)) {
888 if (ld_process_sym_reloc(ofl
, &reld
, (Rel
*)&reloc
, isec
,
889 MSG_INTL(MSG_STR_COMMAND
), 0) == S_ERROR
) {
894 reld
.rel_roffset
+= (Xword
)sizeof (Addr
);
895 reloc
.r_offset
= reld
.rel_roffset
;
902 * Build a comment section (-Qy option).
905 make_comment(Ofl_desc
*ofl
)
911 if (new_section(ofl
, SHT_PROGBITS
, MSG_ORIG(MSG_SCN_COMMENT
), 0,
912 &isec
, &shdr
, &data
) == S_ERROR
)
915 data
->d_buf
= (void *)ofl
->ofl_sgsid
;
916 data
->d_size
= strlen(ofl
->ofl_sgsid
) + 1;
919 shdr
->sh_size
= (Xword
)data
->d_size
;
921 shdr
->sh_addralign
= 1;
923 return ((uintptr_t)ld_place_section(ofl
, isec
, NULL
,
924 ld_targ
.t_id
.id_note
, NULL
));
928 * Make the dynamic section. Calculate the size of any strings referenced
929 * within this structure, they will be added to the global string table
930 * (.dynstr). This routine should be called before make_dynstr().
932 * This routine must be maintained in parallel with update_odynamic()
936 make_dynamic(Ofl_desc
*ofl
)
948 ofl_flag_t flags
= ofl
->ofl_flags
;
949 int not_relobj
= !(flags
& FLG_OF_RELOBJ
);
953 * Select the required string table.
955 if (OFL_IS_STATIC_OBJ(ofl
))
956 strtbl
= ofl
->ofl_strtab
;
958 strtbl
= ofl
->ofl_dynstrtab
;
961 * Only a limited subset of DT_ entries apply to relocatable
962 * objects. See the comment at the head of update_odynamic() in
963 * update.c for details.
965 if (new_section(ofl
, SHT_DYNAMIC
, MSG_ORIG(MSG_SCN_DYNAMIC
), 0,
966 &isec
, &shdr
, &data
) == S_ERROR
)
970 * new_section() does not set SHF_ALLOC. If we're building anything
971 * besides a relocatable object, then the .dynamic section should
972 * reside in allocatable memory.
975 shdr
->sh_flags
|= SHF_ALLOC
;
978 * new_section() does not set SHF_WRITE. If we're building an object
979 * that specifies an interpretor, then a DT_DEBUG entry is created,
980 * which is initialized to the applications link-map list at runtime.
982 if (ofl
->ofl_osinterp
)
983 shdr
->sh_flags
|= SHF_WRITE
;
985 osp
= ofl
->ofl_osdynamic
=
986 ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_dynamic
, NULL
);
989 * Reserve entries for any needed dependencies.
991 for (APLIST_TRAVERSE(ofl
->ofl_sos
, idx
, ifl
)) {
992 if (!(ifl
->ifl_flags
& (FLG_IF_NEEDED
| FLG_IF_NEEDSTR
)))
996 * If this dependency didn't satisfy any symbol references,
997 * generate a debugging diagnostic (ld(1) -Dunused can be used
998 * to display these). If this is a standard needed dependency,
999 * and -z ignore is in effect, drop the dependency. Explicitly
1000 * defined dependencies (i.e., -N dep) don't get dropped, and
1001 * are flagged as being required to simplify update_odynamic()
1004 if ((ifl
->ifl_flags
& FLG_IF_NEEDSTR
) ||
1005 ((ifl
->ifl_flags
& FLG_IF_DEPREQD
) == 0)) {
1007 DBG_CALL(Dbg_util_nl(ofl
->ofl_lml
, DBG_NL_STD
));
1008 DBG_CALL(Dbg_unused_file(ofl
->ofl_lml
, ifl
->ifl_soname
,
1009 (ifl
->ifl_flags
& FLG_IF_NEEDSTR
), 0));
1012 * Guidance: Remove unused dependency.
1014 * If -z ignore is in effect, this warning is not
1015 * needed because we will quietly remove the unused
1018 if (OFL_GUIDANCE(ofl
, FLG_OFG_NO_UNUSED
) &&
1019 ((ifl
->ifl_flags
& FLG_IF_IGNORE
) == 0))
1020 ld_eprintf(ofl
, ERR_GUIDANCE
,
1021 MSG_INTL(MSG_GUIDE_UNUSED
),
1024 if (ifl
->ifl_flags
& FLG_IF_NEEDSTR
)
1025 ifl
->ifl_flags
|= FLG_IF_DEPREQD
;
1026 else if (ifl
->ifl_flags
& FLG_IF_IGNORE
)
1031 * If this object requires a DT_POSFLAG_1 entry, reserve it.
1033 if ((ifl
->ifl_flags
& MSK_IF_POSFLAG1
) && not_relobj
)
1036 if (st_insert(strtbl
, ifl
->ifl_soname
) == -1)
1041 * If the needed entry contains the $ORIGIN token make sure
1042 * the associated DT_1_FLAGS entry is created.
1044 if (strstr(ifl
->ifl_soname
, MSG_ORIG(MSG_STR_ORIGIN
))) {
1045 ofl
->ofl_dtflags_1
|= DF_1_ORIGIN
;
1046 ofl
->ofl_dtflags
|= DF_ORIGIN
;
1051 DBG_CALL(Dbg_util_nl(ofl
->ofl_lml
, DBG_NL_STD
));
1055 * Reserve entries for any per-symbol auxiliary/filter strings.
1057 cnt
+= alist_nitems(ofl
->ofl_dtsfltrs
);
1060 * Reserve entries for _init() and _fini() section addresses.
1062 if (((sdp
= ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U
),
1063 SYM_NOHASH
, NULL
, ofl
)) != NULL
) &&
1064 (sdp
->sd_ref
== REF_REL_NEED
) &&
1065 (sdp
->sd_sym
->st_shndx
!= SHN_UNDEF
)) {
1066 sdp
->sd_flags
|= FLG_SY_UPREQD
;
1069 if (((sdp
= ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U
),
1070 SYM_NOHASH
, NULL
, ofl
)) != NULL
) &&
1071 (sdp
->sd_ref
== REF_REL_NEED
) &&
1072 (sdp
->sd_sym
->st_shndx
!= SHN_UNDEF
)) {
1073 sdp
->sd_flags
|= FLG_SY_UPREQD
;
1078 * Reserve entries for any soname, filter name (shared libs
1079 * only), run-path pointers, cache names and audit requirements.
1081 if (ofl
->ofl_soname
) {
1083 if (st_insert(strtbl
, ofl
->ofl_soname
) == -1)
1086 if (ofl
->ofl_filtees
) {
1088 if (st_insert(strtbl
, ofl
->ofl_filtees
) == -1)
1092 * If the filtees entry contains the $ORIGIN token
1093 * make sure the associated DT_1_FLAGS entry is created.
1095 if (strstr(ofl
->ofl_filtees
,
1096 MSG_ORIG(MSG_STR_ORIGIN
))) {
1097 ofl
->ofl_dtflags_1
|= DF_1_ORIGIN
;
1098 ofl
->ofl_dtflags
|= DF_ORIGIN
;
1103 if (ofl
->ofl_rpath
) {
1104 cnt
+= 2; /* DT_RPATH & DT_RUNPATH */
1105 if (st_insert(strtbl
, ofl
->ofl_rpath
) == -1)
1109 * If the rpath entry contains the $ORIGIN token make sure
1110 * the associated DT_1_FLAGS entry is created.
1112 if (strstr(ofl
->ofl_rpath
, MSG_ORIG(MSG_STR_ORIGIN
))) {
1113 ofl
->ofl_dtflags_1
|= DF_1_ORIGIN
;
1114 ofl
->ofl_dtflags
|= DF_ORIGIN
;
1122 if (ofl
->ofl_config
) {
1124 if (st_insert(strtbl
, ofl
->ofl_config
) == -1)
1128 * If the config entry contains the $ORIGIN token
1129 * make sure the associated DT_1_FLAGS entry is created.
1131 if (strstr(ofl
->ofl_config
, MSG_ORIG(MSG_STR_ORIGIN
))) {
1132 ofl
->ofl_dtflags_1
|= DF_1_ORIGIN
;
1133 ofl
->ofl_dtflags
|= DF_ORIGIN
;
1136 if (ofl
->ofl_depaudit
) {
1138 if (st_insert(strtbl
, ofl
->ofl_depaudit
) == -1)
1141 if (ofl
->ofl_audit
) {
1143 if (st_insert(strtbl
, ofl
->ofl_audit
) == -1)
1148 * Reserve entries for the DT_HASH, DT_STRTAB, DT_STRSZ,
1149 * DT_SYMTAB, DT_SYMENT, and DT_CHECKSUM.
1154 * If we are including local functions at the head of
1155 * the dynsym, then also reserve entries for DT_SUNW_SYMTAB
1156 * and DT_SUNW_SYMSZ.
1158 if (OFL_ALLOW_LDYNSYM(ofl
))
1161 if ((ofl
->ofl_dynsymsortcnt
> 0) ||
1162 (ofl
->ofl_dyntlssortcnt
> 0))
1163 cnt
++; /* DT_SUNW_SORTENT */
1165 if (ofl
->ofl_dynsymsortcnt
> 0)
1166 cnt
+= 2; /* DT_SUNW_[SYMSORT|SYMSORTSZ] */
1168 if (ofl
->ofl_dyntlssortcnt
> 0)
1169 cnt
+= 2; /* DT_SUNW_[TLSSORT|TLSSORTSZ] */
1171 if ((flags
& (FLG_OF_VERDEF
| FLG_OF_NOVERSEC
)) ==
1173 cnt
+= 2; /* DT_VERDEF & DT_VERDEFNUM */
1175 if ((flags
& (FLG_OF_VERNEED
| FLG_OF_NOVERSEC
)) ==
1177 cnt
+= 2; /* DT_VERNEED & DT_VERNEEDNUM */
1179 if ((flags
& FLG_OF_COMREL
) && ofl
->ofl_relocrelcnt
)
1180 cnt
++; /* DT_RELACOUNT */
1182 if (flags
& FLG_OF_TEXTREL
) /* DT_TEXTREL */
1185 if (ofl
->ofl_osfiniarray
) /* DT_FINI_ARRAY */
1186 cnt
+= 2; /* DT_FINI_ARRAYSZ */
1188 if (ofl
->ofl_osinitarray
) /* DT_INIT_ARRAY */
1189 cnt
+= 2; /* DT_INIT_ARRAYSZ */
1191 if (ofl
->ofl_ospreinitarray
) /* DT_PREINIT_ARRAY & */
1192 cnt
+= 2; /* DT_PREINIT_ARRAYSZ */
1195 * If we have plt's reserve a DT_PLTRELSZ, DT_PLTREL and
1198 if (ofl
->ofl_pltcnt
)
1202 * If plt padding is needed (Sparcv9).
1204 if (ofl
->ofl_pltpad
)
1205 cnt
+= 2; /* DT_PLTPAD & DT_PLTPADSZ */
1208 * If we have any relocations reserve a DT_REL, DT_RELSZ and
1211 if (ofl
->ofl_relocsz
)
1215 * If a syminfo section is required create DT_SYMINFO,
1216 * DT_SYMINSZ, and DT_SYMINENT entries.
1218 if (flags
& FLG_OF_SYMINFO
)
1222 * If there are any partially initialized sections allocate
1223 * DT_MOVETAB, DT_MOVESZ and DT_MOVEENT.
1225 if (ofl
->ofl_osmove
)
1229 * Allocate one DT_REGISTER entry for every register symbol.
1231 cnt
+= ofl
->ofl_regsymcnt
;
1234 * Reserve a entry for each '-zrtldinfo=...' specified
1235 * on the command line.
1237 for (APLIST_TRAVERSE(ofl
->ofl_rtldinfo
, idx
, sdp
))
1241 * The following entry should only be placed in a segment that
1244 if (((sgp
= osp
->os_sgdesc
) != NULL
) &&
1245 (sgp
->sg_phdr
.p_flags
& PF_W
) && ofl
->ofl_osinterp
)
1246 cnt
++; /* DT_DEBUG */
1249 * Capabilities require a .dynamic entry for the .SUNW_cap
1253 cnt
++; /* DT_SUNW_CAP */
1256 * Symbol capabilities require a .dynamic entry for the
1257 * .SUNW_capinfo section.
1259 if (ofl
->ofl_oscapinfo
)
1260 cnt
++; /* DT_SUNW_CAPINFO */
1263 * Capabilities chain information requires a .SUNW_capchain
1264 * entry (DT_SUNW_CAPCHAIN), entry size (DT_SUNW_CAPCHAINENT),
1265 * and total size (DT_SUNW_CAPCHAINSZ).
1267 if (ofl
->ofl_oscapchain
)
1270 if (flags
& FLG_OF_SYMBOLIC
)
1271 cnt
++; /* DT_SYMBOLIC */
1273 if (ofl
->ofl_aslr
!= 0) /* DT_SUNW_ASLR */
1278 * Account for Architecture dependent .dynamic entries, and defaults.
1280 (*ld_targ
.t_mr
.mr_mach_make_dynamic
)(ofl
, &cnt
);
1283 * DT_FLAGS, DT_FLAGS_1, DT_SUNW_STRPAD, and DT_NULL. Also,
1284 * allow room for the unused extra DT_NULLs. These are included
1285 * to allow an ELF editor room to add items later.
1287 cnt
+= 4 + DYNAMIC_EXTRA_ELTS
;
1290 * DT_SUNW_LDMACH. Used to hold the ELF machine code of the
1291 * linker that produced the output object. This information
1292 * allows us to determine whether a given object was linked
1293 * natively, or by a linker running on a different type of
1294 * system. This information can be valuable if one suspects
1295 * that a problem might be due to alignment or byte order issues.
1300 * Determine the size of the section from the number of entries.
1302 size
= cnt
* (size_t)shdr
->sh_entsize
;
1304 shdr
->sh_size
= (Xword
)size
;
1305 data
->d_size
= size
;
1308 * There are several tags that are specific to the Solaris osabi
1309 * range which we unconditionally put into any dynamic section
1310 * we create (e.g. DT_SUNW_STRPAD or DT_SUNW_LDMACH). As such,
1311 * any Solaris object with a dynamic section should be tagged as
1314 ofl
->ofl_flags
|= FLG_OF_OSABI
;
1316 return ((uintptr_t)ofl
->ofl_osdynamic
);
1320 * Build the GOT section and its associated relocation entries.
1323 ld_make_got(Ofl_desc
*ofl
)
1328 size_t size
= (size_t)ofl
->ofl_gotcnt
* ld_targ
.t_m
.m_got_entsize
;
1329 size_t rsize
= (size_t)ofl
->ofl_relocgotsz
;
1331 if (new_section(ofl
, SHT_PROGBITS
, MSG_ORIG(MSG_SCN_GOT
), 0,
1332 &isec
, &shdr
, &data
) == S_ERROR
)
1335 data
->d_size
= size
;
1337 shdr
->sh_flags
|= SHF_WRITE
;
1338 shdr
->sh_size
= (Xword
)size
;
1339 shdr
->sh_entsize
= ld_targ
.t_m
.m_got_entsize
;
1341 ofl
->ofl_osgot
= ld_place_section(ofl
, isec
, NULL
,
1342 ld_targ
.t_id
.id_got
, NULL
);
1343 if (ofl
->ofl_osgot
== (Os_desc
*)S_ERROR
)
1346 ofl
->ofl_osgot
->os_szoutrels
= (Xword
)rsize
;
1352 * Build an interpreter section.
1355 make_interp(Ofl_desc
*ofl
)
1360 const char *iname
= ofl
->ofl_interp
;
1364 * If -z nointerp is in effect, don't create an interpreter section.
1366 if (ofl
->ofl_flags1
& FLG_OF1_NOINTRP
)
1370 * An .interp section is always created for a dynamic executable.
1371 * A user can define the interpreter to use. This definition overrides
1372 * the default that would be recorded in an executable, and triggers
1373 * the creation of an .interp section in any other object. Presumably
1374 * the user knows what they are doing. Refer to the generic ELF ABI
1375 * section 5-4, and the ld(1) -I option.
1377 if ((ofl
->ofl_flags
& FLG_OF_RELOBJ
) == 1 ||
1378 (ofl
->ofl_flags
& FLG_OF_DYNAMIC
) != 1)
1380 if (((ofl
->ofl_flags
& (FLG_OF_EXEC
|FLG_OF_PIE
)) == 0) &&
1385 * In the case of a dynamic executable, supply a default interpreter
1386 * if the user has not specified their own.
1389 iname
= ofl
->ofl_interp
= ld_targ
.t_m
.m_def_interp
;
1391 size
= strlen(iname
) + 1;
1393 if (new_section(ofl
, SHT_PROGBITS
, MSG_ORIG(MSG_SCN_INTERP
), 0,
1394 &isec
, &shdr
, &data
) == S_ERROR
)
1397 data
->d_size
= size
;
1398 shdr
->sh_size
= (Xword
)size
;
1399 data
->d_align
= shdr
->sh_addralign
= 1;
1402 ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_interp
, NULL
);
1403 return ((uintptr_t)ofl
->ofl_osinterp
);
1407 * Common function used to build the SHT_SUNW_versym section, SHT_SUNW_syminfo
1408 * section, and SHT_SUNW_capinfo section. Each of these sections provide
1409 * additional symbol information, and their size parallels the associated
1413 make_sym_sec(Ofl_desc
*ofl
, const char *sectname
, Word stype
, int ident
)
1420 * We don't know the size of this section yet, so set it to 0. The
1421 * size gets filled in after the associated symbol table is sized.
1423 if (new_section(ofl
, stype
, sectname
, 0, &isec
, &shdr
, &data
) ==
1425 return ((Os_desc
*)S_ERROR
);
1427 return (ld_place_section(ofl
, isec
, NULL
, ident
, NULL
));
1431 * Determine whether a symbol capability is redundant because the object
1432 * capabilities are more restrictive.
1435 is_cap_redundant(Objcapset
*ocapset
, Objcapset
*scapset
)
1438 elfcap_mask_t omsk
, smsk
;
1441 * Inspect any platform capabilities. If the object defines platform
1442 * capabilities, then the object will only be loaded for those
1443 * platforms. A symbol capability set that doesn't define the same
1444 * platforms is redundant, and a symbol capability that does not provide
1445 * at least one platform name that matches a platform name in the object
1446 * capabilities will never execute (as the object wouldn't have been
1449 oalp
= ocapset
->oc_plat
.cl_val
;
1450 salp
= scapset
->oc_plat
.cl_val
;
1451 if (oalp
&& ((salp
== NULL
) || cap_names_match(oalp
, salp
)))
1455 * If the symbol capability set defines platforms, and the object
1456 * doesn't, then the symbol set is more restrictive.
1458 if (salp
&& (oalp
== NULL
))
1462 * Next, inspect any machine name capabilities. If the object defines
1463 * machine name capabilities, then the object will only be loaded for
1464 * those machines. A symbol capability set that doesn't define the same
1465 * machine names is redundant, and a symbol capability that does not
1466 * provide at least one machine name that matches a machine name in the
1467 * object capabilities will never execute (as the object wouldn't have
1470 oalp
= ocapset
->oc_plat
.cl_val
;
1471 salp
= scapset
->oc_plat
.cl_val
;
1472 if (oalp
&& ((salp
== NULL
) || cap_names_match(oalp
, salp
)))
1476 * If the symbol capability set defines machine names, and the object
1477 * doesn't, then the symbol set is more restrictive.
1479 if (salp
&& (oalp
== NULL
))
1483 * Next, inspect any hardware capabilities. If the objects hardware
1484 * capabilities are greater than or equal to that of the symbols
1485 * capabilities, then the symbol capability set is redundant. If the
1486 * symbols hardware capabilities are greater that the objects, then the
1487 * symbol set is more restrictive.
1489 * Note that this is a somewhat arbitrary definition, as each capability
1490 * bit is independent of the others, and some of the higher order bits
1491 * could be considered to be less important than lower ones. However,
1492 * this is the only reasonable non-subjective definition.
1494 omsk
= ocapset
->oc_hw_2
.cm_val
;
1495 smsk
= scapset
->oc_hw_2
.cm_val
;
1496 if ((omsk
> smsk
) || (omsk
&& (omsk
== smsk
)))
1502 * Finally, inspect the remaining hardware capabilities.
1504 omsk
= ocapset
->oc_hw_1
.cm_val
;
1505 smsk
= scapset
->oc_hw_1
.cm_val
;
1506 if ((omsk
> smsk
) || (omsk
&& (omsk
== smsk
)))
1513 * Capabilities values might have been assigned excluded values. These
1514 * excluded values should be removed before calculating any capabilities
1518 capmask_value(Lm_list
*lml
, Word type
, Capmask
*capmask
, int *title
)
1521 * First determine whether any bits should be excluded.
1523 if ((capmask
->cm_val
& capmask
->cm_exc
) == 0)
1526 DBG_CALL(Dbg_cap_post_title(lml
, title
));
1528 DBG_CALL(Dbg_cap_val_entry(lml
, DBG_STATE_CURRENT
, type
,
1529 capmask
->cm_val
, ld_targ
.t_m
.m_mach
));
1530 DBG_CALL(Dbg_cap_val_entry(lml
, DBG_STATE_EXCLUDE
, type
,
1531 capmask
->cm_exc
, ld_targ
.t_m
.m_mach
));
1533 capmask
->cm_val
&= ~capmask
->cm_exc
;
1535 DBG_CALL(Dbg_cap_val_entry(lml
, DBG_STATE_RESOLVED
, type
,
1536 capmask
->cm_val
, ld_targ
.t_m
.m_mach
));
1540 capstr_value(Lm_list
*lml
, Word type
, Caplist
*caplist
, int *title
)
1545 Boolean found
= FALSE
;
1548 * First determine whether any strings should be excluded.
1550 for (APLIST_TRAVERSE(caplist
->cl_exc
, idx1
, estr
)) {
1551 for (ALIST_TRAVERSE(caplist
->cl_val
, idx2
, capstr
)) {
1552 if (strcmp(estr
, capstr
->cs_str
) == 0) {
1563 * Traverse the current strings, then delete the excluded strings,
1564 * and finally display the resolved strings.
1567 Dbg_cap_post_title(lml
, title
);
1568 for (ALIST_TRAVERSE(caplist
->cl_val
, idx2
, capstr
)) {
1569 Dbg_cap_ptr_entry(lml
, DBG_STATE_CURRENT
, type
,
1573 for (APLIST_TRAVERSE(caplist
->cl_exc
, idx1
, estr
)) {
1574 for (ALIST_TRAVERSE(caplist
->cl_val
, idx2
, capstr
)) {
1575 if (strcmp(estr
, capstr
->cs_str
) == 0) {
1576 DBG_CALL(Dbg_cap_ptr_entry(lml
,
1577 DBG_STATE_EXCLUDE
, type
, capstr
->cs_str
));
1578 alist_delete(caplist
->cl_val
, &idx2
);
1584 for (ALIST_TRAVERSE(caplist
->cl_val
, idx2
, capstr
)) {
1585 Dbg_cap_ptr_entry(lml
, DBG_STATE_RESOLVED
, type
,
1592 * Build a capabilities section.
1594 #define CAP_UPDATE(cap, capndx, tag, val) \
1596 cap->c_un.c_val = val; \
1600 make_cap(Ofl_desc
*ofl
, Word shtype
, const char *shname
, int ident
)
1609 Objcapset
*ocapset
= &ofl
->ofl_ocapset
;
1615 * Determine which string table to use for any CA_SUNW_MACH,
1616 * CA_SUNW_PLAT, or CA_SUNW_ID strings.
1618 if (OFL_IS_STATIC_OBJ(ofl
))
1619 strtbl
= ofl
->ofl_strtab
;
1621 strtbl
= ofl
->ofl_dynstrtab
;
1624 * If symbol capabilities have been requested, but none have been
1625 * created, warn the user. This scenario can occur if none of the
1626 * input relocatable objects defined any object capabilities.
1628 if ((ofl
->ofl_flags
& FLG_OF_OTOSCAP
) && (ofl
->ofl_capsymcnt
== 0))
1629 ld_eprintf(ofl
, ERR_WARNING
, MSG_INTL(MSG_CAP_NOSYMSFOUND
));
1632 * If symbol capabilities have been collected, but no symbols are left
1633 * referencing these capabilities, promote the capability groups back
1634 * to an object capability definition.
1636 if ((ofl
->ofl_flags
& FLG_OF_OTOSCAP
) && ofl
->ofl_capsymcnt
&&
1637 (ofl
->ofl_capfamilies
== NULL
)) {
1638 ld_eprintf(ofl
, ERR_WARNING
, MSG_INTL(MSG_CAP_NOSYMSFOUND
));
1639 ld_cap_move_symtoobj(ofl
);
1640 ofl
->ofl_capsymcnt
= 0;
1641 ofl
->ofl_capgroups
= NULL
;
1642 ofl
->ofl_flags
&= ~FLG_OF_OTOSCAP
;
1646 * Remove any excluded capabilities.
1648 capstr_value(ofl
->ofl_lml
, CA_SUNW_PLAT
, &ocapset
->oc_plat
, &title
);
1649 capstr_value(ofl
->ofl_lml
, CA_SUNW_MACH
, &ocapset
->oc_mach
, &title
);
1650 capmask_value(ofl
->ofl_lml
, CA_SUNW_HW_2
, &ocapset
->oc_hw_2
, &title
);
1651 capmask_value(ofl
->ofl_lml
, CA_SUNW_HW_1
, &ocapset
->oc_hw_1
, &title
);
1652 capmask_value(ofl
->ofl_lml
, CA_SUNW_SF_1
, &ocapset
->oc_sf_1
, &title
);
1655 * Determine how many entries are required for any object capabilities.
1657 size
+= alist_nitems(ocapset
->oc_plat
.cl_val
);
1658 size
+= alist_nitems(ocapset
->oc_mach
.cl_val
);
1659 if (ocapset
->oc_hw_2
.cm_val
)
1661 if (ocapset
->oc_hw_1
.cm_val
)
1663 if (ocapset
->oc_sf_1
.cm_val
)
1667 * Only identify a capabilities group if the group has content. If a
1668 * capabilities identifier exists, and no other capabilities have been
1669 * supplied, remove the identifier. This scenario could exist if a
1670 * user mistakenly defined a lone identifier, or if an identified group
1671 * was overridden so as to clear the existing capabilities and the
1672 * identifier was not also cleared.
1674 if (ocapset
->oc_id
.cs_str
) {
1678 ocapset
->oc_id
.cs_str
= NULL
;
1681 size
++; /* Add CA_SUNW_NULL */
1684 * Determine how many entries are required for any symbol capabilities.
1686 if (ofl
->ofl_capsymcnt
) {
1688 * If there are no object capabilities, a CA_SUNW_NULL entry
1689 * is required before any symbol capabilities.
1693 size
+= ofl
->ofl_capsymcnt
;
1697 return ((uintptr_t)NULL
);
1699 if (new_section(ofl
, shtype
, shname
, size
, &isec
,
1700 &shdr
, &data
) == S_ERROR
)
1703 if ((data
->d_buf
= libld_malloc(shdr
->sh_size
)) == NULL
)
1706 cap
= (Cap
*)data
->d_buf
;
1709 * Fill in any object capabilities. If there is an identifier, then the
1710 * identifier comes first. The remaining items follow in precedence
1711 * order, although the order isn't important for runtime verification.
1713 if (ocapset
->oc_id
.cs_str
) {
1714 ofl
->ofl_flags
|= FLG_OF_CAPSTRS
;
1715 if (st_insert(strtbl
, ocapset
->oc_id
.cs_str
) == -1)
1717 ocapset
->oc_id
.cs_ndx
= capndx
;
1718 CAP_UPDATE(cap
, capndx
, CA_SUNW_ID
, 0);
1720 if (ocapset
->oc_plat
.cl_val
) {
1721 ofl
->ofl_flags
|= (FLG_OF_PTCAP
| FLG_OF_CAPSTRS
);
1724 * Insert any platform name strings in the appropriate string
1725 * table. The capability value can't be filled in yet, as the
1726 * final offset of the strings isn't known until later.
1728 for (ALIST_TRAVERSE(ocapset
->oc_plat
.cl_val
, idx1
, capstr
)) {
1729 if (st_insert(strtbl
, capstr
->cs_str
) == -1)
1731 capstr
->cs_ndx
= capndx
;
1732 CAP_UPDATE(cap
, capndx
, CA_SUNW_PLAT
, 0);
1735 if (ocapset
->oc_mach
.cl_val
) {
1736 ofl
->ofl_flags
|= (FLG_OF_PTCAP
| FLG_OF_CAPSTRS
);
1739 * Insert the machine name strings in the appropriate string
1740 * table. The capability value can't be filled in yet, as the
1741 * final offset of the strings isn't known until later.
1743 for (ALIST_TRAVERSE(ocapset
->oc_mach
.cl_val
, idx1
, capstr
)) {
1744 if (st_insert(strtbl
, capstr
->cs_str
) == -1)
1746 capstr
->cs_ndx
= capndx
;
1747 CAP_UPDATE(cap
, capndx
, CA_SUNW_MACH
, 0);
1750 if (ocapset
->oc_hw_2
.cm_val
) {
1751 ofl
->ofl_flags
|= FLG_OF_PTCAP
;
1752 CAP_UPDATE(cap
, capndx
, CA_SUNW_HW_2
, ocapset
->oc_hw_2
.cm_val
);
1754 if (ocapset
->oc_hw_1
.cm_val
) {
1755 ofl
->ofl_flags
|= FLG_OF_PTCAP
;
1756 CAP_UPDATE(cap
, capndx
, CA_SUNW_HW_1
, ocapset
->oc_hw_1
.cm_val
);
1758 if (ocapset
->oc_sf_1
.cm_val
) {
1759 ofl
->ofl_flags
|= FLG_OF_PTCAP
;
1760 CAP_UPDATE(cap
, capndx
, CA_SUNW_SF_1
, ocapset
->oc_sf_1
.cm_val
);
1762 CAP_UPDATE(cap
, capndx
, CA_SUNW_NULL
, 0);
1765 * Fill in any symbol capabilities.
1767 if (ofl
->ofl_capgroups
) {
1770 for (APLIST_TRAVERSE(ofl
->ofl_capgroups
, idx1
, cgp
)) {
1771 Objcapset
*scapset
= &cgp
->cg_set
;
1775 cgp
->cg_ndx
= capndx
;
1777 if (scapset
->oc_id
.cs_str
) {
1778 ofl
->ofl_flags
|= FLG_OF_CAPSTRS
;
1780 * Insert the identifier string in the
1781 * appropriate string table. The capability
1782 * value can't be filled in yet, as the final
1783 * offset of the string isn't known until later.
1785 if (st_insert(strtbl
,
1786 scapset
->oc_id
.cs_str
) == -1)
1788 scapset
->oc_id
.cs_ndx
= capndx
;
1789 CAP_UPDATE(cap
, capndx
, CA_SUNW_ID
, 0);
1792 if (scapset
->oc_plat
.cl_val
) {
1793 ofl
->ofl_flags
|= FLG_OF_CAPSTRS
;
1796 * Insert the platform name string in the
1797 * appropriate string table. The capability
1798 * value can't be filled in yet, as the final
1799 * offset of the string isn't known until later.
1801 for (ALIST_TRAVERSE(scapset
->oc_plat
.cl_val
,
1803 if (st_insert(strtbl
,
1804 capstr
->cs_str
) == -1)
1806 capstr
->cs_ndx
= capndx
;
1807 CAP_UPDATE(cap
, capndx
,
1811 if (scapset
->oc_mach
.cl_val
) {
1812 ofl
->ofl_flags
|= FLG_OF_CAPSTRS
;
1815 * Insert the machine name string in the
1816 * appropriate string table. The capability
1817 * value can't be filled in yet, as the final
1818 * offset of the string isn't known until later.
1820 for (ALIST_TRAVERSE(scapset
->oc_mach
.cl_val
,
1822 if (st_insert(strtbl
,
1823 capstr
->cs_str
) == -1)
1825 capstr
->cs_ndx
= capndx
;
1826 CAP_UPDATE(cap
, capndx
,
1830 if (scapset
->oc_hw_2
.cm_val
) {
1831 CAP_UPDATE(cap
, capndx
, CA_SUNW_HW_2
,
1832 scapset
->oc_hw_2
.cm_val
);
1834 if (scapset
->oc_hw_1
.cm_val
) {
1835 CAP_UPDATE(cap
, capndx
, CA_SUNW_HW_1
,
1836 scapset
->oc_hw_1
.cm_val
);
1838 if (scapset
->oc_sf_1
.cm_val
) {
1839 CAP_UPDATE(cap
, capndx
, CA_SUNW_SF_1
,
1840 scapset
->oc_sf_1
.cm_val
);
1842 CAP_UPDATE(cap
, capndx
, CA_SUNW_NULL
, 0);
1845 * If any object capabilities are available, determine
1846 * whether these symbol capabilities are less
1847 * restrictive, and hence redundant.
1849 if (((ofl
->ofl_flags
& FLG_OF_PTCAP
) == 0) ||
1850 (is_cap_redundant(ocapset
, scapset
) == 0))
1854 * Indicate any files that provide redundant symbol
1857 for (APLIST_TRAVERSE(cgp
->cg_secs
, idx2
, isp
)) {
1858 ld_eprintf(ofl
, ERR_WARNING
,
1859 MSG_INTL(MSG_CAP_REDUNDANT
),
1860 isp
->is_file
->ifl_name
,
1861 EC_WORD(isp
->is_scnndx
), isp
->is_name
);
1867 * If capabilities strings are required, the sh_info field of the
1868 * section header will be set to the associated string table.
1870 if (ofl
->ofl_flags
& FLG_OF_CAPSTRS
)
1871 shdr
->sh_flags
|= SHF_INFO_LINK
;
1874 * Place these capabilities in the output file.
1876 if ((ofl
->ofl_oscap
= ld_place_section(ofl
, isec
,
1877 NULL
, ident
, NULL
)) == (Os_desc
*)S_ERROR
)
1881 * If symbol capabilities are required, then a .SUNW_capinfo section is
1882 * also created. This table will eventually be sized to match the
1883 * associated symbol table.
1885 if (ofl
->ofl_capfamilies
) {
1886 if ((ofl
->ofl_oscapinfo
= make_sym_sec(ofl
,
1887 MSG_ORIG(MSG_SCN_SUNWCAPINFO
), SHT_SUNW_capinfo
,
1888 ld_targ
.t_id
.id_capinfo
)) == (Os_desc
*)S_ERROR
)
1892 * If we're generating a dynamic object, capabilities family
1893 * members are maintained in a .SUNW_capchain section.
1895 if (ofl
->ofl_capchaincnt
&&
1896 ((ofl
->ofl_flags
& FLG_OF_RELOBJ
) == 0)) {
1897 if (new_section(ofl
, SHT_SUNW_capchain
,
1898 MSG_ORIG(MSG_SCN_SUNWCAPCHAIN
),
1899 ofl
->ofl_capchaincnt
, &isec
, &shdr
,
1903 ofl
->ofl_oscapchain
= ld_place_section(ofl
, isec
,
1904 NULL
, ld_targ
.t_id
.id_capchain
, NULL
);
1905 if (ofl
->ofl_oscapchain
== (Os_desc
*)S_ERROR
)
1915 * Build the PLT section and its associated relocation entries.
1918 make_plt(Ofl_desc
*ofl
)
1923 size_t size
= ld_targ
.t_m
.m_plt_reservsz
+
1924 (((size_t)ofl
->ofl_pltcnt
+ (size_t)ofl
->ofl_pltpad
) *
1925 ld_targ
.t_m
.m_plt_entsize
);
1926 size_t rsize
= (size_t)ofl
->ofl_relocpltsz
;
1929 * On sparc, account for the NOP at the end of the plt.
1931 if (ld_targ
.t_m
.m_mach
== LD_TARG_BYCLASS(EM_SPARC
, EM_SPARCV9
))
1932 size
+= sizeof (Word
);
1934 if (new_section(ofl
, SHT_PROGBITS
, MSG_ORIG(MSG_SCN_PLT
), 0,
1935 &isec
, &shdr
, &data
) == S_ERROR
)
1938 data
->d_size
= size
;
1939 data
->d_align
= ld_targ
.t_m
.m_plt_align
;
1941 shdr
->sh_flags
= ld_targ
.t_m
.m_plt_shf_flags
;
1942 shdr
->sh_size
= (Xword
)size
;
1943 shdr
->sh_addralign
= ld_targ
.t_m
.m_plt_align
;
1944 shdr
->sh_entsize
= ld_targ
.t_m
.m_plt_entsize
;
1946 ofl
->ofl_osplt
= ld_place_section(ofl
, isec
, NULL
,
1947 ld_targ
.t_id
.id_plt
, NULL
);
1948 if (ofl
->ofl_osplt
== (Os_desc
*)S_ERROR
)
1951 ofl
->ofl_osplt
->os_szoutrels
= (Xword
)rsize
;
1957 * Make the hash table. Only built for dynamic executables and shared
1958 * libraries, and provides hashed lookup into the global symbol table
1959 * (.dynsym) for the run-time linker to resolve symbol lookups.
1962 make_hash(Ofl_desc
*ofl
)
1968 Word nsyms
= ofl
->ofl_globcnt
;
1972 * Allocate section header structures. We set entcnt to 0
1973 * because it's going to change after we place this section.
1975 if (new_section(ofl
, SHT_HASH
, MSG_ORIG(MSG_SCN_HASH
), 0,
1976 &isec
, &shdr
, &data
) == S_ERROR
)
1980 * Place the section first since it will affect the local symbol
1984 ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_hash
, NULL
);
1985 if (ofl
->ofl_oshash
== (Os_desc
*)S_ERROR
)
1989 * Calculate the number of output hash buckets.
1991 ofl
->ofl_hashbkts
= findprime(nsyms
);
1994 * The size of the hash table is determined by
1996 * i. the initial nbucket and nchain entries (2)
1997 * ii. the number of buckets (calculated above)
1998 * iii. the number of chains (this is based on the number of
1999 * symbols in the .dynsym array).
2001 cnt
= 2 + ofl
->ofl_hashbkts
+ DYNSYM_ALL_CNT(ofl
);
2002 size
= cnt
* shdr
->sh_entsize
;
2005 * Finalize the section header and data buffer initialization.
2007 if ((data
->d_buf
= libld_calloc(size
, 1)) == NULL
)
2009 data
->d_size
= size
;
2010 shdr
->sh_size
= (Xword
)size
;
2016 * Generate the standard symbol table. Contains all locals and globals,
2017 * and resides in a non-allocatable section (ie. it can be stripped).
2020 make_symtab(Ofl_desc
*ofl
)
2030 * Create the section headers. Note that we supply an ent_cnt
2031 * of 0. We won't know the count until the section has been placed.
2033 if (new_section(ofl
, SHT_SYMTAB
, MSG_ORIG(MSG_SCN_SYMTAB
), 0,
2034 &isec
, &shdr
, &data
) == S_ERROR
)
2038 * Place the section first since it will affect the local symbol
2041 if ((ofl
->ofl_ossymtab
= ld_place_section(ofl
, isec
, NULL
,
2042 ld_targ
.t_id
.id_symtab
, NULL
)) == (Os_desc
*)S_ERROR
)
2046 * At this point we've created all but the 'shstrtab' section.
2047 * Determine if we have to use 'Extended Sections'. If so - then
2048 * also create a SHT_SYMTAB_SHNDX section.
2050 if ((ofl
->ofl_shdrcnt
+ 1) >= SHN_LORESERVE
) {
2054 if (new_section(ofl
, SHT_SYMTAB_SHNDX
,
2055 MSG_ORIG(MSG_SCN_SYMTAB_SHNDX
), 0, &xisec
,
2056 &xshdr
, &xdata
) == S_ERROR
)
2059 if ((ofl
->ofl_ossymshndx
= ld_place_section(ofl
, xisec
, NULL
,
2060 ld_targ
.t_id
.id_symtab_ndx
, NULL
)) == (Os_desc
*)S_ERROR
)
2065 * Calculated number of symbols, which need to be augmented by
2066 * the (yet to be created) .shstrtab entry.
2068 symcnt
= (size_t)(1 + SYMTAB_ALL_CNT(ofl
));
2069 size
= symcnt
* shdr
->sh_entsize
;
2072 * Finalize the section header and data buffer initialization.
2074 data
->d_size
= size
;
2075 shdr
->sh_size
= (Xword
)size
;
2078 * If we created a SHT_SYMTAB_SHNDX - then set it's sizes too.
2081 size_t xsize
= symcnt
* sizeof (Word
);
2083 xisec
->is_indata
->d_size
= xsize
;
2084 xisec
->is_shdr
->sh_size
= (Xword
)xsize
;
2091 * Build a dynamic symbol table. These tables reside in the text
2092 * segment of a dynamic executable or shared library.
2094 * .SUNW_ldynsym contains local function symbols
2095 * .dynsym contains only globals symbols
2097 * The two tables are created adjacent to each other, with .SUNW_ldynsym
2101 make_dynsym(Ofl_desc
*ofl
)
2104 Elf_Data
*data
, *ldata
;
2105 Is_desc
*isec
, *lisec
;
2111 * Unless explicitly disabled, always produce a .SUNW_ldynsym section
2112 * when it is allowed by the file type, even if the resulting
2113 * table only ends up with a single STT_FILE in it. There are
2114 * two reasons: (1) It causes the generation of the DT_SUNW_SYMTAB
2115 * entry in the .dynamic section, which is something we would
2116 * like to encourage, and (2) Without it, we cannot generate
2117 * the associated .SUNW_dyn[sym|tls]sort sections, which are of
2120 * In practice, it is extremely rare for an object not to have
2121 * local symbols for .SUNW_ldynsym, so 99% of the time, we'd be
2124 allow_ldynsym
= OFL_ALLOW_LDYNSYM(ofl
);
2127 * Create the section headers. Note that we supply an ent_cnt
2128 * of 0. We won't know the count until the section has been placed.
2130 if (allow_ldynsym
&& new_section(ofl
, SHT_SUNW_LDYNSYM
,
2131 MSG_ORIG(MSG_SCN_LDYNSYM
), 0, &lisec
, &lshdr
, &ldata
) == S_ERROR
)
2134 if (new_section(ofl
, SHT_DYNSYM
, MSG_ORIG(MSG_SCN_DYNSYM
), 0,
2135 &isec
, &shdr
, &data
) == S_ERROR
)
2139 * Place the section(s) first since it will affect the local symbol
2142 if (allow_ldynsym
&&
2143 ((ofl
->ofl_osldynsym
= ld_place_section(ofl
, lisec
, NULL
,
2144 ld_targ
.t_id
.id_ldynsym
, NULL
)) == (Os_desc
*)S_ERROR
))
2147 ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_dynsym
, NULL
);
2148 if (ofl
->ofl_osdynsym
== (Os_desc
*)S_ERROR
)
2151 cnt
= DYNSYM_ALL_CNT(ofl
);
2152 size
= (size_t)cnt
* shdr
->sh_entsize
;
2155 * Finalize the section header and data buffer initialization.
2157 data
->d_size
= size
;
2158 shdr
->sh_size
= (Xword
)size
;
2161 * An ldynsym contains local function symbols. It is not
2162 * used for linking, but if present, serves to allow better
2163 * stack traces to be generated in contexts where the symtab
2164 * is not available. (dladdr(), or stripped executable/library files).
2166 if (allow_ldynsym
) {
2167 cnt
= 1 + ofl
->ofl_dynlocscnt
+ ofl
->ofl_dynscopecnt
;
2168 size
= (size_t)cnt
* shdr
->sh_entsize
;
2170 ldata
->d_size
= size
;
2171 lshdr
->sh_size
= (Xword
)size
;
2178 * Build .SUNW_dynsymsort and/or .SUNW_dyntlssort sections. These are
2179 * index sections for the .SUNW_ldynsym/.dynsym pair that present data
2180 * and function symbols sorted by address.
2183 make_dynsort(Ofl_desc
*ofl
)
2189 /* Only do it if the .SUNW_ldynsym section is present */
2190 if (!OFL_ALLOW_LDYNSYM(ofl
))
2193 /* .SUNW_dynsymsort */
2194 if (ofl
->ofl_dynsymsortcnt
> 0) {
2195 if (new_section(ofl
, SHT_SUNW_symsort
,
2196 MSG_ORIG(MSG_SCN_DYNSYMSORT
), ofl
->ofl_dynsymsortcnt
,
2197 &isec
, &shdr
, &data
) == S_ERROR
)
2200 if ((ofl
->ofl_osdynsymsort
= ld_place_section(ofl
, isec
, NULL
,
2201 ld_targ
.t_id
.id_dynsort
, NULL
)) == (Os_desc
*)S_ERROR
)
2205 /* .SUNW_dyntlssort */
2206 if (ofl
->ofl_dyntlssortcnt
> 0) {
2207 if (new_section(ofl
, SHT_SUNW_tlssort
,
2208 MSG_ORIG(MSG_SCN_DYNTLSSORT
),
2209 ofl
->ofl_dyntlssortcnt
, &isec
, &shdr
, &data
) == S_ERROR
)
2212 if ((ofl
->ofl_osdyntlssort
= ld_place_section(ofl
, isec
, NULL
,
2213 ld_targ
.t_id
.id_dynsort
, NULL
)) == (Os_desc
*)S_ERROR
)
2221 * Helper routine for make_dynsym_shndx. Builds a
2222 * a SHT_SYMTAB_SHNDX for .dynsym or .SUNW_ldynsym, without knowing
2226 make_dyn_shndx(Ofl_desc
*ofl
, const char *shname
, Os_desc
*symtab
,
2231 Shdr
*shdr
, *dynshdr
;
2234 dynsymisp
= ld_os_first_isdesc(symtab
);
2235 dynshdr
= dynsymisp
->is_shdr
;
2237 if (new_section(ofl
, SHT_SYMTAB_SHNDX
, shname
,
2238 (dynshdr
->sh_size
/ dynshdr
->sh_entsize
),
2239 &isec
, &shdr
, &data
) == S_ERROR
)
2242 if ((*ret_os
= ld_place_section(ofl
, isec
, NULL
,
2243 ld_targ
.t_id
.id_dynsym_ndx
, NULL
)) == (Os_desc
*)S_ERROR
)
2252 * Build a SHT_SYMTAB_SHNDX for the .dynsym, and .SUNW_ldynsym
2255 make_dynsym_shndx(Ofl_desc
*ofl
)
2258 * If there is a .SUNW_ldynsym, generate a section for its extended
2259 * index section as well.
2261 if (OFL_ALLOW_LDYNSYM(ofl
)) {
2262 if (make_dyn_shndx(ofl
, MSG_ORIG(MSG_SCN_LDYNSYM_SHNDX
),
2263 ofl
->ofl_osldynsym
, &ofl
->ofl_osldynshndx
) == S_ERROR
)
2267 /* The Generate a section for the dynsym */
2268 if (make_dyn_shndx(ofl
, MSG_ORIG(MSG_SCN_DYNSYM_SHNDX
),
2269 ofl
->ofl_osdynsym
, &ofl
->ofl_osdynshndx
) == S_ERROR
)
2277 * Build a string table for the section headers.
2280 make_shstrtab(Ofl_desc
*ofl
)
2287 if (new_section(ofl
, SHT_STRTAB
, MSG_ORIG(MSG_SCN_SHSTRTAB
),
2288 0, &isec
, &shdr
, &data
) == S_ERROR
)
2292 * Place the section first, as it may effect the number of section
2293 * headers to account for.
2295 ofl
->ofl_osshstrtab
=
2296 ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_note
, NULL
);
2297 if (ofl
->ofl_osshstrtab
== (Os_desc
*)S_ERROR
)
2300 size
= st_getstrtab_sz(ofl
->ofl_shdrsttab
);
2303 data
->d_size
= size
;
2304 shdr
->sh_size
= (Xword
)size
;
2310 * Build a string section for the standard symbol table.
2313 make_strtab(Ofl_desc
*ofl
)
2321 * This string table consists of all the global and local symbols.
2322 * Account for null bytes at end of the file name and the beginning
2325 if (st_insert(ofl
->ofl_strtab
, ofl
->ofl_name
) == -1)
2328 size
= st_getstrtab_sz(ofl
->ofl_strtab
);
2331 if (new_section(ofl
, SHT_STRTAB
, MSG_ORIG(MSG_SCN_STRTAB
),
2332 0, &isec
, &shdr
, &data
) == S_ERROR
)
2335 /* Set the size of the data area */
2336 data
->d_size
= size
;
2337 shdr
->sh_size
= (Xword
)size
;
2340 ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_strtab
, NULL
);
2341 return ((uintptr_t)ofl
->ofl_osstrtab
);
2345 * Build a string table for the dynamic symbol table.
2348 make_dynstr(Ofl_desc
*ofl
)
2356 * If producing a .SUNW_ldynsym, account for the initial STT_FILE
2357 * symbol that precedes the scope reduced global symbols.
2359 if (OFL_ALLOW_LDYNSYM(ofl
)) {
2360 if (st_insert(ofl
->ofl_dynstrtab
, ofl
->ofl_name
) == -1)
2362 ofl
->ofl_dynscopecnt
++;
2366 * Account for any local, named register symbols. These locals are
2367 * required for reference from DT_REGISTER .dynamic entries.
2369 if (ofl
->ofl_regsyms
) {
2372 for (ndx
= 0; ndx
< ofl
->ofl_regsymsno
; ndx
++) {
2375 if ((sdp
= ofl
->ofl_regsyms
[ndx
]) == NULL
)
2378 if (!SYM_IS_HIDDEN(sdp
) &&
2379 (ELF_ST_BIND(sdp
->sd_sym
->st_info
) != STB_LOCAL
))
2382 if (sdp
->sd_sym
->st_name
== 0)
2385 if (st_insert(ofl
->ofl_dynstrtab
, sdp
->sd_name
) == -1)
2391 * Reserve entries for any per-symbol auxiliary/filter strings.
2393 if (ofl
->ofl_dtsfltrs
!= NULL
) {
2397 for (ALIST_TRAVERSE(ofl
->ofl_dtsfltrs
, idx
, dftp
))
2398 if (st_insert(ofl
->ofl_dynstrtab
, dftp
->dft_str
) == -1)
2402 size
= st_getstrtab_sz(ofl
->ofl_dynstrtab
);
2405 if (new_section(ofl
, SHT_STRTAB
, MSG_ORIG(MSG_SCN_DYNSTR
),
2406 0, &isec
, &shdr
, &data
) == S_ERROR
)
2409 /* Make it allocable if necessary */
2410 if (!(ofl
->ofl_flags
& FLG_OF_RELOBJ
))
2411 shdr
->sh_flags
|= SHF_ALLOC
;
2413 /* Set the size of the data area */
2414 data
->d_size
= size
+ DYNSTR_EXTRA_PAD
;
2416 shdr
->sh_size
= (Xword
)size
;
2419 ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_dynstr
, NULL
);
2420 return ((uintptr_t)ofl
->ofl_osdynstr
);
2424 * Generate an output relocation section which will contain the relocation
2425 * information to be applied to the `osp' section.
2427 * If (osp == NULL) then we are creating the coalesced relocation section
2428 * for an executable and/or a shared object.
2431 make_reloc(Ofl_desc
*ofl
, Os_desc
*osp
)
2441 const char *rel_prefix
;
2444 if (ld_targ
.t_m
.m_rel_sht_type
== SHT_REL
) {
2446 relsize
= sizeof (Rel
);
2447 rel_prefix
= MSG_ORIG(MSG_SCN_REL
);
2450 relsize
= sizeof (Rela
);
2451 rel_prefix
= MSG_ORIG(MSG_SCN_RELA
);
2455 size
= osp
->os_szoutrels
;
2456 sh_flags
= osp
->os_shdr
->sh_flags
;
2457 if ((sectname
= libld_malloc(strlen(rel_prefix
) +
2458 strlen(osp
->os_name
) + 1)) == 0)
2460 (void) strcpy(sectname
, rel_prefix
);
2461 (void) strcat(sectname
, osp
->os_name
);
2462 } else if (ofl
->ofl_flags
& FLG_OF_COMREL
) {
2463 size
= (ofl
->ofl_reloccnt
- ofl
->ofl_reloccntsub
) * relsize
;
2464 sh_flags
= SHF_ALLOC
;
2465 sectname
= (char *)MSG_ORIG(MSG_SCN_SUNWRELOC
);
2467 size
= ofl
->ofl_relocrelsz
;
2468 sh_flags
= SHF_ALLOC
;
2469 sectname
= (char *)rel_prefix
;
2473 * Keep track of total size of 'output relocations' (to be stored
2477 ofl
->ofl_relocsz
+= (Xword
)size
;
2479 if (new_section(ofl
, ld_targ
.t_m
.m_rel_sht_type
, sectname
, 0, &isec
,
2480 &shdr
, &data
) == S_ERROR
)
2483 data
->d_size
= size
;
2485 shdr
->sh_size
= (Xword
)size
;
2486 if (OFL_ALLOW_DYNSYM(ofl
) && (sh_flags
& SHF_ALLOC
))
2487 shdr
->sh_flags
= SHF_ALLOC
;
2491 * The sh_info field of the SHT_REL* sections points to the
2492 * section the relocations are to be applied to.
2494 shdr
->sh_flags
|= SHF_INFO_LINK
;
2497 rosp
= ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_rel
, NULL
);
2498 if (rosp
== (Os_desc
*)S_ERROR
)
2502 * Associate this relocation section to the section its going to
2510 * This is used primarily so that we can update
2511 * SHT_GROUP[sect_no] entries to point to the
2512 * created output relocation sections.
2514 for (APLIST_TRAVERSE(osp
->os_relisdescs
, idx
, risp
)) {
2515 risp
->is_osdesc
= rosp
;
2518 * If the input relocation section had the SHF_GROUP
2519 * flag set - propagate it to the output relocation
2522 if (risp
->is_shdr
->sh_flags
& SHF_GROUP
) {
2523 rosp
->os_shdr
->sh_flags
|= SHF_GROUP
;
2527 osp
->os_relosdesc
= rosp
;
2529 ofl
->ofl_osrel
= rosp
;
2532 * If this is the first relocation section we've encountered save it
2533 * so that the .dynamic entry can be initialized accordingly.
2535 if (ofl
->ofl_osrelhead
== (Os_desc
*)0)
2536 ofl
->ofl_osrelhead
= rosp
;
2542 * Generate version needed section.
2545 make_verneed(Ofl_desc
*ofl
)
2552 * verneed sections do not have a constant element size, so the
2553 * value of ent_cnt specified here (0) is meaningless.
2555 if (new_section(ofl
, SHT_SUNW_verneed
, MSG_ORIG(MSG_SCN_SUNWVERSION
),
2556 0, &isec
, &shdr
, &data
) == S_ERROR
)
2559 /* During version processing we calculated the total size. */
2560 data
->d_size
= ofl
->ofl_verneedsz
;
2561 shdr
->sh_size
= (Xword
)ofl
->ofl_verneedsz
;
2563 ofl
->ofl_osverneed
=
2564 ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_version
, NULL
);
2565 return ((uintptr_t)ofl
->ofl_osverneed
);
2569 * Generate a version definition section.
2571 * o the SHT_SUNW_verdef section defines the versions that exist within this
2575 make_verdef(Ofl_desc
*ofl
)
2584 * Reserve a string table entry for the base version dependency (other
2585 * dependencies have symbol representations, which will already be
2586 * accounted for during symbol processing).
2588 vdp
= (Ver_desc
*)ofl
->ofl_verdesc
->apl_data
[0];
2590 if (OFL_IS_STATIC_OBJ(ofl
))
2591 strtab
= ofl
->ofl_strtab
;
2593 strtab
= ofl
->ofl_dynstrtab
;
2595 if (st_insert(strtab
, vdp
->vd_name
) == -1)
2599 * verdef sections do not have a constant element size, so the
2600 * value of ent_cnt specified here (0) is meaningless.
2602 if (new_section(ofl
, SHT_SUNW_verdef
, MSG_ORIG(MSG_SCN_SUNWVERSION
),
2603 0, &isec
, &shdr
, &data
) == S_ERROR
)
2606 /* During version processing we calculated the total size. */
2607 data
->d_size
= ofl
->ofl_verdefsz
;
2608 shdr
->sh_size
= (Xword
)ofl
->ofl_verdefsz
;
2611 ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_version
, NULL
);
2612 return ((uintptr_t)ofl
->ofl_osverdef
);
2616 * This routine is called when -z nopartial is in effect.
2619 ld_make_parexpn_data(Ofl_desc
*ofl
, size_t size
, Xword align
)
2626 if (new_section(ofl
, SHT_PROGBITS
, MSG_ORIG(MSG_SCN_DATA
), 0,
2627 &isec
, &shdr
, &data
) == S_ERROR
)
2630 shdr
->sh_flags
|= SHF_WRITE
;
2631 data
->d_size
= size
;
2632 shdr
->sh_size
= (Xword
)size
;
2634 data
->d_align
= align
;
2635 shdr
->sh_addralign
= align
;
2638 if ((data
->d_buf
= libld_calloc(size
, 1)) == NULL
)
2642 * Retain handle to this .data input section. Variables using move
2643 * sections (partial initialization) will be redirected here when
2644 * such global references are added and '-z nopartial' is in effect.
2646 ofl
->ofl_isparexpn
= isec
;
2647 osp
= ld_place_section(ofl
, isec
, NULL
, ld_targ
.t_id
.id_data
, NULL
);
2648 if (osp
== (Os_desc
*)S_ERROR
)
2651 if (!(osp
->os_flags
& FLG_OS_OUTREL
)) {
2652 ofl
->ofl_dynshdrcnt
++;
2653 osp
->os_flags
|= FLG_OS_OUTREL
;
2659 * Make .sunwmove section
2662 ld_make_sunwmove(Ofl_desc
*ofl
, int mv_nums
)
2672 if (new_section(ofl
, SHT_SUNW_move
, MSG_ORIG(MSG_SCN_SUNWMOVE
),
2673 mv_nums
, &isec
, &shdr
, &data
) == S_ERROR
)
2676 if ((data
->d_buf
= libld_calloc(data
->d_size
, 1)) == NULL
)
2682 for (APLIST_TRAVERSE(ofl
->ofl_parsyms
, idx
, sdp
)) {
2686 if (sdp
->sd_flags
& FLG_SY_PAREXPN
)
2689 for (ALIST_TRAVERSE(sdp
->sd_move
, idx2
, mdp
))
2690 mdp
->md_oidx
= cnt
++;
2693 if ((ofl
->ofl_osmove
= ld_place_section(ofl
, isec
, NULL
, 0, NULL
)) ==
2701 * Given a relocation descriptor that references a string table
2702 * input section, locate the string referenced and return a pointer
2706 strmerge_get_reloc_str(Ofl_desc
*ofl
, Rel_desc
*rsp
)
2708 Sym_desc
*sdp
= rsp
->rel_sym
;
2712 * In the case of an STT_SECTION symbol, the addend of the
2713 * relocation gives the offset into the string section. For
2714 * other symbol types, the symbol value is the offset.
2717 if (ELF_ST_TYPE(sdp
->sd_sym
->st_info
) != STT_SECTION
) {
2718 str_off
= sdp
->sd_sym
->st_value
;
2719 } else if ((rsp
->rel_flags
& FLG_REL_RELA
) == FLG_REL_RELA
) {
2721 * For SHT_RELA, the addend value is found in the
2722 * rel_raddend field of the relocation.
2724 str_off
= rsp
->rel_raddend
;
2725 } else { /* REL and STT_SECTION */
2727 * For SHT_REL, the "addend" is not part of the relocation
2728 * record. Instead, it is found at the relocation target
2731 uchar_t
*addr
= (uchar_t
*)((uintptr_t)rsp
->rel_roffset
+
2732 (uintptr_t)rsp
->rel_isdesc
->is_indata
->d_buf
);
2734 if (ld_reloc_targval_get(ofl
, rsp
, addr
, &str_off
) == 0)
2738 return (str_off
+ (char *)sdp
->sd_isc
->is_indata
->d_buf
);
2742 * First pass over the relocation records for string table merging.
2743 * Build lists of relocations and symbols that will need modification,
2744 * and insert the strings they reference into the mstrtab string table.
2747 * ofl, osp - As passed to ld_make_strmerge().
2748 * mstrtab - String table to receive input strings. This table
2749 * must be in its first (initialization) pass and not
2750 * yet cooked (st_getstrtab_sz() not yet called).
2751 * rel_alpp - APlist to receive pointer to any relocation
2752 * descriptors with STT_SECTION symbols that reference
2753 * one of the input sections being merged.
2754 * sym_alpp - APlist to receive pointer to any symbols that reference
2755 * one of the input sections being merged.
2756 * rcp - Pointer to cache of relocation descriptors to examine.
2757 * Either &ofl->ofl_actrels (active relocations)
2758 * or &ofl->ofl_outrels (output relocations).
2761 * On success, rel_alpp and sym_alpp are updated, and
2762 * any strings in the mergeable input sections referenced by
2763 * a relocation has been entered into mstrtab. True (1) is returned.
2765 * On failure, False (0) is returned.
2768 strmerge_pass1(Ofl_desc
*ofl
, Os_desc
*osp
, Str_tbl
*mstrtab
,
2769 APlist
**rel_alpp
, APlist
**sym_alpp
, Rel_cache
*rcp
)
2774 Sym_desc
*last_sdp
= NULL
;
2778 REL_CACHE_TRAVERSE(rcp
, idx
, rcbp
, rsp
) {
2780 if ((sdp
->sd_isc
== NULL
) || ((sdp
->sd_isc
->is_flags
&
2781 (FLG_IS_DISCARD
| FLG_IS_INSTRMRG
)) != FLG_IS_INSTRMRG
) ||
2782 (sdp
->sd_isc
->is_osdesc
!= osp
))
2786 * Remember symbol for use in the third pass. There is no
2787 * reason to save a given symbol more than once, so we take
2788 * advantage of the fact that relocations to a given symbol
2789 * tend to cluster in the list. If this is the same symbol
2790 * we saved last time, don't bother.
2792 if (last_sdp
!= sdp
) {
2793 if (aplist_append(sym_alpp
, sdp
, AL_CNT_STRMRGSYM
) ==
2799 /* Enter the string into our new string table */
2800 name
= strmerge_get_reloc_str(ofl
, rsp
);
2801 if (st_insert(mstrtab
, name
) == -1)
2805 * If this is an STT_SECTION symbol, then the second pass
2806 * will need to modify this relocation, so hang on to it.
2808 if ((ELF_ST_TYPE(sdp
->sd_sym
->st_info
) == STT_SECTION
) &&
2809 (aplist_append(rel_alpp
, rsp
, AL_CNT_STRMRGREL
) == NULL
))
2817 * If the output section has any SHF_MERGE|SHF_STRINGS input sections,
2818 * replace them with a single merged/compressed input section.
2821 * ofl - Output file descriptor
2822 * osp - Output section descriptor
2823 * rel_alpp, sym_alpp, - Address of 2 APlists, to be used
2824 * for internal processing. On the initial call to
2825 * ld_make_strmerge, these list pointers must be NULL.
2826 * The caller is encouraged to pass the same lists back for
2827 * successive calls to this function without freeing
2828 * them in between calls. This causes a single pair of
2829 * memory allocations to be reused multiple times.
2832 * If section merging is possible, it is done. If no errors are
2833 * encountered, True (1) is returned. On error, S_ERROR.
2835 * The contents of rel_alpp and sym_alpp on exit are
2836 * undefined. The caller can free them, or pass them back to a subsequent
2837 * call to this routine, but should not examine their contents.
2840 ld_make_strmerge(Ofl_desc
*ofl
, Os_desc
*osp
, APlist
**rel_alpp
,
2843 Str_tbl
*mstrtab
; /* string table for string merge secs */
2844 Is_desc
*mstrsec
; /* Generated string merge section */
2847 Elf_Data
*mstr_data
;
2852 int st_setstring_status
;
2855 /* If string table compression is disabled, there's nothing to do */
2856 if ((ofl
->ofl_flags1
& FLG_OF1_NCSTTAB
) != 0)
2860 * Pass over the mergeable input sections, and if they haven't
2861 * all been discarded, create a string table.
2864 for (APLIST_TRAVERSE(osp
->os_mstrisdescs
, idx
, isp
)) {
2865 if (isdesc_discarded(isp
))
2869 * Input sections of 0 size are dubiously valid since they do
2870 * not even contain the NUL string. Ignore them.
2872 if (isp
->is_shdr
->sh_size
== 0)
2876 * We have at least one non-discarded section.
2877 * Create a string table descriptor.
2879 if ((mstrtab
= st_new(FLG_STNEW_COMPRESS
)) == NULL
)
2884 /* If no string table was created, we have no mergeable sections */
2885 if (mstrtab
== NULL
)
2889 * This routine has to make 3 passes:
2891 * 1) Examine all relocations, insert strings from relocations
2892 * to the mergeable input sections into the string table.
2893 * 2) Modify the relocation values to be correct for the
2894 * new merged section.
2895 * 3) Modify the symbols used by the relocations to reference
2898 * These passes cannot be combined:
2899 * - The string table code works in two passes, and all
2900 * strings have to be loaded in pass one before the
2901 * offset of any strings can be determined.
2902 * - Multiple relocations reference a single symbol, so the
2903 * symbol cannot be modified until all relocations are
2906 * The number of relocations related to section merging is usually
2907 * a mere fraction of the overall active and output relocation lists,
2908 * and the number of symbols is usually a fraction of the number
2909 * of related relocations. We therefore build APlists for the
2910 * relocations and symbols in the first pass, and then use those
2911 * lists to accelerate the operation of pass 2 and 3.
2913 * Reinitialize the lists to a completely empty state.
2915 aplist_reset(*rel_alpp
);
2916 aplist_reset(*sym_alpp
);
2921 * Every relocation related to this output section (and the input
2922 * sections that make it up) is found in either the active, or the
2923 * output relocation list, depending on whether the relocation is to
2924 * be processed by this invocation of the linker, or inserted into the
2927 * Build lists of relocations and symbols that will need modification,
2928 * and insert the strings they reference into the mstrtab string table.
2930 if (strmerge_pass1(ofl
, osp
, mstrtab
, rel_alpp
, sym_alpp
,
2931 &ofl
->ofl_actrels
) == 0)
2932 goto return_s_error
;
2933 if (strmerge_pass1(ofl
, osp
, mstrtab
, rel_alpp
, sym_alpp
,
2934 &ofl
->ofl_outrels
) == 0)
2935 goto return_s_error
;
2938 * Get the size of the new input section. Requesting the
2939 * string table size "cooks" the table, and finalizes its contents.
2941 data_size
= st_getstrtab_sz(mstrtab
);
2943 /* Create a new input section to hold the merged strings */
2944 if (new_section_from_template(ofl
, isp
, data_size
,
2945 &mstrsec
, &mstr_shdr
, &mstr_data
) == S_ERROR
)
2946 goto return_s_error
;
2947 mstrsec
->is_flags
|= FLG_IS_GNSTRMRG
;
2950 * Allocate a data buffer for the new input section.
2951 * Then, associate the buffer with the string table descriptor.
2953 if ((mstr_data
->d_buf
= libld_malloc(data_size
)) == NULL
)
2954 goto return_s_error
;
2955 if (st_setstrbuf(mstrtab
, mstr_data
->d_buf
, data_size
) == -1)
2956 goto return_s_error
;
2958 /* Add the new section to the output image */
2959 if (ld_place_section(ofl
, mstrsec
, NULL
, osp
->os_identndx
, NULL
) ==
2961 goto return_s_error
;
2966 * Revisit the relocation descriptors with STT_SECTION symbols
2967 * that were saved by the first pass. Update each relocation
2968 * record so that the offset it contains is for the new section
2969 * instead of the original.
2971 for (APLIST_TRAVERSE(*rel_alpp
, idx
, rsp
)) {
2974 /* Put the string into the merged string table */
2975 name
= strmerge_get_reloc_str(ofl
, rsp
);
2976 st_setstring_status
= st_setstring(mstrtab
, name
, &stoff
);
2977 if (st_setstring_status
== -1) {
2979 * A failure to insert at this point means that
2980 * something is corrupt. This isn't a resource issue.
2982 assert(st_setstring_status
!= -1);
2983 goto return_s_error
;
2987 * Alter the relocation to access the string at the
2988 * new offset in our new string table.
2990 * For SHT_RELA platforms, it suffices to simply
2991 * update the rel_raddend field of the relocation.
2993 * For SHT_REL platforms, the new "addend" value
2994 * needs to be written at the address being relocated.
2995 * However, we can't alter the input sections which
2996 * are mapped readonly, and the output image has not
2997 * been created yet. So, we defer this operation,
2998 * using the rel_raddend field of the relocation
2999 * which is normally 0 on a REL platform, to pass the
3000 * new "addend" value to ld_perform_outreloc() or
3001 * ld_do_activerelocs(). The FLG_REL_NADDEND flag
3002 * tells them that this is the case.
3004 if ((rsp
->rel_flags
& FLG_REL_RELA
) == 0) /* REL */
3005 rsp
->rel_flags
|= FLG_REL_NADDEND
;
3006 rsp
->rel_raddend
= (Sxword
)stoff
;
3009 * Generate a symbol name string for STT_SECTION symbols
3010 * that might reference our merged section. This shows up
3011 * in debug output and helps show how the relocation has
3012 * changed from its original input section to our merged one.
3014 if (ld_stt_section_sym_name(mstrsec
) == NULL
)
3015 goto return_s_error
;
3021 * Modify the symbols referenced by the relocation descriptors
3022 * so that they reference the new input section containing the
3023 * merged strings instead of the original input sections.
3025 for (APLIST_TRAVERSE(*sym_alpp
, idx
, sdp
)) {
3027 * If we've already processed this symbol, don't do it
3028 * twice. strmerge_pass1() uses a heuristic (relocations to
3029 * the same symbol clump together) to avoid inserting a
3030 * given symbol more than once, but repeat symbols in
3031 * the list can occur.
3033 if ((sdp
->sd_isc
->is_flags
& FLG_IS_INSTRMRG
) == 0)
3036 if (ELF_ST_TYPE(sdp
->sd_sym
->st_info
) != STT_SECTION
) {
3038 * This is not an STT_SECTION symbol, so its
3039 * value is the offset of the string within the
3040 * input section. Update the address to reflect
3041 * the address in our new merged section.
3043 const char *name
= sdp
->sd_sym
->st_value
+
3044 (char *)sdp
->sd_isc
->is_indata
->d_buf
;
3046 st_setstring_status
=
3047 st_setstring(mstrtab
, name
, &stoff
);
3048 if (st_setstring_status
== -1) {
3050 * A failure to insert at this point means
3051 * something is corrupt. This isn't a
3054 assert(st_setstring_status
!= -1);
3055 goto return_s_error
;
3058 if (ld_sym_copy(sdp
) == S_ERROR
)
3059 goto return_s_error
;
3060 sdp
->sd_sym
->st_value
= (Word
)stoff
;
3063 /* Redirect the symbol to our new merged section */
3064 sdp
->sd_isc
= mstrsec
;
3068 * There are no references left to the original input string sections.
3069 * Mark them as discarded so they don't go into the output image.
3070 * At the same time, add up the sizes of the replaced sections.
3073 for (APLIST_TRAVERSE(osp
->os_mstrisdescs
, idx
, isp
)) {
3074 if (isp
->is_flags
& (FLG_IS_DISCARD
| FLG_IS_GNSTRMRG
))
3077 data_size
+= isp
->is_indata
->d_size
;
3079 isp
->is_flags
|= FLG_IS_DISCARD
;
3080 DBG_CALL(Dbg_sec_discarded(ofl
->ofl_lml
, isp
, mstrsec
));
3083 /* Report how much space we saved in the output section */
3084 DBG_CALL(Dbg_sec_genstr_compress(ofl
->ofl_lml
, osp
->os_name
, data_size
,
3085 mstr_data
->d_size
));
3087 st_destroy(mstrtab
);
3091 st_destroy(mstrtab
);
3096 * Update a data buffers size. A number of sections have to be created, and
3097 * the sections header contributes to the size of the eventual section. Thus,
3098 * a section may be created, and once all associated sections have been created,
3099 * we return to establish the required section size.
3102 update_data_size(Os_desc
*osp
, ulong_t cnt
)
3104 Is_desc
*isec
= ld_os_first_isdesc(osp
);
3105 Elf_Data
*data
= isec
->is_indata
;
3106 Shdr
*shdr
= osp
->os_shdr
;
3107 size_t size
= cnt
* shdr
->sh_entsize
;
3109 shdr
->sh_size
= (Xword
)size
;
3110 data
->d_size
= size
;
3114 * The following sections are built after all input file processing and symbol
3115 * validation has been carried out. The order is important (because the
3116 * addition of a section adds a new symbol there is a chicken and egg problem
3117 * of maintaining the appropriate counts). By maintaining a known order the
3118 * individual routines can compensate for later, known, additions.
3121 ld_make_sections(Ofl_desc
*ofl
)
3123 ofl_flag_t flags
= ofl
->ofl_flags
;
3127 * Generate any special sections.
3129 if (flags
& FLG_OF_ADDVERS
)
3130 if (make_comment(ofl
) == S_ERROR
)
3133 if (make_interp(ofl
) == S_ERROR
)
3137 * Create a capabilities section if required.
3139 if (make_cap(ofl
, SHT_SUNW_cap
, MSG_ORIG(MSG_SCN_SUNWCAP
),
3140 ld_targ
.t_id
.id_cap
) == S_ERROR
)
3144 * Create any init/fini array sections.
3146 if (make_array(ofl
, SHT_INIT_ARRAY
, MSG_ORIG(MSG_SCN_INITARRAY
),
3147 ofl
->ofl_initarray
) == S_ERROR
)
3150 if (make_array(ofl
, SHT_FINI_ARRAY
, MSG_ORIG(MSG_SCN_FINIARRAY
),
3151 ofl
->ofl_finiarray
) == S_ERROR
)
3154 if (make_array(ofl
, SHT_PREINIT_ARRAY
, MSG_ORIG(MSG_SCN_PREINITARRAY
),
3155 ofl
->ofl_preiarray
) == S_ERROR
)
3159 * Make the .plt section. This occurs after any other relocation
3160 * sections are generated (see reloc_init()) to ensure that the
3161 * associated relocation section is after all the other relocation
3164 if ((ofl
->ofl_pltcnt
) || (ofl
->ofl_pltpad
))
3165 if (make_plt(ofl
) == S_ERROR
)
3169 * Determine whether any sections or files are not referenced. Under
3170 * -Dunused a diagnostic for any unused components is generated, under
3171 * -zignore the component is removed from the final output.
3173 if (DBG_ENABLED
|| (ofl
->ofl_flags1
& FLG_OF1_IGNPRC
)) {
3174 if (ignore_section_processing(ofl
) == S_ERROR
)
3179 * If we have detected a situation in which previously placed
3180 * output sections may have been discarded, perform the necessary
3183 if (ofl
->ofl_flags
& FLG_OF_ADJOSCNT
)
3184 adjust_os_count(ofl
);
3187 * Do any of the output sections contain input sections that
3188 * are candidates for string table merging? For each such case,
3189 * we create a replacement section, insert it, and discard the
3192 * rel_alpp and sym_alpp are used by ld_make_strmerge()
3193 * for its internal processing. We are responsible for the
3194 * initialization and cleanup, and ld_make_strmerge() handles the rest.
3195 * This allows us to reuse a single pair of memory buffers, allocated
3196 * for this processing, for all the output sections.
3198 if ((ofl
->ofl_flags1
& FLG_OF1_NCSTTAB
) == 0) {
3200 APlist
*rel_alpp
= NULL
;
3201 APlist
*sym_alpp
= NULL
;
3204 for (APLIST_TRAVERSE(ofl
->ofl_segs
, idx1
, sgp
)) {
3208 for (APLIST_TRAVERSE(sgp
->sg_osdescs
, idx2
, osp
))
3209 if ((osp
->os_mstrisdescs
!= NULL
) &&
3210 (ld_make_strmerge(ofl
, osp
,
3211 &rel_alpp
, &sym_alpp
) ==
3217 if (rel_alpp
!= NULL
)
3218 libld_free(rel_alpp
);
3219 if (sym_alpp
!= NULL
)
3220 libld_free(sym_alpp
);
3221 if (error_seen
!= 0)
3226 * Add any necessary versioning information.
3228 if (!(flags
& FLG_OF_NOVERSEC
)) {
3229 if ((flags
& FLG_OF_VERNEED
) &&
3230 (make_verneed(ofl
) == S_ERROR
))
3232 if ((flags
& FLG_OF_VERDEF
) &&
3233 (make_verdef(ofl
) == S_ERROR
))
3235 if ((flags
& (FLG_OF_VERNEED
| FLG_OF_VERDEF
)) &&
3236 ((ofl
->ofl_osversym
= make_sym_sec(ofl
,
3237 MSG_ORIG(MSG_SCN_SUNWVERSYM
), SHT_SUNW_versym
,
3238 ld_targ
.t_id
.id_version
)) == (Os_desc
*)S_ERROR
))
3243 * Create a syminfo section if necessary.
3245 if (flags
& FLG_OF_SYMINFO
) {
3246 if ((ofl
->ofl_ossyminfo
= make_sym_sec(ofl
,
3247 MSG_ORIG(MSG_SCN_SUNWSYMINFO
), SHT_SUNW_syminfo
,
3248 ld_targ
.t_id
.id_syminfo
)) == (Os_desc
*)S_ERROR
)
3252 if (flags
& FLG_OF_COMREL
) {
3254 * If -zcombreloc is enabled then all relocations (except for
3255 * the PLT's) are coalesced into a single relocation section.
3257 if (ofl
->ofl_reloccnt
) {
3258 if (make_reloc(ofl
, NULL
) == S_ERROR
)
3265 * Create the required output relocation sections. Note, new
3266 * sections may be added to the section list that is being
3267 * traversed. These insertions can move the elements of the
3268 * Alist such that a section descriptor is re-read. Recursion
3269 * is prevented by maintaining a previous section pointer and
3270 * insuring that this pointer isn't re-examined.
3272 for (APLIST_TRAVERSE(ofl
->ofl_segs
, idx1
, sgp
)) {
3273 Os_desc
*osp
, *posp
= 0;
3276 for (APLIST_TRAVERSE(sgp
->sg_osdescs
, idx2
, osp
)) {
3277 if ((osp
!= posp
) && osp
->os_szoutrels
&&
3278 (osp
!= ofl
->ofl_osplt
)) {
3279 if (make_reloc(ofl
, osp
) == S_ERROR
)
3287 * If we're not building a combined relocation section, then
3288 * build a .rel[a] section as required.
3290 if (ofl
->ofl_relocrelsz
) {
3291 if (make_reloc(ofl
, NULL
) == S_ERROR
)
3297 * The PLT relocations are always in their own section, and we try to
3298 * keep them at the end of the PLT table. We do this to keep the hot
3299 * "data" PLT's at the head of the table nearer the .dynsym & .hash.
3301 if (ofl
->ofl_osplt
&& ofl
->ofl_relocpltsz
) {
3302 if (make_reloc(ofl
, ofl
->ofl_osplt
) == S_ERROR
)
3307 * Finally build the symbol and section header sections.
3309 if (flags
& FLG_OF_DYNAMIC
) {
3310 if (make_dynamic(ofl
) == S_ERROR
)
3314 * A number of sections aren't necessary within a relocatable
3315 * object, even if -dy has been used.
3317 if (!(flags
& FLG_OF_RELOBJ
)) {
3318 if (make_hash(ofl
) == S_ERROR
)
3320 if (make_dynstr(ofl
) == S_ERROR
)
3322 if (make_dynsym(ofl
) == S_ERROR
)
3324 if (ld_unwind_make_hdr(ofl
) == S_ERROR
)
3326 if (make_dynsort(ofl
) == S_ERROR
)
3331 if (!(flags
& FLG_OF_STRIP
) || (flags
& FLG_OF_RELOBJ
) ||
3332 ((flags
& FLG_OF_STATIC
) && ofl
->ofl_osversym
)) {
3334 * Do we need to make a SHT_SYMTAB_SHNDX section
3335 * for the dynsym. If so - do it now.
3337 if (ofl
->ofl_osdynsym
&&
3338 ((ofl
->ofl_shdrcnt
+ 3) >= SHN_LORESERVE
)) {
3339 if (make_dynsym_shndx(ofl
) == S_ERROR
)
3343 if (make_strtab(ofl
) == S_ERROR
)
3345 if (make_symtab(ofl
) == S_ERROR
)
3349 * Do we need to make a SHT_SYMTAB_SHNDX section
3350 * for the dynsym. If so - do it now.
3352 if (ofl
->ofl_osdynsym
&&
3353 ((ofl
->ofl_shdrcnt
+ 1) >= SHN_LORESERVE
)) {
3354 if (make_dynsym_shndx(ofl
) == S_ERROR
)
3359 if (make_shstrtab(ofl
) == S_ERROR
)
3363 * Now that we've created all output sections, adjust the size of the
3364 * SHT_SUNW_versym and SHT_SUNW_syminfo section, which are dependent on
3365 * the associated symbol table sizes.
3367 if (ofl
->ofl_osversym
|| ofl
->ofl_ossyminfo
) {
3372 if (OFL_IS_STATIC_OBJ(ofl
))
3373 osp
= ofl
->ofl_ossymtab
;
3375 osp
= ofl
->ofl_osdynsym
;
3377 isp
= ld_os_first_isdesc(osp
);
3378 cnt
= (isp
->is_shdr
->sh_size
/ isp
->is_shdr
->sh_entsize
);
3380 if (ofl
->ofl_osversym
)
3381 update_data_size(ofl
->ofl_osversym
, cnt
);
3383 if (ofl
->ofl_ossyminfo
)
3384 update_data_size(ofl
->ofl_ossyminfo
, cnt
);
3388 * Now that we've created all output sections, adjust the size of the
3389 * SHT_SUNW_capinfo, which is dependent on the associated symbol table
3392 if (ofl
->ofl_oscapinfo
) {
3396 * Symbol capabilities symbols are placed directly after the
3397 * STT_FILE symbol, section symbols, and any register symbols.
3398 * Effectively these are the first of any series of demoted
3401 if (OFL_IS_STATIC_OBJ(ofl
))
3402 cnt
= SYMTAB_ALL_CNT(ofl
);
3404 cnt
= DYNSYM_ALL_CNT(ofl
);
3406 update_data_size(ofl
->ofl_oscapinfo
, cnt
);
3412 * Build an additional data section - used to back OBJT symbol definitions
3413 * added with a mapfile.
3416 ld_make_data(Ofl_desc
*ofl
, size_t size
)
3422 if (new_section(ofl
, SHT_PROGBITS
, MSG_ORIG(MSG_SCN_DATA
), 0,
3423 &isec
, &shdr
, &data
) == S_ERROR
)
3424 return ((Is_desc
*)S_ERROR
);
3426 data
->d_size
= size
;
3427 shdr
->sh_size
= (Xword
)size
;
3428 shdr
->sh_flags
|= SHF_WRITE
;
3430 if (aplist_append(&ofl
->ofl_mapdata
, isec
, AL_CNT_OFL_MAPSECS
) == NULL
)
3431 return ((Is_desc
*)S_ERROR
);
3437 * Build an additional text section - used to back FUNC symbol definitions
3438 * added with a mapfile.
3441 ld_make_text(Ofl_desc
*ofl
, size_t size
)
3448 * Insure the size is sufficient to contain the minimum return
3451 if (size
< ld_targ
.t_nf
.nf_size
)
3452 size
= ld_targ
.t_nf
.nf_size
;
3454 if (new_section(ofl
, SHT_PROGBITS
, MSG_ORIG(MSG_SCN_TEXT
), 0,
3455 &isec
, &shdr
, &data
) == S_ERROR
)
3456 return ((Is_desc
*)S_ERROR
);
3458 data
->d_size
= size
;
3459 shdr
->sh_size
= (Xword
)size
;
3460 shdr
->sh_flags
|= SHF_EXECINSTR
;
3463 * Fill the buffer with the appropriate return instruction.
3464 * Note that there is no need to swap bytes on a non-native,
3465 * link, as the data being copied is given in bytes.
3467 if ((data
->d_buf
= libld_calloc(size
, 1)) == NULL
)
3468 return ((Is_desc
*)S_ERROR
);
3469 (void) memcpy(data
->d_buf
, ld_targ
.t_nf
.nf_template
,
3470 ld_targ
.t_nf
.nf_size
);
3473 * If size was larger than required, and the target supplies
3474 * a fill function, use it to fill the balance. If there is no
3475 * fill function, we accept the 0-fill supplied by libld_calloc().
3477 if ((ld_targ
.t_ff
.ff_execfill
!= NULL
) && (size
> ld_targ
.t_nf
.nf_size
))
3478 ld_targ
.t_ff
.ff_execfill(data
->d_buf
, ld_targ
.t_nf
.nf_size
,
3479 size
- ld_targ
.t_nf
.nf_size
);
3481 if (aplist_append(&ofl
->ofl_maptext
, isec
, AL_CNT_OFL_MAPSECS
) == NULL
)
3482 return ((Is_desc
*)S_ERROR
);
3488 ld_comdat_validate(Ofl_desc
*ofl
, Ifl_desc
*ifl
)
3492 for (i
= 0; i
< ifl
->ifl_shnum
; i
++) {
3493 Is_desc
*isp
= ifl
->ifl_isdesc
[i
];
3495 char buf
[1024] = "";
3496 Group_desc
*gr
= NULL
;
3498 if ((isp
== NULL
) || (isp
->is_flags
& FLG_IS_COMDAT
) == 0)
3501 if (isp
->is_shdr
->sh_type
== SHT_SUNW_COMDAT
) {
3503 (void) strlcpy(buf
, MSG_ORIG(MSG_STR_SUNW_COMDAT
),
3507 if (strncmp(MSG_ORIG(MSG_SCN_GNU_LINKONCE
), isp
->is_name
,
3508 MSG_SCN_GNU_LINKONCE_SIZE
) == 0) {
3511 (void) strlcat(buf
, ", ", sizeof (buf
));
3512 (void) strlcat(buf
, MSG_ORIG(MSG_SCN_GNU_LINKONCE
),
3516 if ((isp
->is_shdr
->sh_flags
& SHF_GROUP
) &&
3517 ((gr
= ld_get_group(ofl
, isp
)) != NULL
) &&
3518 (gr
->gd_data
[0] & GRP_COMDAT
)) {
3521 (void) strlcat(buf
, ", ", sizeof (buf
));
3522 (void) strlcat(buf
, MSG_ORIG(MSG_STR_GROUP
),
3527 ld_eprintf(ofl
, ERR_FATAL
,
3528 MSG_INTL(MSG_SCN_MULTICOMDAT
), ifl
->ifl_name
,
3529 EC_WORD(isp
->is_scnndx
), isp
->is_name
, buf
);