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