1 /*
2 * CDDL HEADER START
3 *
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.
7 *
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.
12 *
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]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 1988 AT&T
24 * All Rights Reserved
25 *
26 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
27 */
28
29 /*
30 * Module sections. Initialize special sections
31 */
32
33 #define ELF_TARGET_AMD64
34
35 #include <string.h>
36 #include <strings.h>
37 #include <stdio.h>
38 #include <link.h>
39 #include <debug.h>
40 #include "msg.h"
41 #include "_libld.h"
42
43 inline static void
remove_local(Ofl_desc * ofl,Sym_desc * sdp,int allow_ldynsym)44 remove_local(Ofl_desc *ofl, Sym_desc *sdp, int allow_ldynsym)
45 {
46 Sym *sym = sdp->sd_sym;
47 uchar_t type = ELF_ST_TYPE(sym->st_info);
48 /* LINTED - only used for assert() */
49 int err;
50
51 if ((ofl->ofl_flags & FLG_OF_REDLSYM) == 0) {
52 ofl->ofl_locscnt--;
53
54 err = st_delstring(ofl->ofl_strtab, sdp->sd_name);
55 assert(err != -1);
56
57 if (allow_ldynsym && ldynsym_symtype[type]) {
58 ofl->ofl_dynlocscnt--;
59
60 err = st_delstring(ofl->ofl_dynstrtab, sdp->sd_name);
61 assert(err != -1);
62 /* Remove from sort section? */
63 DYNSORT_COUNT(sdp, sym, type, --);
64 }
65 }
66 sdp->sd_flags |= FLG_SY_ISDISC;
67 }
68
69 inline static void
remove_scoped(Ofl_desc * ofl,Sym_desc * sdp,int allow_ldynsym)70 remove_scoped(Ofl_desc *ofl, Sym_desc *sdp, int allow_ldynsym)
71 {
72 Sym *sym = sdp->sd_sym;
73 uchar_t type = ELF_ST_TYPE(sym->st_info);
74 /* LINTED - only used for assert() */
75 int err;
76
77 ofl->ofl_scopecnt--;
78 ofl->ofl_elimcnt++;
79
80 err = st_delstring(ofl->ofl_strtab, sdp->sd_name);
81 assert(err != -1);
82
83 if (allow_ldynsym && ldynsym_symtype[type]) {
84 ofl->ofl_dynscopecnt--;
85
86 err = st_delstring(ofl->ofl_dynstrtab, sdp->sd_name);
87 assert(err != -1);
88 /* Remove from sort section? */
89 DYNSORT_COUNT(sdp, sym, type, --);
90 }
91 sdp->sd_flags |= FLG_SY_ELIM;
92 }
93
94 inline static void
ignore_sym(Ofl_desc * ofl,Ifl_desc * ifl,Sym_desc * sdp,int allow_ldynsym)95 ignore_sym(Ofl_desc *ofl, Ifl_desc *ifl, Sym_desc *sdp, int allow_ldynsym)
96 {
97 Os_desc *osp;
98 Is_desc *isp = sdp->sd_isc;
99 uchar_t bind = ELF_ST_BIND(sdp->sd_sym->st_info);
100
101 if (bind == STB_LOCAL) {
102 uchar_t type = ELF_ST_TYPE(sdp->sd_sym->st_info);
103
104 /*
105 * Skip section symbols, these were never collected in the
106 * first place.
107 */
108 if (type == STT_SECTION)
109 return;
110
111 /*
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
115 * (update) required.
116 */
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);
123 return;
124 }
125
126 } else {
127 /*
128 * Global symbols can only be eliminated when the interfaces of
129 * an object have been defined via versioning/scoping.
130 */
131 if (!SYM_IS_HIDDEN(sdp))
132 return;
133
134 /*
135 * Remove any unreferenced symbols that are not associated with
136 * a section.
137 */
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);
142 return;
143 }
144 }
145
146 /*
147 * Do not discard any symbols that are associated with non-allocable
148 * segments.
149 */
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);
157 else
158 remove_scoped(ofl, sdp, allow_ldynsym);
159 }
160 }
161 }
162
163 /*
164 * There are situations where we may count output sections (ofl_shdrcnt)
165 * that are subsequently eliminated from the output object. Whether or
166 * not this happens cannot be known until all input has been seen and
167 * section elimination code has run. However, the situations where this
168 * outcome is possible are known, and are flagged by setting FLG_OF_ADJOSCNT.
169 *
170 * If FLG_OF_ADJOSCNT is set, this routine makes a pass over the output
171 * sections. If an unused output section is encountered, we decrement
172 * ofl->ofl_shdrcnt and remove the section name from the .shstrtab string
173 * table (ofl->ofl_shdrsttab).
174 *
175 * This code must be kept in sync with the similar code
176 * found in outfile.c:ld_create_outfile().
177 */
178 static void
adjust_os_count(Ofl_desc * ofl)179 adjust_os_count(Ofl_desc *ofl)
180 {
181 Sg_desc *sgp;
182 Is_desc *isp;
183 Os_desc *osp;
184 Ifl_desc *ifl;
185 Aliste idx1;
186
187 if ((ofl->ofl_flags & FLG_OF_ADJOSCNT) == 0)
188 return;
189
190 /*
191 * For each output section, look at the input sections to find at least
192 * one input section that has not been eliminated. If none are found,
193 * the -z ignore processing above has eliminated that output section.
194 */
195 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
196 Aliste idx2;
197 Word ptype = sgp->sg_phdr.p_type;
198
199 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
200 Aliste idx3;
201 int keep = 0, os_isdescs_idx;
202
203 OS_ISDESCS_TRAVERSE(os_isdescs_idx, osp, idx3, isp) {
204 ifl = isp->is_file;
205
206 /* Input section is tagged for discard? */
207 if (isp->is_flags & FLG_IS_DISCARD)
208 continue;
209
210 /*
211 * If the file is discarded, it will take
212 * the section with it.
213 */
214 if (ifl &&
215 (((ifl->ifl_flags & FLG_IF_FILEREF) == 0) ||
216 ((ptype == PT_LOAD) &&
217 ((isp->is_flags & FLG_IS_SECTREF) == 0) &&
218 (isp->is_shdr->sh_size > 0))) &&
219 (ifl->ifl_flags & FLG_IF_IGNORE))
220 continue;
221
222 /*
223 * We have found a kept input section,
224 * so the output section will be created.
225 */
226 keep = 1;
227 break;
228 }
229 /*
230 * If no section of this name was kept, decrement
231 * the count and remove the name from .shstrtab.
232 */
233 if (keep == 0) {
234 /* LINTED - only used for assert() */
235 int err;
236
237 ofl->ofl_shdrcnt--;
238 err = st_delstring(ofl->ofl_shdrsttab,
239 osp->os_name);
240 assert(err != -1);
241 }
242 }
243 }
244 }
245
246 /*
247 * If -zignore has been in effect, scan all input files to determine if the
248 * file, or sections from the file, have been referenced. If not, the file or
249 * some of the files sections can be discarded. If sections are to be
250 * discarded, rescan the output relocations and the symbol table and remove
251 * the relocations and symbol entries that are no longer required.
252 *
253 * Note: It's possible that a section which is being discarded has contributed
254 * to the GOT table or the PLT table. However, we can't at this point
255 * eliminate the corresponding entries. This is because there could well
256 * be other sections referencing those same entries, but we don't have
257 * the infrastructure to determine this. So, keep the PLT and GOT
258 * entries in the table in case someone wants them.
259 * Note: The section to be affected needs to be allocatable.
260 * So even if -zignore is in effect, if the section is not allocatable,
261 * we do not eliminate it.
262 */
263 static uintptr_t
ignore_section_processing(Ofl_desc * ofl)264 ignore_section_processing(Ofl_desc *ofl)
265 {
266 Sg_desc *sgp;
267 Is_desc *isp;
268 Os_desc *osp;
269 Ifl_desc *ifl;
270 Rel_cachebuf *rcbp;
271 Rel_desc *rsp;
272 int allow_ldynsym = OFL_ALLOW_LDYNSYM(ofl);
273 Aliste idx1;
274
275 for (APLIST_TRAVERSE(ofl->ofl_objs, idx1, ifl)) {
276 uint_t num, discard;
277
278 /*
279 * Diagnose (-D unused) a completely unreferenced file.
280 */
281 if ((ifl->ifl_flags & FLG_IF_FILEREF) == 0)
282 DBG_CALL(Dbg_unused_file(ofl->ofl_lml,
283 ifl->ifl_name, 0, 0));
284 if (((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0) ||
285 ((ifl->ifl_flags & FLG_IF_IGNORE) == 0))
286 continue;
287
288 /*
289 * Before scanning the whole symbol table to determine if
290 * symbols should be discard - quickly (relatively) scan the
291 * sections to determine if any are to be discarded.
292 */
293 discard = 0;
294 if (ifl->ifl_flags & FLG_IF_FILEREF) {
295 for (num = 1; num < ifl->ifl_shnum; num++) {
296 if (((isp = ifl->ifl_isdesc[num]) != NULL) &&
297 ((isp->is_flags & FLG_IS_SECTREF) == 0) &&
298 ((osp = isp->is_osdesc) != NULL) &&
299 ((sgp = osp->os_sgdesc) != NULL) &&
300 (sgp->sg_phdr.p_type == PT_LOAD)) {
301 discard++;
302 break;
303 }
304 }
305 }
306
307 /*
308 * No sections are to be 'ignored'
309 */
310 if ((discard == 0) && (ifl->ifl_flags & FLG_IF_FILEREF))
311 continue;
312
313 /*
314 * We know that we have discarded sections. Scan the symbol
315 * table for this file to determine if symbols need to be
316 * discarded that are associated with the 'ignored' sections.
317 */
318 for (num = 1; num < ifl->ifl_symscnt; num++) {
319 Sym_desc *sdp;
320
321 /*
322 * If the symbol definition has been resolved to another
323 * file, or the symbol has already been discarded or
324 * eliminated, skip it.
325 */
326 sdp = ifl->ifl_oldndx[num];
327 if ((sdp->sd_file != ifl) ||
328 (sdp->sd_flags &
329 (FLG_SY_ISDISC | FLG_SY_INVALID | FLG_SY_ELIM)))
330 continue;
331
332 /*
333 * Complete the investigation of the symbol.
334 */
335 ignore_sym(ofl, ifl, sdp, allow_ldynsym);
336 }
337 }
338
339 /*
340 * If we were only here to solicit debugging diagnostics, we're done.
341 */
342 if ((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0)
343 return (1);
344
345 /*
346 * Scan all output relocations searching for those against discarded or
347 * ignored sections. If one is found, decrement the total outrel count.
348 */
349 REL_CACHE_TRAVERSE(&ofl->ofl_outrels, idx1, rcbp, rsp) {
350 Is_desc *isc = rsp->rel_isdesc;
351 uint_t flags, entsize;
352 Shdr *shdr;
353
354 if ((isc == NULL) || ((isc->is_flags & (FLG_IS_SECTREF))) ||
355 ((ifl = isc->is_file) == NULL) ||
356 ((ifl->ifl_flags & FLG_IF_IGNORE) == 0) ||
357 ((shdr = isc->is_shdr) == NULL) ||
358 ((shdr->sh_flags & SHF_ALLOC) == 0))
359 continue;
360
361 flags = rsp->rel_flags;
362
363 if (flags & (FLG_REL_GOT | FLG_REL_BSS |
364 FLG_REL_NOINFO | FLG_REL_PLT))
365 continue;
366
367 osp = RELAUX_GET_OSDESC(rsp);
368
369 if (rsp->rel_flags & FLG_REL_RELA)
370 entsize = sizeof (Rela);
371 else
372 entsize = sizeof (Rel);
373
374 assert(osp->os_szoutrels > 0);
375 osp->os_szoutrels -= entsize;
376
377 if (!(flags & FLG_REL_PLT))
378 ofl->ofl_reloccntsub++;
379
380 if (rsp->rel_rtype == ld_targ.t_m.m_r_relative)
381 ofl->ofl_relocrelcnt--;
382 }
383
384 /*
385 * As a result of our work here, the number of output sections may
386 * have decreased. Trigger a call to adjust_os_count().
387 */
388 ofl->ofl_flags |= FLG_OF_ADJOSCNT;
389
390 return (1);
391 }
392
393 /*
394 * Allocate Elf_Data, Shdr, and Is_desc structures for a new
395 * section.
396 *
397 * entry:
398 * ofl - Output file descriptor
399 * shtype - SHT_ type code for section.
400 * shname - String giving the name for the new section.
401 * entcnt - # of items contained in the data part of the new section.
402 * This value is multiplied against the known element size
403 * for the section type to determine the size of the data
404 * area for the section. It is only meaningful in cases where
405 * the section type has a non-zero element size. In other cases,
406 * the caller must set the size fields in the *ret_data and
407 * *ret_shdr structs manually.
408 * ret_isec, ret_shdr, ret_data - Address of pointers to
409 * receive address of newly allocated structs.
410 *
411 * exit:
412 * On error, returns S_ERROR. On success, returns (1), and the
413 * ret_ pointers have been updated to point at the new structures,
414 * which have been filled in. To finish the task, the caller must
415 * update any fields within the supplied descriptors that differ
416 * from its needs, and then call ld_place_section().
417 */
418 static uintptr_t
new_section(Ofl_desc * ofl,Word shtype,const char * shname,Xword entcnt,Is_desc ** ret_isec,Shdr ** ret_shdr,Elf_Data ** ret_data)419 new_section(Ofl_desc *ofl, Word shtype, const char *shname, Xword entcnt,
420 Is_desc **ret_isec, Shdr **ret_shdr, Elf_Data **ret_data)
421 {
422 typedef struct sec_info {
423 Word d_type;
424 Word align; /* Used in both data and section header */
425 Word sh_flags;
426 Word sh_entsize;
427 } SEC_INFO_T;
428
429 const SEC_INFO_T *sec_info;
430
431 Shdr *shdr;
432 Elf_Data *data;
433 Is_desc *isec;
434 size_t size;
435
436 /*
437 * For each type of section, we have a distinct set of
438 * SEC_INFO_T values. This macro defines a static structure
439 * containing those values and generates code to set the sec_info
440 * pointer to refer to it. The pointer in sec_info remains valid
441 * outside of the declaration scope because the info_s struct is static.
442 *
443 * We can't determine the value of M_WORD_ALIGN at compile time, so
444 * a different variant is used for those cases.
445 */
446 #define SET_SEC_INFO(d_type, d_align, sh_flags, sh_entsize) \
447 { \
448 static const SEC_INFO_T info_s = { d_type, d_align, sh_flags, \
449 sh_entsize}; \
450 sec_info = &info_s; \
451 }
452 #define SET_SEC_INFO_WORD_ALIGN(d_type, sh_flags, sh_entsize) \
453 { \
454 static SEC_INFO_T info_s = { d_type, 0, sh_flags, \
455 sh_entsize}; \
456 info_s.align = ld_targ.t_m.m_word_align; \
457 sec_info = &info_s; \
458 }
459
460 switch (shtype) {
461 case SHT_PROGBITS:
462 /*
463 * SHT_PROGBITS sections contain are used for many
464 * different sections. Alignments and flags differ.
465 * Some have a standard entsize, and others don't.
466 * We set some defaults here, but there is no expectation
467 * that they are correct or complete for any specific
468 * purpose. The caller must provide the correct values.
469 */
470 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, SHF_ALLOC, 0)
471 break;
472
473 case SHT_SYMTAB:
474 SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM, 0, sizeof (Sym))
475 break;
476
477 case SHT_DYNSYM:
478 SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM, SHF_ALLOC, sizeof (Sym))
479 break;
480
481 case SHT_SUNW_LDYNSYM:
482 ofl->ofl_flags |= FLG_OF_OSABI;
483 SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM, SHF_ALLOC, sizeof (Sym))
484 break;
485
486 case SHT_STRTAB:
487 /*
488 * A string table may or may not be allocable, depending
489 * on context, so we leave that flag unset and leave it to
490 * the caller to add it if necessary.
491 *
492 * String tables do not have a standard entsize, so
493 * we set it to 0.
494 */
495 SET_SEC_INFO(ELF_T_BYTE, 1, SHF_STRINGS, 0)
496 break;
497
498 case SHT_RELA:
499 /*
500 * Relocations with an addend (Everything except 32-bit X86).
501 * The caller is expected to set all section header flags.
502 */
503 SET_SEC_INFO_WORD_ALIGN(ELF_T_RELA, 0, sizeof (Rela))
504 break;
505
506 case SHT_REL:
507 /*
508 * Relocations without an addend (32-bit X86 only).
509 * The caller is expected to set all section header flags.
510 */
511 SET_SEC_INFO_WORD_ALIGN(ELF_T_REL, 0, sizeof (Rel))
512 break;
513
514 case SHT_HASH:
515 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, SHF_ALLOC, sizeof (Word))
516 break;
517
518 case SHT_SUNW_symsort:
519 case SHT_SUNW_tlssort:
520 ofl->ofl_flags |= FLG_OF_OSABI;
521 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, SHF_ALLOC, sizeof (Word))
522 break;
523
524 case SHT_DYNAMIC:
525 /*
526 * A dynamic section may or may not be allocable, and may or
527 * may not be writable, depending on context, so we leave the
528 * flags unset and leave it to the caller to add them if
529 * necessary.
530 */
531 SET_SEC_INFO_WORD_ALIGN(ELF_T_DYN, 0, sizeof (Dyn))
532 break;
533
534 case SHT_NOBITS:
535 /*
536 * SHT_NOBITS is used for BSS-type sections. The size and
537 * alignment depend on the specific use and must be adjusted
538 * by the caller.
539 */
540 SET_SEC_INFO(ELF_T_BYTE, 0, SHF_ALLOC | SHF_WRITE, 0)
541 break;
542
543 case SHT_INIT_ARRAY:
544 case SHT_FINI_ARRAY:
545 case SHT_PREINIT_ARRAY:
546 SET_SEC_INFO(ELF_T_ADDR, sizeof (Addr), SHF_ALLOC | SHF_WRITE,
547 sizeof (Addr))
548 break;
549
550 case SHT_SYMTAB_SHNDX:
551 /*
552 * Note that these sections are created to be associated
553 * with both symtab and dynsym symbol tables. However, they
554 * are non-allocable in all cases, because the runtime
555 * linker has no need for this information. It is purely
556 * informational, used by elfdump(1), debuggers, etc.
557 */
558 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, 0, sizeof (Word));
559 break;
560
561 case SHT_SUNW_cap:
562 ofl->ofl_flags |= FLG_OF_OSABI;
563 SET_SEC_INFO_WORD_ALIGN(ELF_T_CAP, SHF_ALLOC, sizeof (Cap));
564 break;
565
566 case SHT_SUNW_capchain:
567 ofl->ofl_flags |= FLG_OF_OSABI;
568 SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, SHF_ALLOC,
569 sizeof (Capchain));
570 break;
571
572 case SHT_SUNW_capinfo:
573 ofl->ofl_flags |= FLG_OF_OSABI;
574 #if _ELF64
575 SET_SEC_INFO(ELF_T_XWORD, sizeof (Xword), SHF_ALLOC,
576 sizeof (Capinfo));
577 #else
578 SET_SEC_INFO(ELF_T_WORD, sizeof (Word), SHF_ALLOC,
579 sizeof (Capinfo));
580 #endif
581 break;
582
583 case SHT_SUNW_move:
584 ofl->ofl_flags |= FLG_OF_OSABI;
585 SET_SEC_INFO(ELF_T_BYTE, sizeof (Lword),
586 SHF_ALLOC | SHF_WRITE, sizeof (Move));
587 break;
588
589 case SHT_SUNW_syminfo:
590 ofl->ofl_flags |= FLG_OF_OSABI;
591 /*
592 * The sh_info field of the SHT_*_syminfo section points
593 * to the header index of the associated .dynamic section,
594 * so we also set SHF_INFO_LINK.
595 */
596 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE,
597 SHF_ALLOC | SHF_INFO_LINK, sizeof (Syminfo));
598 break;
599
600 case SHT_SUNW_verneed:
601 case SHT_SUNW_verdef:
602 ofl->ofl_flags |= FLG_OF_OSABI;
603 /*
604 * The info for verneed and versym happen to be the same.
605 * The entries in these sections are not of uniform size,
606 * so we set the entsize to 0.
607 */
608 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, SHF_ALLOC, 0);
609 break;
610
611 case SHT_SUNW_versym:
612 ofl->ofl_flags |= FLG_OF_OSABI;
613 SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, SHF_ALLOC,
614 sizeof (Versym));
615 break;
616
617 default:
618 /* Should not happen: fcn called with unknown section type */
619 assert(0);
620 return (S_ERROR);
621 }
622 #undef SET_SEC_INFO
623 #undef SET_SEC_INFO_WORD_ALIGN
624
625 size = entcnt * sec_info->sh_entsize;
626
627 /*
628 * Allocate and initialize the Elf_Data structure.
629 */
630 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == NULL)
631 return (S_ERROR);
632 data->d_type = sec_info->d_type;
633 data->d_size = size;
634 data->d_align = sec_info->align;
635 data->d_version = ofl->ofl_dehdr->e_version;
636
637 /*
638 * Allocate and initialize the Shdr structure.
639 */
640 if ((shdr = libld_calloc(sizeof (Shdr), 1)) == NULL)
641 return (S_ERROR);
642 shdr->sh_type = shtype;
643 shdr->sh_size = size;
644 shdr->sh_flags = sec_info->sh_flags;
645 shdr->sh_addralign = sec_info->align;
646 shdr->sh_entsize = sec_info->sh_entsize;
647
648 /*
649 * Allocate and initialize the Is_desc structure.
650 */
651 if ((isec = libld_calloc(1, sizeof (Is_desc))) == NULL)
652 return (S_ERROR);
653 isec->is_name = shname;
654 isec->is_shdr = shdr;
655 isec->is_indata = data;
656
657
658 *ret_isec = isec;
659 *ret_shdr = shdr;
660 *ret_data = data;
661 return (1);
662 }
663
664 /*
665 * Use an existing input section as a template to create a new
666 * input section with the same values as the original, other than
667 * the size of the data area which is supplied by the caller.
668 *
669 * entry:
670 * ofl - Output file descriptor
671 * ifl - Input file section to use as a template
672 * size - Size of data area for new section
673 * ret_isec, ret_shdr, ret_data - Address of pointers to
674 * receive address of newly allocated structs.
675 *
676 * exit:
677 * On error, returns S_ERROR. On success, returns (1), and the
678 * ret_ pointers have been updated to point at the new structures,
679 * which have been filled in. To finish the task, the caller must
680 * update any fields within the supplied descriptors that differ
681 * from its needs, and then call ld_place_section().
682 */
683 static uintptr_t
new_section_from_template(Ofl_desc * ofl,Is_desc * tmpl_isp,size_t size,Is_desc ** ret_isec,Shdr ** ret_shdr,Elf_Data ** ret_data)684 new_section_from_template(Ofl_desc *ofl, Is_desc *tmpl_isp, size_t size,
685 Is_desc **ret_isec, Shdr **ret_shdr, Elf_Data **ret_data)
686 {
687 Shdr *shdr;
688 Elf_Data *data;
689 Is_desc *isec;
690
691 /*
692 * Allocate and initialize the Elf_Data structure.
693 */
694 if ((data = libld_calloc(sizeof (Elf_Data), 1)) == NULL)
695 return (S_ERROR);
696 data->d_type = tmpl_isp->is_indata->d_type;
697 data->d_size = size;
698 data->d_align = tmpl_isp->is_shdr->sh_addralign;
699 data->d_version = ofl->ofl_dehdr->e_version;
700
701 /*
702 * Allocate and initialize the Shdr structure.
703 */
704 if ((shdr = libld_malloc(sizeof (Shdr))) == NULL)
705 return (S_ERROR);
706 *shdr = *tmpl_isp->is_shdr;
707 shdr->sh_addr = 0;
708 shdr->sh_offset = 0;
709 shdr->sh_size = size;
710
711 /*
712 * Allocate and initialize the Is_desc structure.
713 */
714 if ((isec = libld_calloc(1, sizeof (Is_desc))) == NULL)
715 return (S_ERROR);
716 isec->is_name = tmpl_isp->is_name;
717 isec->is_shdr = shdr;
718 isec->is_indata = data;
719
720
721 *ret_isec = isec;
722 *ret_shdr = shdr;
723 *ret_data = data;
724 return (1);
725 }
726
727 /*
728 * Build a .bss section for allocation of tentative definitions. Any `static'
729 * .bss definitions would have been associated to their own .bss sections and
730 * thus collected from the input files. `global' .bss definitions are tagged
731 * as COMMON and do not cause any associated .bss section elements to be
732 * generated. Here we add up all these COMMON symbols and generate the .bss
733 * section required to represent them.
734 */
735 uintptr_t
ld_make_bss(Ofl_desc * ofl,Xword size,Xword align,uint_t ident)736 ld_make_bss(Ofl_desc *ofl, Xword size, Xword align, uint_t ident)
737 {
738 Shdr *shdr;
739 Elf_Data *data;
740 Is_desc *isec;
741 Os_desc *osp;
742 Xword rsize = (Xword)ofl->ofl_relocbsssz;
743
744 /*
745 * Allocate header structs. We will set the name ourselves below,
746 * and there is no entcnt for a BSS. So, the shname and entcnt
747 * arguments are 0.
748 */
749 if (new_section(ofl, SHT_NOBITS, NULL, 0,
750 &isec, &shdr, &data) == S_ERROR)
751 return (S_ERROR);
752
753 data->d_size = (size_t)size;
754 data->d_align = (size_t)align;
755
756 shdr->sh_size = size;
757 shdr->sh_addralign = align;
758
759 if (ident == ld_targ.t_id.id_tlsbss) {
760 isec->is_name = MSG_ORIG(MSG_SCN_TBSS);
761 ofl->ofl_istlsbss = isec;
762 shdr->sh_flags |= SHF_TLS;
763
764 } else if (ident == ld_targ.t_id.id_bss) {
765 isec->is_name = MSG_ORIG(MSG_SCN_BSS);
766 ofl->ofl_isbss = isec;
767
768 #if defined(_ELF64)
769 } else if ((ld_targ.t_m.m_mach == EM_AMD64) &&
770 (ident == ld_targ.t_id.id_lbss)) {
771 isec->is_name = MSG_ORIG(MSG_SCN_LBSS);
772 ofl->ofl_islbss = isec;
773 shdr->sh_flags |= SHF_AMD64_LARGE;
774 #endif
775 }
776
777 /*
778 * Retain this .*bss input section as this will be where global symbol
779 * references are added.
780 */
781 if ((osp = ld_place_section(ofl, isec, NULL, ident, NULL)) ==
782 (Os_desc *)S_ERROR)
783 return (S_ERROR);
784
785 /*
786 * If relocations exist against a .*bss section, a section symbol must
787 * be created for the section in the .dynsym symbol table.
788 */
789 if (!(osp->os_flags & FLG_OS_OUTREL)) {
790 ofl_flag_t flagtotest;
791
792 if (ident == ld_targ.t_id.id_tlsbss)
793 flagtotest = FLG_OF1_TLSOREL;
794 else
795 flagtotest = FLG_OF1_BSSOREL;
796
797 if (ofl->ofl_flags1 & flagtotest) {
798 ofl->ofl_dynshdrcnt++;
799 osp->os_flags |= FLG_OS_OUTREL;
800 }
801 }
802
803 osp->os_szoutrels = rsize;
804 return (1);
805 }
806
807 /*
808 * Build a SHT_{INIT|FINI|PREINIT}ARRAY section (specified via
809 * ld -z *array=name).
810 */
811 static uintptr_t
make_array(Ofl_desc * ofl,Word shtype,const char * sectname,APlist * alp)812 make_array(Ofl_desc *ofl, Word shtype, const char *sectname, APlist *alp)
813 {
814 uint_t entcount;
815 Aliste idx;
816 Elf_Data *data;
817 Is_desc *isec;
818 Shdr *shdr;
819 Sym_desc *sdp;
820 Rel_desc reld;
821 Rela reloc;
822 Os_desc *osp;
823 uintptr_t ret = 1;
824
825 if (alp == NULL)
826 return (1);
827
828 entcount = 0;
829 for (APLIST_TRAVERSE(alp, idx, sdp))
830 entcount++;
831
832 if (new_section(ofl, shtype, sectname, entcount, &isec, &shdr, &data) ==
833 S_ERROR)
834 return (S_ERROR);
835
836 if ((data->d_buf = libld_calloc(sizeof (Addr), entcount)) == NULL)
837 return (S_ERROR);
838
839 if (ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_array, NULL) ==
840 (Os_desc *)S_ERROR)
841 return (S_ERROR);
842
843 osp = isec->is_osdesc;
844
845 if ((ofl->ofl_osinitarray == NULL) && (shtype == SHT_INIT_ARRAY))
846 ofl->ofl_osinitarray = osp;
847 if ((ofl->ofl_ospreinitarray == NULL) && (shtype == SHT_PREINIT_ARRAY))
848 ofl->ofl_ospreinitarray = osp;
849 else if ((ofl->ofl_osfiniarray == NULL) && (shtype == SHT_FINI_ARRAY))
850 ofl->ofl_osfiniarray = osp;
851
852 /*
853 * Create relocations against this section to initialize it to the
854 * function addresses.
855 */
856 reld.rel_isdesc = isec;
857 reld.rel_aux = NULL;
858 reld.rel_flags = FLG_REL_LOAD;
859
860 /*
861 * Fabricate the relocation information (as if a relocation record had
862 * been input - see init_rel()).
863 */
864 reld.rel_rtype = ld_targ.t_m.m_r_arrayaddr;
865 reld.rel_roffset = 0;
866 reld.rel_raddend = 0;
867
868 /*
869 * Create a minimal relocation record to satisfy process_sym_reloc()
870 * debugging requirements.
871 */
872 reloc.r_offset = 0;
873 reloc.r_info = ELF_R_INFO(0, ld_targ.t_m.m_r_arrayaddr);
874 reloc.r_addend = 0;
875
876 DBG_CALL(Dbg_reloc_generate(ofl->ofl_lml, osp,
877 ld_targ.t_m.m_rel_sht_type));
878 for (APLIST_TRAVERSE(alp, idx, sdp)) {
879 reld.rel_sym = sdp;
880
881 if (ld_process_sym_reloc(ofl, &reld, (Rel *)&reloc, isec,
882 MSG_INTL(MSG_STR_COMMAND), 0) == S_ERROR) {
883 ret = S_ERROR;
884 continue;
885 }
886
887 reld.rel_roffset += (Xword)sizeof (Addr);
888 reloc.r_offset = reld.rel_roffset;
889 }
890
891 return (ret);
892 }
893
894 /*
895 * Build a comment section (-Qy option).
896 */
897 static uintptr_t
make_comment(Ofl_desc * ofl)898 make_comment(Ofl_desc *ofl)
899 {
900 Shdr *shdr;
901 Elf_Data *data;
902 Is_desc *isec;
903
904 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_COMMENT), 0,
905 &isec, &shdr, &data) == S_ERROR)
906 return (S_ERROR);
907
908 data->d_buf = (void *)ofl->ofl_sgsid;
909 data->d_size = strlen(ofl->ofl_sgsid) + 1;
910 data->d_align = 1;
911
912 shdr->sh_size = (Xword)data->d_size;
913 shdr->sh_flags = 0;
914 shdr->sh_addralign = 1;
915
916 return ((uintptr_t)ld_place_section(ofl, isec, NULL,
917 ld_targ.t_id.id_note, NULL));
918 }
919
920 /*
921 * Make the dynamic section. Calculate the size of any strings referenced
922 * within this structure, they will be added to the global string table
923 * (.dynstr). This routine should be called before make_dynstr().
924 *
925 * This routine must be maintained in parallel with update_odynamic()
926 * in update.c
927 */
928 static uintptr_t
make_dynamic(Ofl_desc * ofl)929 make_dynamic(Ofl_desc *ofl)
930 {
931 Shdr *shdr;
932 Os_desc *osp;
933 Elf_Data *data;
934 Is_desc *isec;
935 size_t cnt = 0;
936 Aliste idx;
937 Ifl_desc *ifl;
938 Sym_desc *sdp;
939 size_t size;
940 Str_tbl *strtbl;
941 ofl_flag_t flags = ofl->ofl_flags;
942 int not_relobj = !(flags & FLG_OF_RELOBJ);
943 int unused = 0;
944
945 /*
946 * Select the required string table.
947 */
948 if (OFL_IS_STATIC_OBJ(ofl))
949 strtbl = ofl->ofl_strtab;
950 else
951 strtbl = ofl->ofl_dynstrtab;
952
953 /*
954 * Only a limited subset of DT_ entries apply to relocatable
955 * objects. See the comment at the head of update_odynamic() in
956 * update.c for details.
957 */
958 if (new_section(ofl, SHT_DYNAMIC, MSG_ORIG(MSG_SCN_DYNAMIC), 0,
959 &isec, &shdr, &data) == S_ERROR)
960 return (S_ERROR);
961
962 /*
963 * new_section() does not set SHF_ALLOC. If we're building anything
964 * besides a relocatable object, then the .dynamic section should
965 * reside in allocatable memory.
966 */
967 if (not_relobj)
968 shdr->sh_flags |= SHF_ALLOC;
969
970 /*
971 * new_section() does not set SHF_WRITE. If we're building an object
972 * that specifies an interpretor, then a DT_DEBUG entry is created,
973 * which is initialized to the applications link-map list at runtime.
974 */
975 if (ofl->ofl_osinterp)
976 shdr->sh_flags |= SHF_WRITE;
977
978 osp = ofl->ofl_osdynamic =
979 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_dynamic, NULL);
980
981 /*
982 * Reserve entries for any needed dependencies.
983 */
984 for (APLIST_TRAVERSE(ofl->ofl_sos, idx, ifl)) {
985 if (!(ifl->ifl_flags & (FLG_IF_NEEDED | FLG_IF_NEEDSTR)))
986 continue;
987
988 /*
989 * If this dependency didn't satisfy any symbol references,
990 * generate a debugging diagnostic (ld(1) -Dunused can be used
991 * to display these). If this is a standard needed dependency,
992 * and -z ignore is in effect, drop the dependency. Explicitly
993 * defined dependencies (i.e., -N dep) don't get dropped, and
994 * are flagged as being required to simplify update_odynamic()
995 * processing.
996 */
997 if ((ifl->ifl_flags & FLG_IF_NEEDSTR) ||
998 ((ifl->ifl_flags & FLG_IF_DEPREQD) == 0)) {
999 if (unused++ == 0)
1000 DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD));
1001 DBG_CALL(Dbg_unused_file(ofl->ofl_lml, ifl->ifl_soname,
1002 (ifl->ifl_flags & FLG_IF_NEEDSTR), 0));
1003
1004 /*
1005 * Guidance: Remove unused dependency.
1006 *
1007 * If -z ignore is in effect, this warning is not
1008 * needed because we will quietly remove the unused
1009 * dependency.
1010 */
1011 if (OFL_GUIDANCE(ofl, FLG_OFG_NO_UNUSED) &&
1012 ((ifl->ifl_flags & FLG_IF_IGNORE) == 0))
1013 ld_eprintf(ofl, ERR_GUIDANCE,
1014 MSG_INTL(MSG_GUIDE_UNUSED),
1015 ifl->ifl_soname);
1016
1017 if (ifl->ifl_flags & FLG_IF_NEEDSTR)
1018 ifl->ifl_flags |= FLG_IF_DEPREQD;
1019 else if (ifl->ifl_flags & FLG_IF_IGNORE)
1020 continue;
1021 }
1022
1023 /*
1024 * If this object requires a DT_POSFLAG_1 entry, reserve it.
1025 */
1026 if ((ifl->ifl_flags & MSK_IF_POSFLAG1) && not_relobj)
1027 cnt++;
1028
1029 if (st_insert(strtbl, ifl->ifl_soname) == -1)
1030 return (S_ERROR);
1031 cnt++;
1032
1033 /*
1034 * If the needed entry contains the $ORIGIN token make sure
1035 * the associated DT_1_FLAGS entry is created.
1036 */
1037 if (strstr(ifl->ifl_soname, MSG_ORIG(MSG_STR_ORIGIN))) {
1038 ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
1039 ofl->ofl_dtflags |= DF_ORIGIN;
1040 }
1041 }
1042
1043 if (unused)
1044 DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD));
1045
1046 if (not_relobj) {
1047 /*
1048 * Reserve entries for any per-symbol auxiliary/filter strings.
1049 */
1050 cnt += alist_nitems(ofl->ofl_dtsfltrs);
1051
1052 /*
1053 * Reserve entries for _init() and _fini() section addresses.
1054 */
1055 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U),
1056 SYM_NOHASH, NULL, ofl)) != NULL) &&
1057 (sdp->sd_ref == REF_REL_NEED) &&
1058 (sdp->sd_sym->st_shndx != SHN_UNDEF)) {
1059 sdp->sd_flags |= FLG_SY_UPREQD;
1060 cnt++;
1061 }
1062 if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_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;
1067 cnt++;
1068 }
1069
1070 /*
1071 * Reserve entries for any soname, filter name (shared libs
1072 * only), run-path pointers, cache names and audit requirements.
1073 */
1074 if (ofl->ofl_soname) {
1075 cnt++;
1076 if (st_insert(strtbl, ofl->ofl_soname) == -1)
1077 return (S_ERROR);
1078 }
1079 if (ofl->ofl_filtees) {
1080 cnt++;
1081 if (st_insert(strtbl, ofl->ofl_filtees) == -1)
1082 return (S_ERROR);
1083
1084 /*
1085 * If the filtees entry contains the $ORIGIN token
1086 * make sure the associated DT_1_FLAGS entry is created.
1087 */
1088 if (strstr(ofl->ofl_filtees,
1089 MSG_ORIG(MSG_STR_ORIGIN))) {
1090 ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
1091 ofl->ofl_dtflags |= DF_ORIGIN;
1092 }
1093 }
1094 }
1095
1096 if (ofl->ofl_rpath) {
1097 cnt += 2; /* DT_RPATH & DT_RUNPATH */
1098 if (st_insert(strtbl, ofl->ofl_rpath) == -1)
1099 return (S_ERROR);
1100
1101 /*
1102 * If the rpath entry contains the $ORIGIN token make sure
1103 * the associated DT_1_FLAGS entry is created.
1104 */
1105 if (strstr(ofl->ofl_rpath, MSG_ORIG(MSG_STR_ORIGIN))) {
1106 ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
1107 ofl->ofl_dtflags |= DF_ORIGIN;
1108 }
1109 }
1110
1111 if (not_relobj) {
1112 Aliste idx;
1113 Sg_desc *sgp;
1114
1115 if (ofl->ofl_config) {
1116 cnt++;
1117 if (st_insert(strtbl, ofl->ofl_config) == -1)
1118 return (S_ERROR);
1119
1120 /*
1121 * If the config entry contains the $ORIGIN token
1122 * make sure the associated DT_1_FLAGS entry is created.
1123 */
1124 if (strstr(ofl->ofl_config, MSG_ORIG(MSG_STR_ORIGIN))) {
1125 ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
1126 ofl->ofl_dtflags |= DF_ORIGIN;
1127 }
1128 }
1129 if (ofl->ofl_depaudit) {
1130 cnt++;
1131 if (st_insert(strtbl, ofl->ofl_depaudit) == -1)
1132 return (S_ERROR);
1133 }
1134 if (ofl->ofl_audit) {
1135 cnt++;
1136 if (st_insert(strtbl, ofl->ofl_audit) == -1)
1137 return (S_ERROR);
1138 }
1139
1140 /*
1141 * Reserve entries for the DT_HASH, DT_STRTAB, DT_STRSZ,
1142 * DT_SYMTAB, DT_SYMENT, and DT_CHECKSUM.
1143 */
1144 cnt += 6;
1145
1146 /*
1147 * If we are including local functions at the head of
1148 * the dynsym, then also reserve entries for DT_SUNW_SYMTAB
1149 * and DT_SUNW_SYMSZ.
1150 */
1151 if (OFL_ALLOW_LDYNSYM(ofl))
1152 cnt += 2;
1153
1154 if ((ofl->ofl_dynsymsortcnt > 0) ||
1155 (ofl->ofl_dyntlssortcnt > 0))
1156 cnt++; /* DT_SUNW_SORTENT */
1157
1158 if (ofl->ofl_dynsymsortcnt > 0)
1159 cnt += 2; /* DT_SUNW_[SYMSORT|SYMSORTSZ] */
1160
1161 if (ofl->ofl_dyntlssortcnt > 0)
1162 cnt += 2; /* DT_SUNW_[TLSSORT|TLSSORTSZ] */
1163
1164 if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) ==
1165 FLG_OF_VERDEF)
1166 cnt += 2; /* DT_VERDEF & DT_VERDEFNUM */
1167
1168 if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) ==
1169 FLG_OF_VERNEED)
1170 cnt += 2; /* DT_VERNEED & DT_VERNEEDNUM */
1171
1172 if ((flags & FLG_OF_COMREL) && ofl->ofl_relocrelcnt)
1173 cnt++; /* DT_RELACOUNT */
1174
1175 if (flags & FLG_OF_TEXTREL) /* DT_TEXTREL */
1176 cnt++;
1177
1178 if (ofl->ofl_osfiniarray) /* DT_FINI_ARRAY */
1179 cnt += 2; /* DT_FINI_ARRAYSZ */
1180
1181 if (ofl->ofl_osinitarray) /* DT_INIT_ARRAY */
1182 cnt += 2; /* DT_INIT_ARRAYSZ */
1183
1184 if (ofl->ofl_ospreinitarray) /* DT_PREINIT_ARRAY & */
1185 cnt += 2; /* DT_PREINIT_ARRAYSZ */
1186
1187 /*
1188 * If we have plt's reserve a DT_PLTRELSZ, DT_PLTREL and
1189 * DT_JMPREL.
1190 */
1191 if (ofl->ofl_pltcnt)
1192 cnt += 3;
1193
1194 /*
1195 * If plt padding is needed (Sparcv9).
1196 */
1197 if (ofl->ofl_pltpad)
1198 cnt += 2; /* DT_PLTPAD & DT_PLTPADSZ */
1199
1200 /*
1201 * If we have any relocations reserve a DT_REL, DT_RELSZ and
1202 * DT_RELENT entry.
1203 */
1204 if (ofl->ofl_relocsz)
1205 cnt += 3;
1206
1207 /*
1208 * If a syminfo section is required create DT_SYMINFO,
1209 * DT_SYMINSZ, and DT_SYMINENT entries.
1210 */
1211 if (flags & FLG_OF_SYMINFO)
1212 cnt += 3;
1213
1214 /*
1215 * If there are any partially initialized sections allocate
1216 * DT_MOVETAB, DT_MOVESZ and DT_MOVEENT.
1217 */
1218 if (ofl->ofl_osmove)
1219 cnt += 3;
1220
1221 /*
1222 * Allocate one DT_REGISTER entry for every register symbol.
1223 */
1224 cnt += ofl->ofl_regsymcnt;
1225
1226 /*
1227 * Reserve a entry for each '-zrtldinfo=...' specified
1228 * on the command line.
1229 */
1230 for (APLIST_TRAVERSE(ofl->ofl_rtldinfo, idx, sdp))
1231 cnt++;
1232
1233 /*
1234 * The following entry should only be placed in a segment that
1235 * is writable.
1236 */
1237 if (((sgp = osp->os_sgdesc) != NULL) &&
1238 (sgp->sg_phdr.p_flags & PF_W) && ofl->ofl_osinterp)
1239 cnt++; /* DT_DEBUG */
1240
1241 /*
1242 * Capabilities require a .dynamic entry for the .SUNW_cap
1243 * section.
1244 */
1245 if (ofl->ofl_oscap)
1246 cnt++; /* DT_SUNW_CAP */
1247
1248 /*
1249 * Symbol capabilities require a .dynamic entry for the
1250 * .SUNW_capinfo section.
1251 */
1252 if (ofl->ofl_oscapinfo)
1253 cnt++; /* DT_SUNW_CAPINFO */
1254
1255 /*
1256 * Capabilities chain information requires a .SUNW_capchain
1257 * entry (DT_SUNW_CAPCHAIN), entry size (DT_SUNW_CAPCHAINENT),
1258 * and total size (DT_SUNW_CAPCHAINSZ).
1259 */
1260 if (ofl->ofl_oscapchain)
1261 cnt += 3;
1262
1263 if (flags & FLG_OF_SYMBOLIC)
1264 cnt++; /* DT_SYMBOLIC */
1265 }
1266
1267 /*
1268 * Account for Architecture dependent .dynamic entries, and defaults.
1269 */
1270 (*ld_targ.t_mr.mr_mach_make_dynamic)(ofl, &cnt);
1271
1272 /*
1273 * DT_FLAGS, DT_FLAGS_1, DT_SUNW_STRPAD, and DT_NULL. Also,
1274 * allow room for the unused extra DT_NULLs. These are included
1275 * to allow an ELF editor room to add items later.
1276 */
1277 cnt += 4 + DYNAMIC_EXTRA_ELTS;
1278
1279 /*
1280 * DT_SUNW_LDMACH. Used to hold the ELF machine code of the
1281 * linker that produced the output object. This information
1282 * allows us to determine whether a given object was linked
1283 * natively, or by a linker running on a different type of
1284 * system. This information can be valuable if one suspects
1285 * that a problem might be due to alignment or byte order issues.
1286 */
1287 cnt++;
1288
1289 /*
1290 * Determine the size of the section from the number of entries.
1291 */
1292 size = cnt * (size_t)shdr->sh_entsize;
1293
1294 shdr->sh_size = (Xword)size;
1295 data->d_size = size;
1296
1297 /*
1298 * There are several tags that are specific to the Solaris osabi
1299 * range which we unconditionally put into any dynamic section
1300 * we create (e.g. DT_SUNW_STRPAD or DT_SUNW_LDMACH). As such,
1301 * any Solaris object with a dynamic section should be tagged as
1302 * ELFOSABI_SOLARIS.
1303 */
1304 ofl->ofl_flags |= FLG_OF_OSABI;
1305
1306 return ((uintptr_t)ofl->ofl_osdynamic);
1307 }
1308
1309 /*
1310 * Build the GOT section and its associated relocation entries.
1311 */
1312 uintptr_t
ld_make_got(Ofl_desc * ofl)1313 ld_make_got(Ofl_desc *ofl)
1314 {
1315 Elf_Data *data;
1316 Shdr *shdr;
1317 Is_desc *isec;
1318 size_t size = (size_t)ofl->ofl_gotcnt * ld_targ.t_m.m_got_entsize;
1319 size_t rsize = (size_t)ofl->ofl_relocgotsz;
1320
1321 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_GOT), 0,
1322 &isec, &shdr, &data) == S_ERROR)
1323 return (S_ERROR);
1324
1325 data->d_size = size;
1326
1327 shdr->sh_flags |= SHF_WRITE;
1328 shdr->sh_size = (Xword)size;
1329 shdr->sh_entsize = ld_targ.t_m.m_got_entsize;
1330
1331 ofl->ofl_osgot = ld_place_section(ofl, isec, NULL,
1332 ld_targ.t_id.id_got, NULL);
1333 if (ofl->ofl_osgot == (Os_desc *)S_ERROR)
1334 return (S_ERROR);
1335
1336 ofl->ofl_osgot->os_szoutrels = (Xword)rsize;
1337
1338 return (1);
1339 }
1340
1341 /*
1342 * Build an interpreter section.
1343 */
1344 static uintptr_t
make_interp(Ofl_desc * ofl)1345 make_interp(Ofl_desc *ofl)
1346 {
1347 Shdr *shdr;
1348 Elf_Data *data;
1349 Is_desc *isec;
1350 const char *iname = ofl->ofl_interp;
1351 size_t size;
1352
1353 /*
1354 * If -z nointerp is in effect, don't create an interpreter section.
1355 */
1356 if (ofl->ofl_flags1 & FLG_OF1_NOINTRP)
1357 return (1);
1358
1359 /*
1360 * An .interp section is always created for a dynamic executable.
1361 * A user can define the interpreter to use. This definition overrides
1362 * the default that would be recorded in an executable, and triggers
1363 * the creation of an .interp section in any other object. Presumably
1364 * the user knows what they are doing. Refer to the generic ELF ABI
1365 * section 5-4, and the ld(1) -I option.
1366 */
1367 if (((ofl->ofl_flags & (FLG_OF_DYNAMIC | FLG_OF_EXEC |
1368 FLG_OF_RELOBJ)) != (FLG_OF_DYNAMIC | FLG_OF_EXEC)) && !iname)
1369 return (1);
1370
1371 /*
1372 * In the case of a dynamic executable, supply a default interpreter
1373 * if the user has not specified their own.
1374 */
1375 if (iname == NULL)
1376 iname = ofl->ofl_interp = ld_targ.t_m.m_def_interp;
1377
1378 size = strlen(iname) + 1;
1379
1380 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_INTERP), 0,
1381 &isec, &shdr, &data) == S_ERROR)
1382 return (S_ERROR);
1383
1384 data->d_size = size;
1385 shdr->sh_size = (Xword)size;
1386 data->d_align = shdr->sh_addralign = 1;
1387
1388 ofl->ofl_osinterp =
1389 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_interp, NULL);
1390 return ((uintptr_t)ofl->ofl_osinterp);
1391 }
1392
1393 /*
1394 * Common function used to build the SHT_SUNW_versym section, SHT_SUNW_syminfo
1395 * section, and SHT_SUNW_capinfo section. Each of these sections provide
1396 * additional symbol information, and their size parallels the associated
1397 * symbol table.
1398 */
1399 static Os_desc *
make_sym_sec(Ofl_desc * ofl,const char * sectname,Word stype,int ident)1400 make_sym_sec(Ofl_desc *ofl, const char *sectname, Word stype, int ident)
1401 {
1402 Shdr *shdr;
1403 Elf_Data *data;
1404 Is_desc *isec;
1405
1406 /*
1407 * We don't know the size of this section yet, so set it to 0. The
1408 * size gets filled in after the associated symbol table is sized.
1409 */
1410 if (new_section(ofl, stype, sectname, 0, &isec, &shdr, &data) ==
1411 S_ERROR)
1412 return ((Os_desc *)S_ERROR);
1413
1414 return (ld_place_section(ofl, isec, NULL, ident, NULL));
1415 }
1416
1417 /*
1418 * Determine whether a symbol capability is redundant because the object
1419 * capabilities are more restrictive.
1420 */
1421 inline static int
is_cap_redundant(Objcapset * ocapset,Objcapset * scapset)1422 is_cap_redundant(Objcapset *ocapset, Objcapset *scapset)
1423 {
1424 Alist *oalp, *salp;
1425 elfcap_mask_t omsk, smsk;
1426
1427 /*
1428 * Inspect any platform capabilities. If the object defines platform
1429 * capabilities, then the object will only be loaded for those
1430 * platforms. A symbol capability set that doesn't define the same
1431 * platforms is redundant, and a symbol capability that does not provide
1432 * at least one platform name that matches a platform name in the object
1433 * capabilities will never execute (as the object wouldn't have been
1434 * loaded).
1435 */
1436 oalp = ocapset->oc_plat.cl_val;
1437 salp = scapset->oc_plat.cl_val;
1438 if (oalp && ((salp == NULL) || cap_names_match(oalp, salp)))
1439 return (1);
1440
1441 /*
1442 * If the symbol capability set defines platforms, and the object
1443 * doesn't, then the symbol set is more restrictive.
1444 */
1445 if (salp && (oalp == NULL))
1446 return (0);
1447
1448 /*
1449 * Next, inspect any machine name capabilities. If the object defines
1450 * machine name capabilities, then the object will only be loaded for
1451 * those machines. A symbol capability set that doesn't define the same
1452 * machine names is redundant, and a symbol capability that does not
1453 * provide at least one machine name that matches a machine name in the
1454 * object capabilities will never execute (as the object wouldn't have
1455 * been loaded).
1456 */
1457 oalp = ocapset->oc_plat.cl_val;
1458 salp = scapset->oc_plat.cl_val;
1459 if (oalp && ((salp == NULL) || cap_names_match(oalp, salp)))
1460 return (1);
1461
1462 /*
1463 * If the symbol capability set defines machine names, and the object
1464 * doesn't, then the symbol set is more restrictive.
1465 */
1466 if (salp && (oalp == NULL))
1467 return (0);
1468
1469 /*
1470 * Next, inspect any hardware capabilities. If the objects hardware
1471 * capabilities are greater than or equal to that of the symbols
1472 * capabilities, then the symbol capability set is redundant. If the
1473 * symbols hardware capabilities are greater that the objects, then the
1474 * symbol set is more restrictive.
1475 *
1476 * Note that this is a somewhat arbitrary definition, as each capability
1477 * bit is independent of the others, and some of the higher order bits
1478 * could be considered to be less important than lower ones. However,
1479 * this is the only reasonable non-subjective definition.
1480 */
1481 omsk = ocapset->oc_hw_2.cm_val;
1482 smsk = scapset->oc_hw_2.cm_val;
1483 if ((omsk > smsk) || (omsk && (omsk == smsk)))
1484 return (1);
1485 if (omsk < smsk)
1486 return (0);
1487
1488 /*
1489 * Finally, inspect the remaining hardware capabilities.
1490 */
1491 omsk = ocapset->oc_hw_1.cm_val;
1492 smsk = scapset->oc_hw_1.cm_val;
1493 if ((omsk > smsk) || (omsk && (omsk == smsk)))
1494 return (1);
1495
1496 return (0);
1497 }
1498
1499 /*
1500 * Capabilities values might have been assigned excluded values. These
1501 * excluded values should be removed before calculating any capabilities
1502 * sections size.
1503 */
1504 static void
capmask_value(Lm_list * lml,Word type,Capmask * capmask,int * title)1505 capmask_value(Lm_list *lml, Word type, Capmask *capmask, int *title)
1506 {
1507 /*
1508 * First determine whether any bits should be excluded.
1509 */
1510 if ((capmask->cm_val & capmask->cm_exc) == 0)
1511 return;
1512
1513 DBG_CALL(Dbg_cap_post_title(lml, title));
1514
1515 DBG_CALL(Dbg_cap_val_entry(lml, DBG_STATE_CURRENT, type,
1516 capmask->cm_val, ld_targ.t_m.m_mach));
1517 DBG_CALL(Dbg_cap_val_entry(lml, DBG_STATE_EXCLUDE, type,
1518 capmask->cm_exc, ld_targ.t_m.m_mach));
1519
1520 capmask->cm_val &= ~capmask->cm_exc;
1521
1522 DBG_CALL(Dbg_cap_val_entry(lml, DBG_STATE_RESOLVED, type,
1523 capmask->cm_val, ld_targ.t_m.m_mach));
1524 }
1525
1526 static void
capstr_value(Lm_list * lml,Word type,Caplist * caplist,int * title)1527 capstr_value(Lm_list *lml, Word type, Caplist *caplist, int *title)
1528 {
1529 Aliste idx1, idx2;
1530 char *estr;
1531 Capstr *capstr;
1532 Boolean found = FALSE;
1533
1534 /*
1535 * First determine whether any strings should be excluded.
1536 */
1537 for (APLIST_TRAVERSE(caplist->cl_exc, idx1, estr)) {
1538 for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
1539 if (strcmp(estr, capstr->cs_str) == 0) {
1540 found = TRUE;
1541 break;
1542 }
1543 }
1544 }
1545
1546 if (found == FALSE)
1547 return;
1548
1549 /*
1550 * Traverse the current strings, then delete the excluded strings,
1551 * and finally display the resolved strings.
1552 */
1553 if (DBG_ENABLED) {
1554 Dbg_cap_post_title(lml, title);
1555 for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
1556 Dbg_cap_ptr_entry(lml, DBG_STATE_CURRENT, type,
1557 capstr->cs_str);
1558 }
1559 }
1560 for (APLIST_TRAVERSE(caplist->cl_exc, idx1, estr)) {
1561 for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
1562 if (strcmp(estr, capstr->cs_str) == 0) {
1563 DBG_CALL(Dbg_cap_ptr_entry(lml,
1564 DBG_STATE_EXCLUDE, type, capstr->cs_str));
1565 alist_delete(caplist->cl_val, &idx2);
1566 break;
1567 }
1568 }
1569 }
1570 if (DBG_ENABLED) {
1571 for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
1572 Dbg_cap_ptr_entry(lml, DBG_STATE_RESOLVED, type,
1573 capstr->cs_str);
1574 }
1575 }
1576 }
1577
1578 /*
1579 * Build a capabilities section.
1580 */
1581 #define CAP_UPDATE(cap, capndx, tag, val) \
1582 cap->c_tag = tag; \
1583 cap->c_un.c_val = val; \
1584 cap++, capndx++;
1585
1586 static uintptr_t
make_cap(Ofl_desc * ofl,Word shtype,const char * shname,int ident)1587 make_cap(Ofl_desc *ofl, Word shtype, const char *shname, int ident)
1588 {
1589 Shdr *shdr;
1590 Elf_Data *data;
1591 Is_desc *isec;
1592 Cap *cap;
1593 size_t size = 0;
1594 Word capndx = 0;
1595 Str_tbl *strtbl;
1596 Objcapset *ocapset = &ofl->ofl_ocapset;
1597 Aliste idx1;
1598 Capstr *capstr;
1599 int title = 0;
1600
1601 /*
1602 * Determine which string table to use for any CA_SUNW_MACH,
1603 * CA_SUNW_PLAT, or CA_SUNW_ID strings.
1604 */
1605 if (OFL_IS_STATIC_OBJ(ofl))
1606 strtbl = ofl->ofl_strtab;
1607 else
1608 strtbl = ofl->ofl_dynstrtab;
1609
1610 /*
1611 * If symbol capabilities have been requested, but none have been
1612 * created, warn the user. This scenario can occur if none of the
1613 * input relocatable objects defined any object capabilities.
1614 */
1615 if ((ofl->ofl_flags & FLG_OF_OTOSCAP) && (ofl->ofl_capsymcnt == 0))
1616 ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_CAP_NOSYMSFOUND));
1617
1618 /*
1619 * If symbol capabilities have been collected, but no symbols are left
1620 * referencing these capabilities, promote the capability groups back
1621 * to an object capability definition.
1622 */
1623 if ((ofl->ofl_flags & FLG_OF_OTOSCAP) && ofl->ofl_capsymcnt &&
1624 (ofl->ofl_capfamilies == NULL)) {
1625 ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_CAP_NOSYMSFOUND));
1626 ld_cap_move_symtoobj(ofl);
1627 ofl->ofl_capsymcnt = 0;
1628 ofl->ofl_capgroups = NULL;
1629 ofl->ofl_flags &= ~FLG_OF_OTOSCAP;
1630 }
1631
1632 /*
1633 * Remove any excluded capabilities.
1634 */
1635 capstr_value(ofl->ofl_lml, CA_SUNW_PLAT, &ocapset->oc_plat, &title);
1636 capstr_value(ofl->ofl_lml, CA_SUNW_MACH, &ocapset->oc_mach, &title);
1637 capmask_value(ofl->ofl_lml, CA_SUNW_HW_2, &ocapset->oc_hw_2, &title);
1638 capmask_value(ofl->ofl_lml, CA_SUNW_HW_1, &ocapset->oc_hw_1, &title);
1639 capmask_value(ofl->ofl_lml, CA_SUNW_SF_1, &ocapset->oc_sf_1, &title);
1640
1641 /*
1642 * Determine how many entries are required for any object capabilities.
1643 */
1644 size += alist_nitems(ocapset->oc_plat.cl_val);
1645 size += alist_nitems(ocapset->oc_mach.cl_val);
1646 if (ocapset->oc_hw_2.cm_val)
1647 size++;
1648 if (ocapset->oc_hw_1.cm_val)
1649 size++;
1650 if (ocapset->oc_sf_1.cm_val)
1651 size++;
1652
1653 /*
1654 * Only identify a capabilities group if the group has content. If a
1655 * capabilities identifier exists, and no other capabilities have been
1656 * supplied, remove the identifier. This scenario could exist if a
1657 * user mistakenly defined a lone identifier, or if an identified group
1658 * was overridden so as to clear the existing capabilities and the
1659 * identifier was not also cleared.
1660 */
1661 if (ocapset->oc_id.cs_str) {
1662 if (size)
1663 size++;
1664 else
1665 ocapset->oc_id.cs_str = NULL;
1666 }
1667 if (size)
1668 size++; /* Add CA_SUNW_NULL */
1669
1670 /*
1671 * Determine how many entries are required for any symbol capabilities.
1672 */
1673 if (ofl->ofl_capsymcnt) {
1674 /*
1675 * If there are no object capabilities, a CA_SUNW_NULL entry
1676 * is required before any symbol capabilities.
1677 */
1678 if (size == 0)
1679 size++;
1680 size += ofl->ofl_capsymcnt;
1681 }
1682
1683 if (size == 0)
1684 return (NULL);
1685
1686 if (new_section(ofl, shtype, shname, size, &isec,
1687 &shdr, &data) == S_ERROR)
1688 return (S_ERROR);
1689
1690 if ((data->d_buf = libld_malloc(shdr->sh_size)) == NULL)
1691 return (S_ERROR);
1692
1693 cap = (Cap *)data->d_buf;
1694
1695 /*
1696 * Fill in any object capabilities. If there is an identifier, then the
1697 * identifier comes first. The remaining items follow in precedence
1698 * order, although the order isn't important for runtime verification.
1699 */
1700 if (ocapset->oc_id.cs_str) {
1701 ofl->ofl_flags |= FLG_OF_CAPSTRS;
1702 if (st_insert(strtbl, ocapset->oc_id.cs_str) == -1)
1703 return (S_ERROR);
1704 ocapset->oc_id.cs_ndx = capndx;
1705 CAP_UPDATE(cap, capndx, CA_SUNW_ID, 0);
1706 }
1707 if (ocapset->oc_plat.cl_val) {
1708 ofl->ofl_flags |= (FLG_OF_PTCAP | FLG_OF_CAPSTRS);
1709
1710 /*
1711 * Insert any platform name strings in the appropriate string
1712 * table. The capability value can't be filled in yet, as the
1713 * final offset of the strings isn't known until later.
1714 */
1715 for (ALIST_TRAVERSE(ocapset->oc_plat.cl_val, idx1, capstr)) {
1716 if (st_insert(strtbl, capstr->cs_str) == -1)
1717 return (S_ERROR);
1718 capstr->cs_ndx = capndx;
1719 CAP_UPDATE(cap, capndx, CA_SUNW_PLAT, 0);
1720 }
1721 }
1722 if (ocapset->oc_mach.cl_val) {
1723 ofl->ofl_flags |= (FLG_OF_PTCAP | FLG_OF_CAPSTRS);
1724
1725 /*
1726 * Insert the machine name strings in the appropriate string
1727 * table. The capability value can't be filled in yet, as the
1728 * final offset of the strings isn't known until later.
1729 */
1730 for (ALIST_TRAVERSE(ocapset->oc_mach.cl_val, idx1, capstr)) {
1731 if (st_insert(strtbl, capstr->cs_str) == -1)
1732 return (S_ERROR);
1733 capstr->cs_ndx = capndx;
1734 CAP_UPDATE(cap, capndx, CA_SUNW_MACH, 0);
1735 }
1736 }
1737 if (ocapset->oc_hw_2.cm_val) {
1738 ofl->ofl_flags |= FLG_OF_PTCAP;
1739 CAP_UPDATE(cap, capndx, CA_SUNW_HW_2, ocapset->oc_hw_2.cm_val);
1740 }
1741 if (ocapset->oc_hw_1.cm_val) {
1742 ofl->ofl_flags |= FLG_OF_PTCAP;
1743 CAP_UPDATE(cap, capndx, CA_SUNW_HW_1, ocapset->oc_hw_1.cm_val);
1744 }
1745 if (ocapset->oc_sf_1.cm_val) {
1746 ofl->ofl_flags |= FLG_OF_PTCAP;
1747 CAP_UPDATE(cap, capndx, CA_SUNW_SF_1, ocapset->oc_sf_1.cm_val);
1748 }
1749 CAP_UPDATE(cap, capndx, CA_SUNW_NULL, 0);
1750
1751 /*
1752 * Fill in any symbol capabilities.
1753 */
1754 if (ofl->ofl_capgroups) {
1755 Cap_group *cgp;
1756
1757 for (APLIST_TRAVERSE(ofl->ofl_capgroups, idx1, cgp)) {
1758 Objcapset *scapset = &cgp->cg_set;
1759 Aliste idx2;
1760 Is_desc *isp;
1761
1762 cgp->cg_ndx = capndx;
1763
1764 if (scapset->oc_id.cs_str) {
1765 ofl->ofl_flags |= FLG_OF_CAPSTRS;
1766 /*
1767 * Insert the identifier string in the
1768 * appropriate string table. The capability
1769 * value can't be filled in yet, as the final
1770 * offset of the string isn't known until later.
1771 */
1772 if (st_insert(strtbl,
1773 scapset->oc_id.cs_str) == -1)
1774 return (S_ERROR);
1775 scapset->oc_id.cs_ndx = capndx;
1776 CAP_UPDATE(cap, capndx, CA_SUNW_ID, 0);
1777 }
1778
1779 if (scapset->oc_plat.cl_val) {
1780 ofl->ofl_flags |= FLG_OF_CAPSTRS;
1781
1782 /*
1783 * Insert the platform name string in the
1784 * appropriate string table. The capability
1785 * value can't be filled in yet, as the final
1786 * offset of the string isn't known until later.
1787 */
1788 for (ALIST_TRAVERSE(scapset->oc_plat.cl_val,
1789 idx2, capstr)) {
1790 if (st_insert(strtbl,
1791 capstr->cs_str) == -1)
1792 return (S_ERROR);
1793 capstr->cs_ndx = capndx;
1794 CAP_UPDATE(cap, capndx,
1795 CA_SUNW_PLAT, 0);
1796 }
1797 }
1798 if (scapset->oc_mach.cl_val) {
1799 ofl->ofl_flags |= FLG_OF_CAPSTRS;
1800
1801 /*
1802 * Insert the machine name string in the
1803 * appropriate string table. The capability
1804 * value can't be filled in yet, as the final
1805 * offset of the string isn't known until later.
1806 */
1807 for (ALIST_TRAVERSE(scapset->oc_mach.cl_val,
1808 idx2, capstr)) {
1809 if (st_insert(strtbl,
1810 capstr->cs_str) == -1)
1811 return (S_ERROR);
1812 capstr->cs_ndx = capndx;
1813 CAP_UPDATE(cap, capndx,
1814 CA_SUNW_MACH, 0);
1815 }
1816 }
1817 if (scapset->oc_hw_2.cm_val) {
1818 CAP_UPDATE(cap, capndx, CA_SUNW_HW_2,
1819 scapset->oc_hw_2.cm_val);
1820 }
1821 if (scapset->oc_hw_1.cm_val) {
1822 CAP_UPDATE(cap, capndx, CA_SUNW_HW_1,
1823 scapset->oc_hw_1.cm_val);
1824 }
1825 if (scapset->oc_sf_1.cm_val) {
1826 CAP_UPDATE(cap, capndx, CA_SUNW_SF_1,
1827 scapset->oc_sf_1.cm_val);
1828 }
1829 CAP_UPDATE(cap, capndx, CA_SUNW_NULL, 0);
1830
1831 /*
1832 * If any object capabilities are available, determine
1833 * whether these symbol capabilities are less
1834 * restrictive, and hence redundant.
1835 */
1836 if (((ofl->ofl_flags & FLG_OF_PTCAP) == 0) ||
1837 (is_cap_redundant(ocapset, scapset) == 0))
1838 continue;
1839
1840 /*
1841 * Indicate any files that provide redundant symbol
1842 * capabilities.
1843 */
1844 for (APLIST_TRAVERSE(cgp->cg_secs, idx2, isp)) {
1845 ld_eprintf(ofl, ERR_WARNING,
1846 MSG_INTL(MSG_CAP_REDUNDANT),
1847 isp->is_file->ifl_name,
1848 EC_WORD(isp->is_scnndx), isp->is_name);
1849 }
1850 }
1851 }
1852
1853 /*
1854 * If capabilities strings are required, the sh_info field of the
1855 * section header will be set to the associated string table.
1856 */
1857 if (ofl->ofl_flags & FLG_OF_CAPSTRS)
1858 shdr->sh_flags |= SHF_INFO_LINK;
1859
1860 /*
1861 * Place these capabilities in the output file.
1862 */
1863 if ((ofl->ofl_oscap = ld_place_section(ofl, isec,
1864 NULL, ident, NULL)) == (Os_desc *)S_ERROR)
1865 return (S_ERROR);
1866
1867 /*
1868 * If symbol capabilities are required, then a .SUNW_capinfo section is
1869 * also created. This table will eventually be sized to match the
1870 * associated symbol table.
1871 */
1872 if (ofl->ofl_capfamilies) {
1873 if ((ofl->ofl_oscapinfo = make_sym_sec(ofl,
1874 MSG_ORIG(MSG_SCN_SUNWCAPINFO), SHT_SUNW_capinfo,
1875 ld_targ.t_id.id_capinfo)) == (Os_desc *)S_ERROR)
1876 return (S_ERROR);
1877
1878 /*
1879 * If we're generating a dynamic object, capabilities family
1880 * members are maintained in a .SUNW_capchain section.
1881 */
1882 if (ofl->ofl_capchaincnt &&
1883 ((ofl->ofl_flags & FLG_OF_RELOBJ) == 0)) {
1884 if (new_section(ofl, SHT_SUNW_capchain,
1885 MSG_ORIG(MSG_SCN_SUNWCAPCHAIN),
1886 ofl->ofl_capchaincnt, &isec, &shdr,
1887 &data) == S_ERROR)
1888 return (S_ERROR);
1889
1890 ofl->ofl_oscapchain = ld_place_section(ofl, isec,
1891 NULL, ld_targ.t_id.id_capchain, NULL);
1892 if (ofl->ofl_oscapchain == (Os_desc *)S_ERROR)
1893 return (S_ERROR);
1894
1895 }
1896 }
1897 return (1);
1898 }
1899 #undef CAP_UPDATE
1900
1901 /*
1902 * Build the PLT section and its associated relocation entries.
1903 */
1904 static uintptr_t
make_plt(Ofl_desc * ofl)1905 make_plt(Ofl_desc *ofl)
1906 {
1907 Shdr *shdr;
1908 Elf_Data *data;
1909 Is_desc *isec;
1910 size_t size = ld_targ.t_m.m_plt_reservsz +
1911 (((size_t)ofl->ofl_pltcnt + (size_t)ofl->ofl_pltpad) *
1912 ld_targ.t_m.m_plt_entsize);
1913 size_t rsize = (size_t)ofl->ofl_relocpltsz;
1914
1915 /*
1916 * On sparc, account for the NOP at the end of the plt.
1917 */
1918 if (ld_targ.t_m.m_mach == LD_TARG_BYCLASS(EM_SPARC, EM_SPARCV9))
1919 size += sizeof (Word);
1920
1921 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_PLT), 0,
1922 &isec, &shdr, &data) == S_ERROR)
1923 return (S_ERROR);
1924
1925 data->d_size = size;
1926 data->d_align = ld_targ.t_m.m_plt_align;
1927
1928 shdr->sh_flags = ld_targ.t_m.m_plt_shf_flags;
1929 shdr->sh_size = (Xword)size;
1930 shdr->sh_addralign = ld_targ.t_m.m_plt_align;
1931 shdr->sh_entsize = ld_targ.t_m.m_plt_entsize;
1932
1933 ofl->ofl_osplt = ld_place_section(ofl, isec, NULL,
1934 ld_targ.t_id.id_plt, NULL);
1935 if (ofl->ofl_osplt == (Os_desc *)S_ERROR)
1936 return (S_ERROR);
1937
1938 ofl->ofl_osplt->os_szoutrels = (Xword)rsize;
1939
1940 return (1);
1941 }
1942
1943 /*
1944 * Make the hash table. Only built for dynamic executables and shared
1945 * libraries, and provides hashed lookup into the global symbol table
1946 * (.dynsym) for the run-time linker to resolve symbol lookups.
1947 */
1948 static uintptr_t
make_hash(Ofl_desc * ofl)1949 make_hash(Ofl_desc *ofl)
1950 {
1951 Shdr *shdr;
1952 Elf_Data *data;
1953 Is_desc *isec;
1954 size_t size;
1955 Word nsyms = ofl->ofl_globcnt;
1956 size_t cnt;
1957
1958 /*
1959 * Allocate section header structures. We set entcnt to 0
1960 * because it's going to change after we place this section.
1961 */
1962 if (new_section(ofl, SHT_HASH, MSG_ORIG(MSG_SCN_HASH), 0,
1963 &isec, &shdr, &data) == S_ERROR)
1964 return (S_ERROR);
1965
1966 /*
1967 * Place the section first since it will affect the local symbol
1968 * count.
1969 */
1970 ofl->ofl_oshash =
1971 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_hash, NULL);
1972 if (ofl->ofl_oshash == (Os_desc *)S_ERROR)
1973 return (S_ERROR);
1974
1975 /*
1976 * Calculate the number of output hash buckets.
1977 */
1978 ofl->ofl_hashbkts = findprime(nsyms);
1979
1980 /*
1981 * The size of the hash table is determined by
1982 *
1983 * i. the initial nbucket and nchain entries (2)
1984 * ii. the number of buckets (calculated above)
1985 * iii. the number of chains (this is based on the number of
1986 * symbols in the .dynsym array).
1987 */
1988 cnt = 2 + ofl->ofl_hashbkts + DYNSYM_ALL_CNT(ofl);
1989 size = cnt * shdr->sh_entsize;
1990
1991 /*
1992 * Finalize the section header and data buffer initialization.
1993 */
1994 if ((data->d_buf = libld_calloc(size, 1)) == NULL)
1995 return (S_ERROR);
1996 data->d_size = size;
1997 shdr->sh_size = (Xword)size;
1998
1999 return (1);
2000 }
2001
2002 /*
2003 * Generate the standard symbol table. Contains all locals and globals,
2004 * and resides in a non-allocatable section (ie. it can be stripped).
2005 */
2006 static uintptr_t
make_symtab(Ofl_desc * ofl)2007 make_symtab(Ofl_desc *ofl)
2008 {
2009 Shdr *shdr;
2010 Elf_Data *data;
2011 Is_desc *isec;
2012 Is_desc *xisec = 0;
2013 size_t size;
2014 Word symcnt;
2015
2016 /*
2017 * Create the section headers. Note that we supply an ent_cnt
2018 * of 0. We won't know the count until the section has been placed.
2019 */
2020 if (new_section(ofl, SHT_SYMTAB, MSG_ORIG(MSG_SCN_SYMTAB), 0,
2021 &isec, &shdr, &data) == S_ERROR)
2022 return (S_ERROR);
2023
2024 /*
2025 * Place the section first since it will affect the local symbol
2026 * count.
2027 */
2028 if ((ofl->ofl_ossymtab = ld_place_section(ofl, isec, NULL,
2029 ld_targ.t_id.id_symtab, NULL)) == (Os_desc *)S_ERROR)
2030 return (S_ERROR);
2031
2032 /*
2033 * At this point we've created all but the 'shstrtab' section.
2034 * Determine if we have to use 'Extended Sections'. If so - then
2035 * also create a SHT_SYMTAB_SHNDX section.
2036 */
2037 if ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE) {
2038 Shdr *xshdr;
2039 Elf_Data *xdata;
2040
2041 if (new_section(ofl, SHT_SYMTAB_SHNDX,
2042 MSG_ORIG(MSG_SCN_SYMTAB_SHNDX), 0, &xisec,
2043 &xshdr, &xdata) == S_ERROR)
2044 return (S_ERROR);
2045
2046 if ((ofl->ofl_ossymshndx = ld_place_section(ofl, xisec, NULL,
2047 ld_targ.t_id.id_symtab_ndx, NULL)) == (Os_desc *)S_ERROR)
2048 return (S_ERROR);
2049 }
2050
2051 /*
2052 * Calculated number of symbols, which need to be augmented by
2053 * the (yet to be created) .shstrtab entry.
2054 */
2055 symcnt = (size_t)(1 + SYMTAB_ALL_CNT(ofl));
2056 size = symcnt * shdr->sh_entsize;
2057
2058 /*
2059 * Finalize the section header and data buffer initialization.
2060 */
2061 data->d_size = size;
2062 shdr->sh_size = (Xword)size;
2063
2064 /*
2065 * If we created a SHT_SYMTAB_SHNDX - then set it's sizes too.
2066 */
2067 if (xisec) {
2068 size_t xsize = symcnt * sizeof (Word);
2069
2070 xisec->is_indata->d_size = xsize;
2071 xisec->is_shdr->sh_size = (Xword)xsize;
2072 }
2073
2074 return (1);
2075 }
2076
2077 /*
2078 * Build a dynamic symbol table. These tables reside in the text
2079 * segment of a dynamic executable or shared library.
2080 *
2081 * .SUNW_ldynsym contains local function symbols
2082 * .dynsym contains only globals symbols
2083 *
2084 * The two tables are created adjacent to each other, with .SUNW_ldynsym
2085 * coming first.
2086 */
2087 static uintptr_t
make_dynsym(Ofl_desc * ofl)2088 make_dynsym(Ofl_desc *ofl)
2089 {
2090 Shdr *shdr, *lshdr;
2091 Elf_Data *data, *ldata;
2092 Is_desc *isec, *lisec;
2093 size_t size;
2094 Xword cnt;
2095 int allow_ldynsym;
2096
2097 /*
2098 * Unless explicitly disabled, always produce a .SUNW_ldynsym section
2099 * when it is allowed by the file type, even if the resulting
2100 * table only ends up with a single STT_FILE in it. There are
2101 * two reasons: (1) It causes the generation of the DT_SUNW_SYMTAB
2102 * entry in the .dynamic section, which is something we would
2103 * like to encourage, and (2) Without it, we cannot generate
2104 * the associated .SUNW_dyn[sym|tls]sort sections, which are of
2105 * value to DTrace.
2106 *
2107 * In practice, it is extremely rare for an object not to have
2108 * local symbols for .SUNW_ldynsym, so 99% of the time, we'd be
2109 * doing it anyway.
2110 */
2111 allow_ldynsym = OFL_ALLOW_LDYNSYM(ofl);
2112
2113 /*
2114 * Create the section headers. Note that we supply an ent_cnt
2115 * of 0. We won't know the count until the section has been placed.
2116 */
2117 if (allow_ldynsym && new_section(ofl, SHT_SUNW_LDYNSYM,
2118 MSG_ORIG(MSG_SCN_LDYNSYM), 0, &lisec, &lshdr, &ldata) == S_ERROR)
2119 return (S_ERROR);
2120
2121 if (new_section(ofl, SHT_DYNSYM, MSG_ORIG(MSG_SCN_DYNSYM), 0,
2122 &isec, &shdr, &data) == S_ERROR)
2123 return (S_ERROR);
2124
2125 /*
2126 * Place the section(s) first since it will affect the local symbol
2127 * count.
2128 */
2129 if (allow_ldynsym &&
2130 ((ofl->ofl_osldynsym = ld_place_section(ofl, lisec, NULL,
2131 ld_targ.t_id.id_ldynsym, NULL)) == (Os_desc *)S_ERROR))
2132 return (S_ERROR);
2133 ofl->ofl_osdynsym =
2134 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_dynsym, NULL);
2135 if (ofl->ofl_osdynsym == (Os_desc *)S_ERROR)
2136 return (S_ERROR);
2137
2138 cnt = DYNSYM_ALL_CNT(ofl);
2139 size = (size_t)cnt * shdr->sh_entsize;
2140
2141 /*
2142 * Finalize the section header and data buffer initialization.
2143 */
2144 data->d_size = size;
2145 shdr->sh_size = (Xword)size;
2146
2147 /*
2148 * An ldynsym contains local function symbols. It is not
2149 * used for linking, but if present, serves to allow better
2150 * stack traces to be generated in contexts where the symtab
2151 * is not available. (dladdr(), or stripped executable/library files).
2152 */
2153 if (allow_ldynsym) {
2154 cnt = 1 + ofl->ofl_dynlocscnt + ofl->ofl_dynscopecnt;
2155 size = (size_t)cnt * shdr->sh_entsize;
2156
2157 ldata->d_size = size;
2158 lshdr->sh_size = (Xword)size;
2159 }
2160
2161 return (1);
2162 }
2163
2164 /*
2165 * Build .SUNW_dynsymsort and/or .SUNW_dyntlssort sections. These are
2166 * index sections for the .SUNW_ldynsym/.dynsym pair that present data
2167 * and function symbols sorted by address.
2168 */
2169 static uintptr_t
make_dynsort(Ofl_desc * ofl)2170 make_dynsort(Ofl_desc *ofl)
2171 {
2172 Shdr *shdr;
2173 Elf_Data *data;
2174 Is_desc *isec;
2175
2176 /* Only do it if the .SUNW_ldynsym section is present */
2177 if (!OFL_ALLOW_LDYNSYM(ofl))
2178 return (1);
2179
2180 /* .SUNW_dynsymsort */
2181 if (ofl->ofl_dynsymsortcnt > 0) {
2182 if (new_section(ofl, SHT_SUNW_symsort,
2183 MSG_ORIG(MSG_SCN_DYNSYMSORT), ofl->ofl_dynsymsortcnt,
2184 &isec, &shdr, &data) == S_ERROR)
2185 return (S_ERROR);
2186
2187 if ((ofl->ofl_osdynsymsort = ld_place_section(ofl, isec, NULL,
2188 ld_targ.t_id.id_dynsort, NULL)) == (Os_desc *)S_ERROR)
2189 return (S_ERROR);
2190 }
2191
2192 /* .SUNW_dyntlssort */
2193 if (ofl->ofl_dyntlssortcnt > 0) {
2194 if (new_section(ofl, SHT_SUNW_tlssort,
2195 MSG_ORIG(MSG_SCN_DYNTLSSORT),
2196 ofl->ofl_dyntlssortcnt, &isec, &shdr, &data) == S_ERROR)
2197 return (S_ERROR);
2198
2199 if ((ofl->ofl_osdyntlssort = ld_place_section(ofl, isec, NULL,
2200 ld_targ.t_id.id_dynsort, NULL)) == (Os_desc *)S_ERROR)
2201 return (S_ERROR);
2202 }
2203
2204 return (1);
2205 }
2206
2207 /*
2208 * Helper routine for make_dynsym_shndx. Builds a
2209 * a SHT_SYMTAB_SHNDX for .dynsym or .SUNW_ldynsym, without knowing
2210 * which one it is.
2211 */
2212 static uintptr_t
make_dyn_shndx(Ofl_desc * ofl,const char * shname,Os_desc * symtab,Os_desc ** ret_os)2213 make_dyn_shndx(Ofl_desc *ofl, const char *shname, Os_desc *symtab,
2214 Os_desc **ret_os)
2215 {
2216 Is_desc *isec;
2217 Is_desc *dynsymisp;
2218 Shdr *shdr, *dynshdr;
2219 Elf_Data *data;
2220
2221 dynsymisp = ld_os_first_isdesc(symtab);
2222 dynshdr = dynsymisp->is_shdr;
2223
2224 if (new_section(ofl, SHT_SYMTAB_SHNDX, shname,
2225 (dynshdr->sh_size / dynshdr->sh_entsize),
2226 &isec, &shdr, &data) == S_ERROR)
2227 return (S_ERROR);
2228
2229 if ((*ret_os = ld_place_section(ofl, isec, NULL,
2230 ld_targ.t_id.id_dynsym_ndx, NULL)) == (Os_desc *)S_ERROR)
2231 return (S_ERROR);
2232
2233 assert(*ret_os);
2234
2235 return (1);
2236 }
2237
2238 /*
2239 * Build a SHT_SYMTAB_SHNDX for the .dynsym, and .SUNW_ldynsym
2240 */
2241 static uintptr_t
make_dynsym_shndx(Ofl_desc * ofl)2242 make_dynsym_shndx(Ofl_desc *ofl)
2243 {
2244 /*
2245 * If there is a .SUNW_ldynsym, generate a section for its extended
2246 * index section as well.
2247 */
2248 if (OFL_ALLOW_LDYNSYM(ofl)) {
2249 if (make_dyn_shndx(ofl, MSG_ORIG(MSG_SCN_LDYNSYM_SHNDX),
2250 ofl->ofl_osldynsym, &ofl->ofl_osldynshndx) == S_ERROR)
2251 return (S_ERROR);
2252 }
2253
2254 /* The Generate a section for the dynsym */
2255 if (make_dyn_shndx(ofl, MSG_ORIG(MSG_SCN_DYNSYM_SHNDX),
2256 ofl->ofl_osdynsym, &ofl->ofl_osdynshndx) == S_ERROR)
2257 return (S_ERROR);
2258
2259 return (1);
2260 }
2261
2262
2263 /*
2264 * Build a string table for the section headers.
2265 */
2266 static uintptr_t
make_shstrtab(Ofl_desc * ofl)2267 make_shstrtab(Ofl_desc *ofl)
2268 {
2269 Shdr *shdr;
2270 Elf_Data *data;
2271 Is_desc *isec;
2272 size_t size;
2273
2274 if (new_section(ofl, SHT_STRTAB, MSG_ORIG(MSG_SCN_SHSTRTAB),
2275 0, &isec, &shdr, &data) == S_ERROR)
2276 return (S_ERROR);
2277
2278 /*
2279 * Place the section first, as it may effect the number of section
2280 * headers to account for.
2281 */
2282 ofl->ofl_osshstrtab =
2283 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_note, NULL);
2284 if (ofl->ofl_osshstrtab == (Os_desc *)S_ERROR)
2285 return (S_ERROR);
2286
2287 size = st_getstrtab_sz(ofl->ofl_shdrsttab);
2288 assert(size > 0);
2289
2290 data->d_size = size;
2291 shdr->sh_size = (Xword)size;
2292
2293 return (1);
2294 }
2295
2296 /*
2297 * Build a string section for the standard symbol table.
2298 */
2299 static uintptr_t
make_strtab(Ofl_desc * ofl)2300 make_strtab(Ofl_desc *ofl)
2301 {
2302 Shdr *shdr;
2303 Elf_Data *data;
2304 Is_desc *isec;
2305 size_t size;
2306
2307 /*
2308 * This string table consists of all the global and local symbols.
2309 * Account for null bytes at end of the file name and the beginning
2310 * of section.
2311 */
2312 if (st_insert(ofl->ofl_strtab, ofl->ofl_name) == -1)
2313 return (S_ERROR);
2314
2315 size = st_getstrtab_sz(ofl->ofl_strtab);
2316 assert(size > 0);
2317
2318 if (new_section(ofl, SHT_STRTAB, MSG_ORIG(MSG_SCN_STRTAB),
2319 0, &isec, &shdr, &data) == S_ERROR)
2320 return (S_ERROR);
2321
2322 /* Set the size of the data area */
2323 data->d_size = size;
2324 shdr->sh_size = (Xword)size;
2325
2326 ofl->ofl_osstrtab =
2327 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_strtab, NULL);
2328 return ((uintptr_t)ofl->ofl_osstrtab);
2329 }
2330
2331 /*
2332 * Build a string table for the dynamic symbol table.
2333 */
2334 static uintptr_t
make_dynstr(Ofl_desc * ofl)2335 make_dynstr(Ofl_desc *ofl)
2336 {
2337 Shdr *shdr;
2338 Elf_Data *data;
2339 Is_desc *isec;
2340 size_t size;
2341
2342 /*
2343 * If producing a .SUNW_ldynsym, account for the initial STT_FILE
2344 * symbol that precedes the scope reduced global symbols.
2345 */
2346 if (OFL_ALLOW_LDYNSYM(ofl)) {
2347 if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_name) == -1)
2348 return (S_ERROR);
2349 ofl->ofl_dynscopecnt++;
2350 }
2351
2352 /*
2353 * Account for any local, named register symbols. These locals are
2354 * required for reference from DT_REGISTER .dynamic entries.
2355 */
2356 if (ofl->ofl_regsyms) {
2357 int ndx;
2358
2359 for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) {
2360 Sym_desc *sdp;
2361
2362 if ((sdp = ofl->ofl_regsyms[ndx]) == NULL)
2363 continue;
2364
2365 if (!SYM_IS_HIDDEN(sdp) &&
2366 (ELF_ST_BIND(sdp->sd_sym->st_info) != STB_LOCAL))
2367 continue;
2368
2369 if (sdp->sd_sym->st_name == NULL)
2370 continue;
2371
2372 if (st_insert(ofl->ofl_dynstrtab, sdp->sd_name) == -1)
2373 return (S_ERROR);
2374 }
2375 }
2376
2377 /*
2378 * Reserve entries for any per-symbol auxiliary/filter strings.
2379 */
2380 if (ofl->ofl_dtsfltrs != NULL) {
2381 Dfltr_desc *dftp;
2382 Aliste idx;
2383
2384 for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, idx, dftp))
2385 if (st_insert(ofl->ofl_dynstrtab, dftp->dft_str) == -1)
2386 return (S_ERROR);
2387 }
2388
2389 size = st_getstrtab_sz(ofl->ofl_dynstrtab);
2390 assert(size > 0);
2391
2392 if (new_section(ofl, SHT_STRTAB, MSG_ORIG(MSG_SCN_DYNSTR),
2393 0, &isec, &shdr, &data) == S_ERROR)
2394 return (S_ERROR);
2395
2396 /* Make it allocable if necessary */
2397 if (!(ofl->ofl_flags & FLG_OF_RELOBJ))
2398 shdr->sh_flags |= SHF_ALLOC;
2399
2400 /* Set the size of the data area */
2401 data->d_size = size + DYNSTR_EXTRA_PAD;
2402
2403 shdr->sh_size = (Xword)size;
2404
2405 ofl->ofl_osdynstr =
2406 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_dynstr, NULL);
2407 return ((uintptr_t)ofl->ofl_osdynstr);
2408 }
2409
2410 /*
2411 * Generate an output relocation section which will contain the relocation
2412 * information to be applied to the `osp' section.
2413 *
2414 * If (osp == NULL) then we are creating the coalesced relocation section
2415 * for an executable and/or a shared object.
2416 */
2417 static uintptr_t
make_reloc(Ofl_desc * ofl,Os_desc * osp)2418 make_reloc(Ofl_desc *ofl, Os_desc *osp)
2419 {
2420 Shdr *shdr;
2421 Elf_Data *data;
2422 Is_desc *isec;
2423 size_t size;
2424 Xword sh_flags;
2425 char *sectname;
2426 Os_desc *rosp;
2427 Word relsize;
2428 const char *rel_prefix;
2429
2430 /* LINTED */
2431 if (ld_targ.t_m.m_rel_sht_type == SHT_REL) {
2432 /* REL */
2433 relsize = sizeof (Rel);
2434 rel_prefix = MSG_ORIG(MSG_SCN_REL);
2435 } else {
2436 /* RELA */
2437 relsize = sizeof (Rela);
2438 rel_prefix = MSG_ORIG(MSG_SCN_RELA);
2439 }
2440
2441 if (osp) {
2442 size = osp->os_szoutrels;
2443 sh_flags = osp->os_shdr->sh_flags;
2444 if ((sectname = libld_malloc(strlen(rel_prefix) +
2445 strlen(osp->os_name) + 1)) == 0)
2446 return (S_ERROR);
2447 (void) strcpy(sectname, rel_prefix);
2448 (void) strcat(sectname, osp->os_name);
2449 } else if (ofl->ofl_flags & FLG_OF_COMREL) {
2450 size = (ofl->ofl_reloccnt - ofl->ofl_reloccntsub) * relsize;
2451 sh_flags = SHF_ALLOC;
2452 sectname = (char *)MSG_ORIG(MSG_SCN_SUNWRELOC);
2453 } else {
2454 size = ofl->ofl_relocrelsz;
2455 sh_flags = SHF_ALLOC;
2456 sectname = (char *)rel_prefix;
2457 }
2458
2459 /*
2460 * Keep track of total size of 'output relocations' (to be stored
2461 * in .dynamic)
2462 */
2463 /* LINTED */
2464 ofl->ofl_relocsz += (Xword)size;
2465
2466 if (new_section(ofl, ld_targ.t_m.m_rel_sht_type, sectname, 0, &isec,
2467 &shdr, &data) == S_ERROR)
2468 return (S_ERROR);
2469
2470 data->d_size = size;
2471
2472 shdr->sh_size = (Xword)size;
2473 if (OFL_ALLOW_DYNSYM(ofl) && (sh_flags & SHF_ALLOC))
2474 shdr->sh_flags = SHF_ALLOC;
2475
2476 if (osp) {
2477 /*
2478 * The sh_info field of the SHT_REL* sections points to the
2479 * section the relocations are to be applied to.
2480 */
2481 shdr->sh_flags |= SHF_INFO_LINK;
2482 }
2483
2484 rosp = ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_rel, NULL);
2485 if (rosp == (Os_desc *)S_ERROR)
2486 return (S_ERROR);
2487
2488 /*
2489 * Associate this relocation section to the section its going to
2490 * relocate.
2491 */
2492 if (osp) {
2493 Aliste idx;
2494 Is_desc *risp;
2495
2496 /*
2497 * This is used primarily so that we can update
2498 * SHT_GROUP[sect_no] entries to point to the
2499 * created output relocation sections.
2500 */
2501 for (APLIST_TRAVERSE(osp->os_relisdescs, idx, risp)) {
2502 risp->is_osdesc = rosp;
2503
2504 /*
2505 * If the input relocation section had the SHF_GROUP
2506 * flag set - propagate it to the output relocation
2507 * section.
2508 */
2509 if (risp->is_shdr->sh_flags & SHF_GROUP) {
2510 rosp->os_shdr->sh_flags |= SHF_GROUP;
2511 break;
2512 }
2513 }
2514 osp->os_relosdesc = rosp;
2515 } else
2516 ofl->ofl_osrel = rosp;
2517
2518 /*
2519 * If this is the first relocation section we've encountered save it
2520 * so that the .dynamic entry can be initialized accordingly.
2521 */
2522 if (ofl->ofl_osrelhead == (Os_desc *)0)
2523 ofl->ofl_osrelhead = rosp;
2524
2525 return (1);
2526 }
2527
2528 /*
2529 * Generate version needed section.
2530 */
2531 static uintptr_t
make_verneed(Ofl_desc * ofl)2532 make_verneed(Ofl_desc *ofl)
2533 {
2534 Shdr *shdr;
2535 Elf_Data *data;
2536 Is_desc *isec;
2537
2538 /*
2539 * verneed sections do not have a constant element size, so the
2540 * value of ent_cnt specified here (0) is meaningless.
2541 */
2542 if (new_section(ofl, SHT_SUNW_verneed, MSG_ORIG(MSG_SCN_SUNWVERSION),
2543 0, &isec, &shdr, &data) == S_ERROR)
2544 return (S_ERROR);
2545
2546 /* During version processing we calculated the total size. */
2547 data->d_size = ofl->ofl_verneedsz;
2548 shdr->sh_size = (Xword)ofl->ofl_verneedsz;
2549
2550 ofl->ofl_osverneed =
2551 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_version, NULL);
2552 return ((uintptr_t)ofl->ofl_osverneed);
2553 }
2554
2555 /*
2556 * Generate a version definition section.
2557 *
2558 * o the SHT_SUNW_verdef section defines the versions that exist within this
2559 * image.
2560 */
2561 static uintptr_t
make_verdef(Ofl_desc * ofl)2562 make_verdef(Ofl_desc *ofl)
2563 {
2564 Shdr *shdr;
2565 Elf_Data *data;
2566 Is_desc *isec;
2567 Ver_desc *vdp;
2568 Str_tbl *strtab;
2569
2570 /*
2571 * Reserve a string table entry for the base version dependency (other
2572 * dependencies have symbol representations, which will already be
2573 * accounted for during symbol processing).
2574 */
2575 vdp = (Ver_desc *)ofl->ofl_verdesc->apl_data[0];
2576
2577 if (OFL_IS_STATIC_OBJ(ofl))
2578 strtab = ofl->ofl_strtab;
2579 else
2580 strtab = ofl->ofl_dynstrtab;
2581
2582 if (st_insert(strtab, vdp->vd_name) == -1)
2583 return (S_ERROR);
2584
2585 /*
2586 * verdef sections do not have a constant element size, so the
2587 * value of ent_cnt specified here (0) is meaningless.
2588 */
2589 if (new_section(ofl, SHT_SUNW_verdef, MSG_ORIG(MSG_SCN_SUNWVERSION),
2590 0, &isec, &shdr, &data) == S_ERROR)
2591 return (S_ERROR);
2592
2593 /* During version processing we calculated the total size. */
2594 data->d_size = ofl->ofl_verdefsz;
2595 shdr->sh_size = (Xword)ofl->ofl_verdefsz;
2596
2597 ofl->ofl_osverdef =
2598 ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_version, NULL);
2599 return ((uintptr_t)ofl->ofl_osverdef);
2600 }
2601
2602 /*
2603 * This routine is called when -z nopartial is in effect.
2604 */
2605 uintptr_t
ld_make_parexpn_data(Ofl_desc * ofl,size_t size,Xword align)2606 ld_make_parexpn_data(Ofl_desc *ofl, size_t size, Xword align)
2607 {
2608 Shdr *shdr;
2609 Elf_Data *data;
2610 Is_desc *isec;
2611 Os_desc *osp;
2612
2613 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_DATA), 0,
2614 &isec, &shdr, &data) == S_ERROR)
2615 return (S_ERROR);
2616
2617 shdr->sh_flags |= SHF_WRITE;
2618 data->d_size = size;
2619 shdr->sh_size = (Xword)size;
2620 if (align != 0) {
2621 data->d_align = align;
2622 shdr->sh_addralign = align;
2623 }
2624
2625 if ((data->d_buf = libld_calloc(size, 1)) == NULL)
2626 return (S_ERROR);
2627
2628 /*
2629 * Retain handle to this .data input section. Variables using move
2630 * sections (partial initialization) will be redirected here when
2631 * such global references are added and '-z nopartial' is in effect.
2632 */
2633 ofl->ofl_isparexpn = isec;
2634 osp = ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_data, NULL);
2635 if (osp == (Os_desc *)S_ERROR)
2636 return (S_ERROR);
2637
2638 if (!(osp->os_flags & FLG_OS_OUTREL)) {
2639 ofl->ofl_dynshdrcnt++;
2640 osp->os_flags |= FLG_OS_OUTREL;
2641 }
2642 return (1);
2643 }
2644
2645 /*
2646 * Make .sunwmove section
2647 */
2648 uintptr_t
ld_make_sunwmove(Ofl_desc * ofl,int mv_nums)2649 ld_make_sunwmove(Ofl_desc *ofl, int mv_nums)
2650 {
2651 Shdr *shdr;
2652 Elf_Data *data;
2653 Is_desc *isec;
2654 Aliste idx;
2655 Sym_desc *sdp;
2656 int cnt = 1;
2657
2658
2659 if (new_section(ofl, SHT_SUNW_move, MSG_ORIG(MSG_SCN_SUNWMOVE),
2660 mv_nums, &isec, &shdr, &data) == S_ERROR)
2661 return (S_ERROR);
2662
2663 if ((data->d_buf = libld_calloc(data->d_size, 1)) == NULL)
2664 return (S_ERROR);
2665
2666 /*
2667 * Copy move entries
2668 */
2669 for (APLIST_TRAVERSE(ofl->ofl_parsyms, idx, sdp)) {
2670 Aliste idx2;
2671 Mv_desc *mdp;
2672
2673 if (sdp->sd_flags & FLG_SY_PAREXPN)
2674 continue;
2675
2676 for (ALIST_TRAVERSE(sdp->sd_move, idx2, mdp))
2677 mdp->md_oidx = cnt++;
2678 }
2679
2680 if ((ofl->ofl_osmove = ld_place_section(ofl, isec, NULL, 0, NULL)) ==
2681 (Os_desc *)S_ERROR)
2682 return (S_ERROR);
2683
2684 return (1);
2685 }
2686
2687 /*
2688 * Given a relocation descriptor that references a string table
2689 * input section, locate the string referenced and return a pointer
2690 * to it.
2691 */
2692 static const char *
strmerge_get_reloc_str(Ofl_desc * ofl,Rel_desc * rsp)2693 strmerge_get_reloc_str(Ofl_desc *ofl, Rel_desc *rsp)
2694 {
2695 Sym_desc *sdp = rsp->rel_sym;
2696 Xword str_off;
2697
2698 /*
2699 * In the case of an STT_SECTION symbol, the addend of the
2700 * relocation gives the offset into the string section. For
2701 * other symbol types, the symbol value is the offset.
2702 */
2703
2704 if (ELF_ST_TYPE(sdp->sd_sym->st_info) != STT_SECTION) {
2705 str_off = sdp->sd_sym->st_value;
2706 } else if ((rsp->rel_flags & FLG_REL_RELA) == FLG_REL_RELA) {
2707 /*
2708 * For SHT_RELA, the addend value is found in the
2709 * rel_raddend field of the relocation.
2710 */
2711 str_off = rsp->rel_raddend;
2712 } else { /* REL and STT_SECTION */
2713 /*
2714 * For SHT_REL, the "addend" is not part of the relocation
2715 * record. Instead, it is found at the relocation target
2716 * address.
2717 */
2718 uchar_t *addr = (uchar_t *)((uintptr_t)rsp->rel_roffset +
2719 (uintptr_t)rsp->rel_isdesc->is_indata->d_buf);
2720
2721 if (ld_reloc_targval_get(ofl, rsp, addr, &str_off) == 0)
2722 return (0);
2723 }
2724
2725 return (str_off + (char *)sdp->sd_isc->is_indata->d_buf);
2726 }
2727
2728 /*
2729 * First pass over the relocation records for string table merging.
2730 * Build lists of relocations and symbols that will need modification,
2731 * and insert the strings they reference into the mstrtab string table.
2732 *
2733 * entry:
2734 * ofl, osp - As passed to ld_make_strmerge().
2735 * mstrtab - String table to receive input strings. This table
2736 * must be in its first (initialization) pass and not
2737 * yet cooked (st_getstrtab_sz() not yet called).
2738 * rel_alpp - APlist to receive pointer to any relocation
2739 * descriptors with STT_SECTION symbols that reference
2740 * one of the input sections being merged.
2741 * sym_alpp - APlist to receive pointer to any symbols that reference
2742 * one of the input sections being merged.
2743 * rcp - Pointer to cache of relocation descriptors to examine.
2744 * Either &ofl->ofl_actrels (active relocations)
2745 * or &ofl->ofl_outrels (output relocations).
2746 *
2747 * exit:
2748 * On success, rel_alpp and sym_alpp are updated, and
2749 * any strings in the mergeable input sections referenced by
2750 * a relocation has been entered into mstrtab. True (1) is returned.
2751 *
2752 * On failure, False (0) is returned.
2753 */
2754 static int
strmerge_pass1(Ofl_desc * ofl,Os_desc * osp,Str_tbl * mstrtab,APlist ** rel_alpp,APlist ** sym_alpp,Rel_cache * rcp)2755 strmerge_pass1(Ofl_desc *ofl, Os_desc *osp, Str_tbl *mstrtab,
2756 APlist **rel_alpp, APlist **sym_alpp, Rel_cache *rcp)
2757 {
2758 Aliste idx;
2759 Rel_cachebuf *rcbp;
2760 Sym_desc *sdp;
2761 Sym_desc *last_sdp = NULL;
2762 Rel_desc *rsp;
2763 const char *name;
2764
2765 REL_CACHE_TRAVERSE(rcp, idx, rcbp, rsp) {
2766 sdp = rsp->rel_sym;
2767 if ((sdp->sd_isc == NULL) || ((sdp->sd_isc->is_flags &
2768 (FLG_IS_DISCARD | FLG_IS_INSTRMRG)) != FLG_IS_INSTRMRG) ||
2769 (sdp->sd_isc->is_osdesc != osp))
2770 continue;
2771
2772 /*
2773 * Remember symbol for use in the third pass. There is no
2774 * reason to save a given symbol more than once, so we take
2775 * advantage of the fact that relocations to a given symbol
2776 * tend to cluster in the list. If this is the same symbol
2777 * we saved last time, don't bother.
2778 */
2779 if (last_sdp != sdp) {
2780 if (aplist_append(sym_alpp, sdp, AL_CNT_STRMRGSYM) ==
2781 NULL)
2782 return (0);
2783 last_sdp = sdp;
2784 }
2785
2786 /* Enter the string into our new string table */
2787 name = strmerge_get_reloc_str(ofl, rsp);
2788 if (st_insert(mstrtab, name) == -1)
2789 return (0);
2790
2791 /*
2792 * If this is an STT_SECTION symbol, then the second pass
2793 * will need to modify this relocation, so hang on to it.
2794 */
2795 if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) &&
2796 (aplist_append(rel_alpp, rsp, AL_CNT_STRMRGREL) == NULL))
2797 return (0);
2798 }
2799
2800 return (1);
2801 }
2802
2803 /*
2804 * If the output section has any SHF_MERGE|SHF_STRINGS input sections,
2805 * replace them with a single merged/compressed input section.
2806 *
2807 * entry:
2808 * ofl - Output file descriptor
2809 * osp - Output section descriptor
2810 * rel_alpp, sym_alpp, - Address of 2 APlists, to be used
2811 * for internal processing. On the initial call to
2812 * ld_make_strmerge, these list pointers must be NULL.
2813 * The caller is encouraged to pass the same lists back for
2814 * successive calls to this function without freeing
2815 * them in between calls. This causes a single pair of
2816 * memory allocations to be reused multiple times.
2817 *
2818 * exit:
2819 * If section merging is possible, it is done. If no errors are
2820 * encountered, True (1) is returned. On error, S_ERROR.
2821 *
2822 * The contents of rel_alpp and sym_alpp on exit are
2823 * undefined. The caller can free them, or pass them back to a subsequent
2824 * call to this routine, but should not examine their contents.
2825 */
2826 static uintptr_t
ld_make_strmerge(Ofl_desc * ofl,Os_desc * osp,APlist ** rel_alpp,APlist ** sym_alpp)2827 ld_make_strmerge(Ofl_desc *ofl, Os_desc *osp, APlist **rel_alpp,
2828 APlist **sym_alpp)
2829 {
2830 Str_tbl *mstrtab; /* string table for string merge secs */
2831 Is_desc *mstrsec; /* Generated string merge section */
2832 Is_desc *isp;
2833 Shdr *mstr_shdr;
2834 Elf_Data *mstr_data;
2835 Sym_desc *sdp;
2836 Rel_desc *rsp;
2837 Aliste idx;
2838 size_t data_size;
2839 int st_setstring_status;
2840 size_t stoff;
2841
2842 /* If string table compression is disabled, there's nothing to do */
2843 if ((ofl->ofl_flags1 & FLG_OF1_NCSTTAB) != 0)
2844 return (1);
2845
2846 /*
2847 * Pass over the mergeable input sections, and if they haven't
2848 * all been discarded, create a string table.
2849 */
2850 mstrtab = NULL;
2851 for (APLIST_TRAVERSE(osp->os_mstrisdescs, idx, isp)) {
2852 if (isp->is_flags & FLG_IS_DISCARD)
2853 continue;
2854
2855 /*
2856 * We have at least one non-discarded section.
2857 * Create a string table descriptor.
2858 */
2859 if ((mstrtab = st_new(FLG_STNEW_COMPRESS)) == NULL)
2860 return (S_ERROR);
2861 break;
2862 }
2863
2864 /* If no string table was created, we have no mergeable sections */
2865 if (mstrtab == NULL)
2866 return (1);
2867
2868 /*
2869 * This routine has to make 3 passes:
2870 *
2871 * 1) Examine all relocations, insert strings from relocations
2872 * to the mergeable input sections into the string table.
2873 * 2) Modify the relocation values to be correct for the
2874 * new merged section.
2875 * 3) Modify the symbols used by the relocations to reference
2876 * the new section.
2877 *
2878 * These passes cannot be combined:
2879 * - The string table code works in two passes, and all
2880 * strings have to be loaded in pass one before the
2881 * offset of any strings can be determined.
2882 * - Multiple relocations reference a single symbol, so the
2883 * symbol cannot be modified until all relocations are
2884 * fixed.
2885 *
2886 * The number of relocations related to section merging is usually
2887 * a mere fraction of the overall active and output relocation lists,
2888 * and the number of symbols is usually a fraction of the number
2889 * of related relocations. We therefore build APlists for the
2890 * relocations and symbols in the first pass, and then use those
2891 * lists to accelerate the operation of pass 2 and 3.
2892 *
2893 * Reinitialize the lists to a completely empty state.
2894 */
2895 aplist_reset(*rel_alpp);
2896 aplist_reset(*sym_alpp);
2897
2898 /*
2899 * Pass 1:
2900 *
2901 * Every relocation related to this output section (and the input
2902 * sections that make it up) is found in either the active, or the
2903 * output relocation list, depending on whether the relocation is to
2904 * be processed by this invocation of the linker, or inserted into the
2905 * output object.
2906 *
2907 * Build lists of relocations and symbols that will need modification,
2908 * and insert the strings they reference into the mstrtab string table.
2909 */
2910 if (strmerge_pass1(ofl, osp, mstrtab, rel_alpp, sym_alpp,
2911 &ofl->ofl_actrels) == 0)
2912 goto return_s_error;
2913 if (strmerge_pass1(ofl, osp, mstrtab, rel_alpp, sym_alpp,
2914 &ofl->ofl_outrels) == 0)
2915 goto return_s_error;
2916
2917 /*
2918 * Get the size of the new input section. Requesting the
2919 * string table size "cooks" the table, and finalizes its contents.
2920 */
2921 data_size = st_getstrtab_sz(mstrtab);
2922
2923 /* Create a new input section to hold the merged strings */
2924 if (new_section_from_template(ofl, isp, data_size,
2925 &mstrsec, &mstr_shdr, &mstr_data) == S_ERROR)
2926 goto return_s_error;
2927 mstrsec->is_flags |= FLG_IS_GNSTRMRG;
2928
2929 /*
2930 * Allocate a data buffer for the new input section.
2931 * Then, associate the buffer with the string table descriptor.
2932 */
2933 if ((mstr_data->d_buf = libld_malloc(data_size)) == NULL)
2934 goto return_s_error;
2935 if (st_setstrbuf(mstrtab, mstr_data->d_buf, data_size) == -1)
2936 goto return_s_error;
2937
2938 /* Add the new section to the output image */
2939 if (ld_place_section(ofl, mstrsec, NULL, osp->os_identndx, NULL) ==
2940 (Os_desc *)S_ERROR)
2941 goto return_s_error;
2942
2943 /*
2944 * Pass 2:
2945 *
2946 * Revisit the relocation descriptors with STT_SECTION symbols
2947 * that were saved by the first pass. Update each relocation
2948 * record so that the offset it contains is for the new section
2949 * instead of the original.
2950 */
2951 for (APLIST_TRAVERSE(*rel_alpp, idx, rsp)) {
2952 const char *name;
2953
2954 /* Put the string into the merged string table */
2955 name = strmerge_get_reloc_str(ofl, rsp);
2956 st_setstring_status = st_setstring(mstrtab, name, &stoff);
2957 if (st_setstring_status == -1) {
2958 /*
2959 * A failure to insert at this point means that
2960 * something is corrupt. This isn't a resource issue.
2961 */
2962 assert(st_setstring_status != -1);
2963 goto return_s_error;
2964 }
2965
2966 /*
2967 * Alter the relocation to access the string at the
2968 * new offset in our new string table.
2969 *
2970 * For SHT_RELA platforms, it suffices to simply
2971 * update the rel_raddend field of the relocation.
2972 *
2973 * For SHT_REL platforms, the new "addend" value
2974 * needs to be written at the address being relocated.
2975 * However, we can't alter the input sections which
2976 * are mapped readonly, and the output image has not
2977 * been created yet. So, we defer this operation,
2978 * using the rel_raddend field of the relocation
2979 * which is normally 0 on a REL platform, to pass the
2980 * new "addend" value to ld_perform_outreloc() or
2981 * ld_do_activerelocs(). The FLG_REL_NADDEND flag
2982 * tells them that this is the case.
2983 */
2984 if ((rsp->rel_flags & FLG_REL_RELA) == 0) /* REL */
2985 rsp->rel_flags |= FLG_REL_NADDEND;
2986 rsp->rel_raddend = (Sxword)stoff;
2987
2988 /*
2989 * Generate a symbol name string for STT_SECTION symbols
2990 * that might reference our merged section. This shows up
2991 * in debug output and helps show how the relocation has
2992 * changed from its original input section to our merged one.
2993 */
2994 if (ld_stt_section_sym_name(mstrsec) == NULL)
2995 goto return_s_error;
2996 }
2997
2998 /*
2999 * Pass 3:
3000 *
3001 * Modify the symbols referenced by the relocation descriptors
3002 * so that they reference the new input section containing the
3003 * merged strings instead of the original input sections.
3004 */
3005 for (APLIST_TRAVERSE(*sym_alpp, idx, sdp)) {
3006 /*
3007 * If we've already processed this symbol, don't do it
3008 * twice. strmerge_pass1() uses a heuristic (relocations to
3009 * the same symbol clump together) to avoid inserting a
3010 * given symbol more than once, but repeat symbols in
3011 * the list can occur.
3012 */
3013 if ((sdp->sd_isc->is_flags & FLG_IS_INSTRMRG) == 0)
3014 continue;
3015
3016 if (ELF_ST_TYPE(sdp->sd_sym->st_info) != STT_SECTION) {
3017 /*
3018 * This is not an STT_SECTION symbol, so its
3019 * value is the offset of the string within the
3020 * input section. Update the address to reflect
3021 * the address in our new merged section.
3022 */
3023 const char *name = sdp->sd_sym->st_value +
3024 (char *)sdp->sd_isc->is_indata->d_buf;
3025
3026 st_setstring_status =
3027 st_setstring(mstrtab, name, &stoff);
3028 if (st_setstring_status == -1) {
3029 /*
3030 * A failure to insert at this point means
3031 * something is corrupt. This isn't a
3032 * resource issue.
3033 */
3034 assert(st_setstring_status != -1);
3035 goto return_s_error;
3036 }
3037
3038 if (ld_sym_copy(sdp) == S_ERROR)
3039 goto return_s_error;
3040 sdp->sd_sym->st_value = (Word)stoff;
3041 }
3042
3043 /* Redirect the symbol to our new merged section */
3044 sdp->sd_isc = mstrsec;
3045 }
3046
3047 /*
3048 * There are no references left to the original input string sections.
3049 * Mark them as discarded so they don't go into the output image.
3050 * At the same time, add up the sizes of the replaced sections.
3051 */
3052 data_size = 0;
3053 for (APLIST_TRAVERSE(osp->os_mstrisdescs, idx, isp)) {
3054 if (isp->is_flags & (FLG_IS_DISCARD | FLG_IS_GNSTRMRG))
3055 continue;
3056
3057 data_size += isp->is_indata->d_size;
3058
3059 isp->is_flags |= FLG_IS_DISCARD;
3060 DBG_CALL(Dbg_sec_discarded(ofl->ofl_lml, isp, mstrsec));
3061 }
3062
3063 /* Report how much space we saved in the output section */
3064 DBG_CALL(Dbg_sec_genstr_compress(ofl->ofl_lml, osp->os_name, data_size,
3065 mstr_data->d_size));
3066
3067 st_destroy(mstrtab);
3068 return (1);
3069
3070 return_s_error:
3071 st_destroy(mstrtab);
3072 return (S_ERROR);
3073 }
3074
3075 /*
3076 * Update a data buffers size. A number of sections have to be created, and
3077 * the sections header contributes to the size of the eventual section. Thus,
3078 * a section may be created, and once all associated sections have been created,
3079 * we return to establish the required section size.
3080 */
3081 inline static void
update_data_size(Os_desc * osp,ulong_t cnt)3082 update_data_size(Os_desc *osp, ulong_t cnt)
3083 {
3084 Is_desc *isec = ld_os_first_isdesc(osp);
3085 Elf_Data *data = isec->is_indata;
3086 Shdr *shdr = osp->os_shdr;
3087 size_t size = cnt * shdr->sh_entsize;
3088
3089 shdr->sh_size = (Xword)size;
3090 data->d_size = size;
3091 }
3092
3093 /*
3094 * The following sections are built after all input file processing and symbol
3095 * validation has been carried out. The order is important (because the
3096 * addition of a section adds a new symbol there is a chicken and egg problem
3097 * of maintaining the appropriate counts). By maintaining a known order the
3098 * individual routines can compensate for later, known, additions.
3099 */
3100 uintptr_t
ld_make_sections(Ofl_desc * ofl)3101 ld_make_sections(Ofl_desc *ofl)
3102 {
3103 ofl_flag_t flags = ofl->ofl_flags;
3104 Sg_desc *sgp;
3105
3106 /*
3107 * Generate any special sections.
3108 */
3109 if (flags & FLG_OF_ADDVERS)
3110 if (make_comment(ofl) == S_ERROR)
3111 return (S_ERROR);
3112
3113 if (make_interp(ofl) == S_ERROR)
3114 return (S_ERROR);
3115
3116 /*
3117 * Create a capabilities section if required.
3118 */
3119 if (make_cap(ofl, SHT_SUNW_cap, MSG_ORIG(MSG_SCN_SUNWCAP),
3120 ld_targ.t_id.id_cap) == S_ERROR)
3121 return (S_ERROR);
3122
3123 /*
3124 * Create any init/fini array sections.
3125 */
3126 if (make_array(ofl, SHT_INIT_ARRAY, MSG_ORIG(MSG_SCN_INITARRAY),
3127 ofl->ofl_initarray) == S_ERROR)
3128 return (S_ERROR);
3129
3130 if (make_array(ofl, SHT_FINI_ARRAY, MSG_ORIG(MSG_SCN_FINIARRAY),
3131 ofl->ofl_finiarray) == S_ERROR)
3132 return (S_ERROR);
3133
3134 if (make_array(ofl, SHT_PREINIT_ARRAY, MSG_ORIG(MSG_SCN_PREINITARRAY),
3135 ofl->ofl_preiarray) == S_ERROR)
3136 return (S_ERROR);
3137
3138 /*
3139 * Make the .plt section. This occurs after any other relocation
3140 * sections are generated (see reloc_init()) to ensure that the
3141 * associated relocation section is after all the other relocation
3142 * sections.
3143 */
3144 if ((ofl->ofl_pltcnt) || (ofl->ofl_pltpad))
3145 if (make_plt(ofl) == S_ERROR)
3146 return (S_ERROR);
3147
3148 /*
3149 * Determine whether any sections or files are not referenced. Under
3150 * -Dunused a diagnostic for any unused components is generated, under
3151 * -zignore the component is removed from the final output.
3152 */
3153 if (DBG_ENABLED || (ofl->ofl_flags1 & FLG_OF1_IGNPRC)) {
3154 if (ignore_section_processing(ofl) == S_ERROR)
3155 return (S_ERROR);
3156 }
3157
3158 /*
3159 * If we have detected a situation in which previously placed
3160 * output sections may have been discarded, perform the necessary
3161 * readjustment.
3162 */
3163 if (ofl->ofl_flags & FLG_OF_ADJOSCNT)
3164 adjust_os_count(ofl);
3165
3166 /*
3167 * Do any of the output sections contain input sections that
3168 * are candidates for string table merging? For each such case,
3169 * we create a replacement section, insert it, and discard the
3170 * originals.
3171 *
3172 * rel_alpp and sym_alpp are used by ld_make_strmerge()
3173 * for its internal processing. We are responsible for the
3174 * initialization and cleanup, and ld_make_strmerge() handles the rest.
3175 * This allows us to reuse a single pair of memory buffers, allocated
3176 * for this processing, for all the output sections.
3177 */
3178 if ((ofl->ofl_flags1 & FLG_OF1_NCSTTAB) == 0) {
3179 int error_seen = 0;
3180 APlist *rel_alpp = NULL;
3181 APlist *sym_alpp = NULL;
3182 Aliste idx1;
3183
3184 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
3185 Os_desc *osp;
3186 Aliste idx2;
3187
3188 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp))
3189 if ((osp->os_mstrisdescs != NULL) &&
3190 (ld_make_strmerge(ofl, osp,
3191 &rel_alpp, &sym_alpp) ==
3192 S_ERROR)) {
3193 error_seen = 1;
3194 break;
3195 }
3196 }
3197 if (rel_alpp != NULL)
3198 libld_free(rel_alpp);
3199 if (sym_alpp != NULL)
3200 libld_free(sym_alpp);
3201 if (error_seen != 0)
3202 return (S_ERROR);
3203 }
3204
3205 /*
3206 * Add any necessary versioning information.
3207 */
3208 if (!(flags & FLG_OF_NOVERSEC)) {
3209 if ((flags & FLG_OF_VERNEED) &&
3210 (make_verneed(ofl) == S_ERROR))
3211 return (S_ERROR);
3212 if ((flags & FLG_OF_VERDEF) &&
3213 (make_verdef(ofl) == S_ERROR))
3214 return (S_ERROR);
3215 if ((flags & (FLG_OF_VERNEED | FLG_OF_VERDEF)) &&
3216 ((ofl->ofl_osversym = make_sym_sec(ofl,
3217 MSG_ORIG(MSG_SCN_SUNWVERSYM), SHT_SUNW_versym,
3218 ld_targ.t_id.id_version)) == (Os_desc*)S_ERROR))
3219 return (S_ERROR);
3220 }
3221
3222 /*
3223 * Create a syminfo section if necessary.
3224 */
3225 if (flags & FLG_OF_SYMINFO) {
3226 if ((ofl->ofl_ossyminfo = make_sym_sec(ofl,
3227 MSG_ORIG(MSG_SCN_SUNWSYMINFO), SHT_SUNW_syminfo,
3228 ld_targ.t_id.id_syminfo)) == (Os_desc *)S_ERROR)
3229 return (S_ERROR);
3230 }
3231
3232 if (flags & FLG_OF_COMREL) {
3233 /*
3234 * If -zcombreloc is enabled then all relocations (except for
3235 * the PLT's) are coalesced into a single relocation section.
3236 */
3237 if (ofl->ofl_reloccnt) {
3238 if (make_reloc(ofl, NULL) == S_ERROR)
3239 return (S_ERROR);
3240 }
3241 } else {
3242 Aliste idx1;
3243
3244 /*
3245 * Create the required output relocation sections. Note, new
3246 * sections may be added to the section list that is being
3247 * traversed. These insertions can move the elements of the
3248 * Alist such that a section descriptor is re-read. Recursion
3249 * is prevented by maintaining a previous section pointer and
3250 * insuring that this pointer isn't re-examined.
3251 */
3252 for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
3253 Os_desc *osp, *posp = 0;
3254 Aliste idx2;
3255
3256 for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
3257 if ((osp != posp) && osp->os_szoutrels &&
3258 (osp != ofl->ofl_osplt)) {
3259 if (make_reloc(ofl, osp) == S_ERROR)
3260 return (S_ERROR);
3261 }
3262 posp = osp;
3263 }
3264 }
3265
3266 /*
3267 * If we're not building a combined relocation section, then
3268 * build a .rel[a] section as required.
3269 */
3270 if (ofl->ofl_relocrelsz) {
3271 if (make_reloc(ofl, NULL) == S_ERROR)
3272 return (S_ERROR);
3273 }
3274 }
3275
3276 /*
3277 * The PLT relocations are always in their own section, and we try to
3278 * keep them at the end of the PLT table. We do this to keep the hot
3279 * "data" PLT's at the head of the table nearer the .dynsym & .hash.
3280 */
3281 if (ofl->ofl_osplt && ofl->ofl_relocpltsz) {
3282 if (make_reloc(ofl, ofl->ofl_osplt) == S_ERROR)
3283 return (S_ERROR);
3284 }
3285
3286 /*
3287 * Finally build the symbol and section header sections.
3288 */
3289 if (flags & FLG_OF_DYNAMIC) {
3290 if (make_dynamic(ofl) == S_ERROR)
3291 return (S_ERROR);
3292
3293 /*
3294 * A number of sections aren't necessary within a relocatable
3295 * object, even if -dy has been used.
3296 */
3297 if (!(flags & FLG_OF_RELOBJ)) {
3298 if (make_hash(ofl) == S_ERROR)
3299 return (S_ERROR);
3300 if (make_dynstr(ofl) == S_ERROR)
3301 return (S_ERROR);
3302 if (make_dynsym(ofl) == S_ERROR)
3303 return (S_ERROR);
3304 if (ld_unwind_make_hdr(ofl) == S_ERROR)
3305 return (S_ERROR);
3306 if (make_dynsort(ofl) == S_ERROR)
3307 return (S_ERROR);
3308 }
3309 }
3310
3311 if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ) ||
3312 ((flags & FLG_OF_STATIC) && ofl->ofl_osversym)) {
3313 /*
3314 * Do we need to make a SHT_SYMTAB_SHNDX section
3315 * for the dynsym. If so - do it now.
3316 */
3317 if (ofl->ofl_osdynsym &&
3318 ((ofl->ofl_shdrcnt + 3) >= SHN_LORESERVE)) {
3319 if (make_dynsym_shndx(ofl) == S_ERROR)
3320 return (S_ERROR);
3321 }
3322
3323 if (make_strtab(ofl) == S_ERROR)
3324 return (S_ERROR);
3325 if (make_symtab(ofl) == S_ERROR)
3326 return (S_ERROR);
3327 } else {
3328 /*
3329 * Do we need to make a SHT_SYMTAB_SHNDX section
3330 * for the dynsym. If so - do it now.
3331 */
3332 if (ofl->ofl_osdynsym &&
3333 ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE)) {
3334 if (make_dynsym_shndx(ofl) == S_ERROR)
3335 return (S_ERROR);
3336 }
3337 }
3338
3339 if (make_shstrtab(ofl) == S_ERROR)
3340 return (S_ERROR);
3341
3342 /*
3343 * Now that we've created all output sections, adjust the size of the
3344 * SHT_SUNW_versym and SHT_SUNW_syminfo section, which are dependent on
3345 * the associated symbol table sizes.
3346 */
3347 if (ofl->ofl_osversym || ofl->ofl_ossyminfo) {
3348 ulong_t cnt;
3349 Is_desc *isp;
3350 Os_desc *osp;
3351
3352 if (OFL_IS_STATIC_OBJ(ofl))
3353 osp = ofl->ofl_ossymtab;
3354 else
3355 osp = ofl->ofl_osdynsym;
3356
3357 isp = ld_os_first_isdesc(osp);
3358 cnt = (isp->is_shdr->sh_size / isp->is_shdr->sh_entsize);
3359
3360 if (ofl->ofl_osversym)
3361 update_data_size(ofl->ofl_osversym, cnt);
3362
3363 if (ofl->ofl_ossyminfo)
3364 update_data_size(ofl->ofl_ossyminfo, cnt);
3365 }
3366
3367 /*
3368 * Now that we've created all output sections, adjust the size of the
3369 * SHT_SUNW_capinfo, which is dependent on the associated symbol table
3370 * size.
3371 */
3372 if (ofl->ofl_oscapinfo) {
3373 ulong_t cnt;
3374
3375 /*
3376 * Symbol capabilities symbols are placed directly after the
3377 * STT_FILE symbol, section symbols, and any register symbols.
3378 * Effectively these are the first of any series of demoted
3379 * (scoped) symbols.
3380 */
3381 if (OFL_IS_STATIC_OBJ(ofl))
3382 cnt = SYMTAB_ALL_CNT(ofl);
3383 else
3384 cnt = DYNSYM_ALL_CNT(ofl);
3385
3386 update_data_size(ofl->ofl_oscapinfo, cnt);
3387 }
3388 return (1);
3389 }
3390
3391 /*
3392 * Build an additional data section - used to back OBJT symbol definitions
3393 * added with a mapfile.
3394 */
3395 Is_desc *
ld_make_data(Ofl_desc * ofl,size_t size)3396 ld_make_data(Ofl_desc *ofl, size_t size)
3397 {
3398 Shdr *shdr;
3399 Elf_Data *data;
3400 Is_desc *isec;
3401
3402 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_DATA), 0,
3403 &isec, &shdr, &data) == S_ERROR)
3404 return ((Is_desc *)S_ERROR);
3405
3406 data->d_size = size;
3407 shdr->sh_size = (Xword)size;
3408 shdr->sh_flags |= SHF_WRITE;
3409
3410 if (aplist_append(&ofl->ofl_mapdata, isec, AL_CNT_OFL_MAPSECS) == NULL)
3411 return ((Is_desc *)S_ERROR);
3412
3413 return (isec);
3414 }
3415
3416 /*
3417 * Build an additional text section - used to back FUNC symbol definitions
3418 * added with a mapfile.
3419 */
3420 Is_desc *
ld_make_text(Ofl_desc * ofl,size_t size)3421 ld_make_text(Ofl_desc *ofl, size_t size)
3422 {
3423 Shdr *shdr;
3424 Elf_Data *data;
3425 Is_desc *isec;
3426
3427 /*
3428 * Insure the size is sufficient to contain the minimum return
3429 * instruction.
3430 */
3431 if (size < ld_targ.t_nf.nf_size)
3432 size = ld_targ.t_nf.nf_size;
3433
3434 if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_TEXT), 0,
3435 &isec, &shdr, &data) == S_ERROR)
3436 return ((Is_desc *)S_ERROR);
3437
3438 data->d_size = size;
3439 shdr->sh_size = (Xword)size;
3440 shdr->sh_flags |= SHF_EXECINSTR;
3441
3442 /*
3443 * Fill the buffer with the appropriate return instruction.
3444 * Note that there is no need to swap bytes on a non-native,
3445 * link, as the data being copied is given in bytes.
3446 */
3447 if ((data->d_buf = libld_calloc(size, 1)) == NULL)
3448 return ((Is_desc *)S_ERROR);
3449 (void) memcpy(data->d_buf, ld_targ.t_nf.nf_template,
3450 ld_targ.t_nf.nf_size);
3451
3452 /*
3453 * If size was larger than required, and the target supplies
3454 * a fill function, use it to fill the balance. If there is no
3455 * fill function, we accept the 0-fill supplied by libld_calloc().
3456 */
3457 if ((ld_targ.t_ff.ff_execfill != NULL) && (size > ld_targ.t_nf.nf_size))
3458 ld_targ.t_ff.ff_execfill(data->d_buf, ld_targ.t_nf.nf_size,
3459 size - ld_targ.t_nf.nf_size);
3460
3461 if (aplist_append(&ofl->ofl_maptext, isec, AL_CNT_OFL_MAPSECS) == NULL)
3462 return ((Is_desc *)S_ERROR);
3463
3464 return (isec);
3465 }
3466