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