xref: /titanic_41/usr/src/cmd/sgs/libld/common/sections.c (revision 445f2479fe3d7435daab18bf2cdc310b86cd6738)
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 2006 Sun Microsystems, Inc.  All rights reserved.
27  * Use is subject to license terms.
28  */
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 /*
32  * Module sections. Initialize special sections
33  */
34 #include	<string.h>
35 #include	<strings.h>
36 #include	<stdio.h>
37 #include	<link.h>
38 #include	<debug.h>
39 #include	"msg.h"
40 #include	"_libld.h"
41 
42 
43 /*
44  * If -zignore is in effect, scan all input sections to see if there are any
45  * which haven't been referenced (and hence can be discarded).  If sections are
46  * to be discarded, rescan the output relocations and the symbol table and
47  * remove the relocations and symbol entries that are no longer required.
48  *
49  * Note:  It's possible that a section which is being discarded has contributed
50  *	  to the GOT table or the PLT table.  However, we can't at this point
51  *	  eliminate the corresponding entries.  This is because there could well
52  *	  be other sections referencing those same entries, but we don't have
53  *	  the infrastructure to determine this.  So, keep the PLT and GOT
54  *	  entries in the table in case someone wants them.
55  * Note:  The section to be affected needs to be allocatable.
56  *	  So even if -zignore is in effect, if the section is not allocatable,
57  *	  we do not eliminate it.
58  */
59 static uintptr_t
60 ignore_section_processing(Ofl_desc *ofl)
61 {
62 	Listnode	*lnp;
63 	Ifl_desc	*ifl;
64 	Rel_cache	*rcp;
65 
66 	for (LIST_TRAVERSE(&ofl->ofl_objs, lnp, ifl)) {
67 		uint_t	num, discard;
68 
69 		/*
70 		 * Diagnose (-D unused) a completely unreferenced file.
71 		 */
72 		if ((ifl->ifl_flags & FLG_IF_FILEREF) == 0)
73 			DBG_CALL(Dbg_unused_file(ofl->ofl_lml,
74 			    ifl->ifl_name, 0, 0));
75 		if (((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0) ||
76 		    ((ifl->ifl_flags & FLG_IF_IGNORE) == 0))
77 			continue;
78 
79 		/*
80 		 * Before scanning the whole symbol table to determine if
81 		 * symbols should be discard - quickly (relatively) scan the
82 		 * sections to determine if any are to be discarded.
83 		 */
84 		discard = 0;
85 		if (ifl->ifl_flags & FLG_IF_FILEREF) {
86 			for (num = 1; num < ifl->ifl_shnum; num++) {
87 				Is_desc	*isp = ifl->ifl_isdesc[num];
88 				Os_desc *osp;
89 				Sg_desc	*sgp;
90 
91 				if (((isp = ifl->ifl_isdesc[num]) != 0) &&
92 				    ((isp->is_flags & FLG_IS_SECTREF) == 0) &&
93 				    ((osp = isp->is_osdesc) != 0) &&
94 				    ((sgp = osp->os_sgdesc) != 0) &&
95 				    (sgp->sg_phdr.p_type == PT_LOAD)) {
96 					discard++;
97 					break;
98 				}
99 			}
100 		}
101 
102 		/*
103 		 * No sections are to be 'ignored'
104 		 */
105 		if ((discard == 0) && (ifl->ifl_flags & FLG_IF_FILEREF))
106 			continue;
107 
108 		/*
109 		 * We know that we have discarded sections.  Scan the symbol
110 		 * table for this file to determine if symbols need to be
111 		 * discarded that are associated with the 'ignored' sections.
112 		 */
113 		for (num = 1; num < ifl->ifl_symscnt; num++) {
114 			Sym_desc	*sdp;
115 			Sym		*symp;
116 			Os_desc		*osp;
117 			/* LINTED - only used for assert() */
118 			int		err;
119 
120 			sdp = ifl->ifl_oldndx[num];
121 			symp = sdp->sd_sym;
122 
123 			/*
124 			 * If the whole file is being eliminated, remove the
125 			 * local file symbol, and any COMMON symbols (which
126 			 * aren't associated with a section) provided they
127 			 * haven't been referenced by a relocation.
128 			 */
129 			if ((ofl->ofl_flags1 & FLG_OF1_IGNORE) &&
130 			    ((ifl->ifl_flags & FLG_IF_FILEREF) == 0) &&
131 			    ((ELF_ST_TYPE(symp->st_info) == STT_FILE) ||
132 			    ((symp->st_shndx == SHN_COMMON) &&
133 			    ((sdp->sd_flags & FLG_SY_UPREQD) == 0)))) {
134 				if ((ofl->ofl_flags1 & FLG_OF1_REDLSYM) == 0) {
135 					ofl->ofl_locscnt--;
136 					err = st_delstring(ofl->ofl_strtab,
137 					    sdp->sd_name);
138 					assert(err != -1);
139 				}
140 				sdp->sd_flags |= FLG_SY_ISDISC;
141 				continue;
142 			}
143 
144 			/*
145 			 * Skip any undefined, reserved section symbols, already
146 			 * discarded or eliminated symbols.  Also skip any
147 			 * symbols that don't originate from a section, or
148 			 * aren't defined from the file being examined.
149 			 */
150 			if ((symp->st_shndx == SHN_UNDEF) ||
151 			    (symp->st_shndx >= SHN_LORESERVE) ||
152 			    (ELF_ST_TYPE(symp->st_info) == STT_SECTION) ||
153 			    (sdp->sd_flags & FLG_SY_ISDISC) ||
154 			    (sdp->sd_flags1 & FLG_SY1_ELIM) ||
155 			    (sdp->sd_isc == 0) || (sdp->sd_file != ifl))
156 				continue;
157 
158 			/*
159 			 * If any references were made against the section
160 			 * the symbol is being defined in - skip it.
161 			 */
162 			if ((sdp->sd_isc->is_flags & FLG_IS_SECTREF) ||
163 			    ((ifl->ifl_flags & FLG_IF_FILEREF) &&
164 			    ((osp = sdp->sd_isc->is_osdesc) != 0) &&
165 			    (osp->os_sgdesc->sg_phdr.p_type != PT_LOAD)))
166 				continue;
167 
168 			/*
169 			 * Finish processing any local symbols.
170 			 */
171 			if (ELF_ST_BIND(symp->st_info) == STB_LOCAL) {
172 				if (ofl->ofl_flags1 & FLG_OF1_IGNORE) {
173 					if ((ofl->ofl_flags1 &
174 					    FLG_OF1_REDLSYM) == 0) {
175 						ofl->ofl_locscnt--;
176 
177 						err = st_delstring(
178 						    ofl->ofl_strtab,
179 						    sdp->sd_name);
180 						assert(err != -1);
181 					}
182 					sdp->sd_flags |= FLG_SY_ISDISC;
183 				}
184 				DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml,
185 				    sdp, sdp->sd_isc));
186 				continue;
187 			}
188 
189 			/*
190 			 * Global symbols can only be eliminated when an objects
191 			 * interfaces (versioning/scoping) is defined.
192 			 */
193 			if (sdp->sd_flags1 & FLG_SY1_LOCL) {
194 				if (ofl->ofl_flags1 & FLG_OF1_IGNORE) {
195 					ofl->ofl_scopecnt--;
196 					ofl->ofl_elimcnt++;
197 
198 					err = st_delstring(ofl->ofl_strtab,
199 					    sdp->sd_name);
200 					assert(err != -1);
201 
202 					sdp->sd_flags1 |= FLG_SY1_ELIM;
203 				}
204 				DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml,
205 				    sdp, sdp->sd_isc));
206 				continue;
207 			}
208 		}
209 	}
210 
211 	if ((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0)
212 		return (1);
213 
214 	/*
215 	 * Scan all output relocations searching for those against discarded or
216 	 * ignored sections.  If one is found, decrement the total outrel count.
217 	 */
218 	for (LIST_TRAVERSE(&ofl->ofl_outrels, lnp, rcp)) {
219 		Rel_desc	*orsp;
220 		Os_desc		*relosp;
221 
222 		/* LINTED */
223 		for (orsp = (Rel_desc *)(rcp + 1);
224 		    orsp < rcp->rc_free; orsp++) {
225 			Is_desc		*_isdesc = orsp->rel_isdesc;
226 			uint_t		flags, entsize;
227 			Shdr		*shdr;
228 			Ifl_desc	*ifl;
229 
230 			if ((_isdesc == 0) ||
231 			    ((_isdesc->is_flags & (FLG_IS_SECTREF))) ||
232 			    ((ifl = _isdesc->is_file) == 0) ||
233 			    ((ifl->ifl_flags & FLG_IF_IGNORE) == 0) ||
234 			    ((shdr = _isdesc->is_shdr) == 0) ||
235 			    ((shdr->sh_flags & SHF_ALLOC) == 0))
236 				continue;
237 
238 			flags = orsp->rel_flags;
239 
240 			if (flags & (FLG_REL_GOT | FLG_REL_BSS |
241 			    FLG_REL_NOINFO | FLG_REL_PLT))
242 				continue;
243 
244 			relosp = orsp->rel_osdesc;
245 
246 			if (orsp->rel_flags & FLG_REL_RELA)
247 				entsize = sizeof (Rela);
248 			else
249 				entsize = sizeof (Rel);
250 
251 			assert(relosp->os_szoutrels > 0);
252 			relosp->os_szoutrels -= entsize;
253 
254 			if (!(flags & FLG_REL_PLT))
255 				ofl->ofl_reloccntsub++;
256 
257 			if (orsp->rel_rtype == M_R_RELATIVE)
258 				ofl->ofl_relocrelcnt--;
259 		}
260 	}
261 	return (1);
262 }
263 
264 /*
265  * Build a .bss section for allocation of tentative definitions.  Any `static'
266  * .bss definitions would have been associated to their own .bss sections and
267  * thus collected from the input files.  `global' .bss definitions are tagged
268  * as COMMON and do not cause any associated .bss section elements to be
269  * generated.  Here we add up all these COMMON symbols and generate the .bss
270  * section required to represent them.
271  */
272 uintptr_t
273 ld_make_bss(Ofl_desc *ofl, Xword size, Xword align, Bss_Type which)
274 {
275 	Shdr		*shdr;
276 	Elf_Data	*data;
277 	Is_desc		*isec;
278 	Os_desc		*osp;
279 	uint_t		ident;
280 	Xword		rsize = (Xword)ofl->ofl_relocbsssz;
281 
282 	/*
283 	 * Allocate and initialize the Elf_Data structure.
284 	 */
285 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
286 		return (S_ERROR);
287 	data->d_type = ELF_T_BYTE;
288 	data->d_size = (size_t)size;
289 	data->d_align = (size_t)align;
290 	data->d_version = ofl->ofl_dehdr->e_version;
291 
292 	/*
293 	 * Allocate and initialize the Shdr structure.
294 	 */
295 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
296 		return (S_ERROR);
297 	shdr->sh_type = SHT_NOBITS;
298 	shdr->sh_flags = SHF_ALLOC | SHF_WRITE;
299 	shdr->sh_size = size;
300 	shdr->sh_addralign = align;
301 
302 	/*
303 	 * Allocate and initialize the Is_desc structure.
304 	 */
305 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
306 		return (S_ERROR);
307 
308 	isec->is_shdr = shdr;
309 	isec->is_indata = data;
310 
311 	if (which == MAKE_TLS) {
312 		isec->is_name = MSG_ORIG(MSG_SCN_TBSS);
313 		ident = M_ID_TLSBSS;
314 		ofl->ofl_istlsbss = isec;
315 		shdr->sh_flags |= SHF_TLS;
316 	} else if (which == MAKE_BSS) {
317 		isec->is_name = MSG_ORIG(MSG_SCN_BSS);
318 		ofl->ofl_isbss = isec;
319 		ident = M_ID_BSS;
320 
321 #if	(defined(__i386) || defined(__amd64)) && defined(_ELF64)
322 	} else if (which == MAKE_LBSS) {
323 		isec->is_name = MSG_ORIG(MSG_SCN_LBSS);
324 		ofl->ofl_islbss = isec;
325 		ident = M_ID_LBSS;
326 		shdr->sh_flags |= SHF_AMD64_LARGE;
327 #endif
328 	}
329 
330 	/*
331 	 * Retain this .bss input section as this will be where global
332 	 * symbol references are added.
333 	 */
334 	if ((osp = ld_place_section(ofl, isec, ident, 0)) == (Os_desc *)S_ERROR)
335 		return (S_ERROR);
336 
337 	/*
338 	 * If relocations exist against .*bss section, a
339 	 * section symbol must be created for the section in
340 	 * the .dynsym symbol table.
341 	 */
342 	if (!(osp->os_flags & FLG_OS_OUTREL)) {
343 		Word	flagtotest;
344 		if (which == MAKE_TLS)
345 			flagtotest = FLG_OF1_TLSOREL;
346 		else
347 			flagtotest = FLG_OF1_BSSOREL;
348 
349 		if (ofl->ofl_flags1 & flagtotest) {
350 			ofl->ofl_dynshdrcnt++;
351 			osp->os_flags |= FLG_OS_OUTREL;
352 		}
353 	}
354 
355 	osp->os_szoutrels = rsize;
356 
357 	return (1);
358 }
359 
360 
361 /*
362  * Build a SHT_{INIT|FINI|PREINIT}ARRAY section (specified via
363  * ld -z *array=name
364  */
365 static uintptr_t
366 make_array(Ofl_desc *ofl, Word shtype, const char *sectname, List *list)
367 {
368 	uint_t		entcount;
369 	Listnode	*lnp;
370 	Elf_Data	*data;
371 	Is_desc		*isec;
372 	Shdr		*shdr;
373 	Sym_desc	*sdp;
374 	Rel_desc	reld;
375 	Rela		reloc;
376 	Os_desc		*osp;
377 
378 	if (list->head == NULL)
379 		return (1);
380 
381 	entcount = 0;
382 	for (LIST_TRAVERSE(list, lnp, sdp))
383 		entcount++;
384 
385 	/*
386 	 * Allocate and initialize the Elf_Data structure.
387 	 */
388 	if (((data = libld_calloc(sizeof (Elf_Data), 1)) == 0) ||
389 	    ((data->d_buf = libld_calloc(sizeof (Addr), entcount)) == 0))
390 		return (S_ERROR);
391 
392 	data->d_type = ELF_T_ADDR;
393 	data->d_size = sizeof (Addr) * entcount;
394 	data->d_align = sizeof (Addr);
395 	data->d_version = ofl->ofl_dehdr->e_version;
396 
397 	/*
398 	 * Allocate and initialize the Shdr structure.
399 	 */
400 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
401 		return (S_ERROR);
402 	shdr->sh_type = shtype;
403 	shdr->sh_size = (Xword)data->d_size;
404 	shdr->sh_entsize = sizeof (Addr);
405 	shdr->sh_addralign = (Xword)data->d_align;
406 	shdr->sh_flags = SHF_ALLOC | SHF_WRITE;
407 
408 	/*
409 	 * Allocate and initialize the Is_desc structure.
410 	 */
411 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
412 		return (S_ERROR);
413 	isec->is_name = sectname;
414 	isec->is_shdr = shdr;
415 	isec->is_indata = data;
416 
417 	if (ld_place_section(ofl, isec, M_ID_ARRAY, 0) == (Os_desc *)S_ERROR)
418 		return (S_ERROR);
419 
420 	osp = isec->is_osdesc;
421 
422 	if ((ofl->ofl_osinitarray == 0) && (shtype == SHT_INIT_ARRAY))
423 		ofl->ofl_osinitarray = osp;
424 	if ((ofl->ofl_ospreinitarray == 0) && (shtype == SHT_PREINIT_ARRAY))
425 		ofl->ofl_ospreinitarray = osp;
426 	else if ((ofl->ofl_osfiniarray == 0) && (shtype == SHT_FINI_ARRAY))
427 		ofl->ofl_osfiniarray = osp;
428 
429 	/*
430 	 * Create relocations against this section to initialize it to the
431 	 * function addresses.
432 	 */
433 	reld.rel_osdesc = osp;
434 	reld.rel_isdesc = isec;
435 	reld.rel_move = 0;
436 	reld.rel_flags = FLG_REL_LOAD;
437 
438 	/*
439 	 * Fabricate the relocation information (as if a relocation record had
440 	 * been input - see init_rel()).
441 	 */
442 	reld.rel_rtype = M_R_ARRAYADDR;
443 	reld.rel_roffset = 0;
444 	reld.rel_raddend = 0;
445 	reld.rel_typedata = 0;
446 
447 	/*
448 	 * Create a minimal relocation record to satisfy process_sym_reloc()
449 	 * debugging requirements.
450 	 */
451 	reloc.r_offset = 0;
452 	reloc.r_info = ELF_R_INFO(0, M_R_ARRAYADDR);
453 	reloc.r_addend = 0;
454 
455 	DBG_CALL(Dbg_reloc_generate(ofl->ofl_lml, osp, M_REL_SHT_TYPE));
456 	for (LIST_TRAVERSE(list, lnp, sdp)) {
457 		reld.rel_sname = sdp->sd_name;
458 		reld.rel_sym = sdp;
459 
460 		if (ld_process_sym_reloc(ofl, &reld, (Rel *)&reloc, isec,
461 		    MSG_INTL(MSG_STR_COMMAND)) == S_ERROR)
462 			return (S_ERROR);
463 
464 		reld.rel_roffset += (Xword)sizeof (Addr);
465 		reloc.r_offset = reld.rel_roffset;
466 	}
467 
468 	return (1);
469 }
470 
471 /*
472  * Build a comment section (-Qy option).
473  */
474 static uintptr_t
475 make_comment(Ofl_desc *ofl)
476 {
477 	Shdr		*shdr;
478 	Elf_Data	*data;
479 	Is_desc		*isec;
480 
481 	/*
482 	 * Allocate and initialize the Elf_Data structure.
483 	 */
484 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
485 		return (S_ERROR);
486 	data->d_type = ELF_T_BYTE;
487 	data->d_buf = (void *)ofl->ofl_sgsid;
488 	data->d_size = strlen(ofl->ofl_sgsid) + 1;
489 	data->d_align = 1;
490 	data->d_version = ofl->ofl_dehdr->e_version;
491 
492 	/*
493 	 * Allocate and initialize the Shdr structure.
494 	 */
495 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
496 		return (S_ERROR);
497 	shdr->sh_type = SHT_PROGBITS;
498 	shdr->sh_size = (Xword)data->d_size;
499 	shdr->sh_addralign = 1;
500 
501 	/*
502 	 * Allocate and initialize the Is_desc structure.
503 	 */
504 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
505 		return (S_ERROR);
506 	isec->is_name = MSG_ORIG(MSG_SCN_COMMENT);
507 	isec->is_shdr = shdr;
508 	isec->is_indata = data;
509 
510 	return ((uintptr_t)ld_place_section(ofl, isec, M_ID_NOTE, 0));
511 }
512 
513 /*
514  * Make the dynamic section.  Calculate the size of any strings referenced
515  * within this structure, they will be added to the global string table
516  * (.dynstr).  This routine should be called before make_dynstr().
517  */
518 static uintptr_t
519 make_dynamic(Ofl_desc *ofl)
520 {
521 	Shdr		*shdr;
522 	Os_desc		*osp;
523 	Elf_Data	*data;
524 	Is_desc		*isec;
525 	size_t		cnt = 0;
526 	Listnode	*lnp;
527 	Ifl_desc	*ifl;
528 	Sym_desc	*sdp;
529 	size_t		size;
530 	Word		flags = ofl->ofl_flags;
531 	int		unused = 0;
532 
533 	/*
534 	 * Allocate and initialize the Shdr structure.
535 	 */
536 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
537 		return (S_ERROR);
538 	shdr->sh_type = SHT_DYNAMIC;
539 	shdr->sh_flags = SHF_WRITE;
540 	if (!(flags & FLG_OF_RELOBJ))
541 		shdr->sh_flags |= SHF_ALLOC;
542 	shdr->sh_addralign = M_WORD_ALIGN;
543 	if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_DYN, 1,
544 	    ofl->ofl_dehdr->e_version)) == 0) {
545 		eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE),
546 		    ofl->ofl_name);
547 		return (S_ERROR);
548 	}
549 
550 	/*
551 	 * Allocate and initialize the Elf_Data structure.
552 	 */
553 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
554 		return (S_ERROR);
555 	data->d_type = ELF_T_DYN;
556 	data->d_size = 0;
557 	data->d_align = M_WORD_ALIGN;
558 	data->d_version = ofl->ofl_dehdr->e_version;
559 
560 	/*
561 	 * Allocate and initialize the Is_desc structure.
562 	 */
563 	if ((isec = libld_calloc(1, sizeof (Is_desc))) ==
564 	    (Is_desc *)0)
565 		return (S_ERROR);
566 	isec->is_name = MSG_ORIG(MSG_SCN_DYNAMIC);
567 	isec->is_shdr = shdr;
568 	isec->is_indata = data;
569 
570 	osp = ofl->ofl_osdynamic = ld_place_section(ofl, isec, M_ID_DYNAMIC, 0);
571 
572 	/*
573 	 * Reserve entries for any needed dependencies.
574 	 */
575 	for (LIST_TRAVERSE(&ofl->ofl_sos, lnp, ifl)) {
576 		Sdf_desc *	sdf;
577 
578 		if (!(ifl->ifl_flags & (FLG_IF_NEEDED | FLG_IF_NEEDSTR)))
579 			continue;
580 
581 		/*
582 		 * If this dependency didn't satisfy any symbol references,
583 		 * generate a debugging diagnostic (ld(1) -Dunused can be used
584 		 * to display these).  If this is a standard needed dependency,
585 		 * and -z ignore is in effect, drop the dependency.  Explicitly
586 		 * defined dependencies (i.e., -N dep) don't get dropped, and
587 		 * are flagged as being required to simplify update_odynamic()
588 		 * processing.
589 		 */
590 		if ((ifl->ifl_flags & FLG_IF_NEEDSTR) ||
591 		    ((ifl->ifl_flags & FLG_IF_DEPREQD) == 0)) {
592 			if (unused++ == 0)
593 				DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD));
594 			DBG_CALL(Dbg_unused_file(ofl->ofl_lml, ifl->ifl_soname,
595 			    (ifl->ifl_flags & FLG_IF_NEEDSTR), 0));
596 
597 			if (ifl->ifl_flags & FLG_IF_NEEDSTR)
598 				ifl->ifl_flags |= FLG_IF_DEPREQD;
599 			else if (ifl->ifl_flags & FLG_IF_IGNORE)
600 				continue;
601 		}
602 
603 		/*
604 		 * If this object has an accompanying shared object definition
605 		 * determine if an alternative shared object name has been
606 		 * specified.
607 		 */
608 		if (((sdf = ifl->ifl_sdfdesc) != 0) &&
609 		    (sdf->sdf_flags & FLG_SDF_SONAME))
610 			ifl->ifl_soname = sdf->sdf_soname;
611 
612 		/*
613 		 * If this object is a lazyload reserve a DT_POSFLAG1 entry.
614 		 */
615 		if (ifl->ifl_flags & (FLG_IF_LAZYLD | FLG_IF_GRPPRM))
616 			cnt++;
617 
618 		if (st_insert(ofl->ofl_dynstrtab, ifl->ifl_soname) == -1)
619 			return (S_ERROR);
620 		cnt++;
621 
622 		/*
623 		 * If the needed entry contains the $ORIGIN token make sure
624 		 * the associated DT_1_FLAGS entry is created.
625 		 */
626 		if (strstr(ifl->ifl_soname, MSG_ORIG(MSG_STR_ORIGIN))) {
627 			ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
628 			ofl->ofl_dtflags |= DF_ORIGIN;
629 		}
630 	}
631 
632 	if (unused)
633 		DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD));
634 
635 	/*
636 	 * Reserve entries for any per-symbol auxiliary/filter strings.
637 	 */
638 	if (ofl->ofl_dtsfltrs) {
639 		/* LINTED */
640 		Dfltr_desc *	dftp;
641 		Aliste		off;
642 
643 		for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, off, dftp))
644 			cnt++;
645 	}
646 
647 	/*
648 	 * Reserve entries for any _init() and _fini() section addresses.
649 	 */
650 	if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U),
651 	    SYM_NOHASH, 0, ofl)) != NULL) && sdp->sd_ref == REF_REL_NEED) {
652 		sdp->sd_flags |= FLG_SY_UPREQD;
653 		cnt++;
654 	}
655 	if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U),
656 	    SYM_NOHASH, 0, ofl)) != NULL) && sdp->sd_ref == REF_REL_NEED) {
657 		sdp->sd_flags |= FLG_SY_UPREQD;
658 		cnt++;
659 	}
660 
661 	/*
662 	 * Reserve entries for any soname, filter name (shared libs only),
663 	 * run-path pointers, cache names and audit requirements..
664 	 */
665 	if (ofl->ofl_soname) {
666 		cnt++;
667 		if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_soname) == -1)
668 			return (S_ERROR);
669 	}
670 	if (ofl->ofl_filtees) {
671 		cnt++;
672 		if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_filtees) == -1)
673 			return (S_ERROR);
674 
675 		/*
676 		 * If the filtees entry contains the $ORIGIN token make sure
677 		 * the associated DT_1_FLAGS entry is created.
678 		 */
679 		if (strstr(ofl->ofl_filtees, MSG_ORIG(MSG_STR_ORIGIN))) {
680 			ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
681 			ofl->ofl_dtflags |= DF_ORIGIN;
682 		}
683 	}
684 	if (ofl->ofl_rpath) {
685 		cnt += 2;	/* DT_RPATH & DT_RUNPATH */
686 		if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_rpath) == -1)
687 			return (S_ERROR);
688 
689 		/*
690 		 * If the rpath entry contains the $ORIGIN token make sure
691 		 * the associated DT_1_FLAGS entry is created.
692 		 */
693 		if (strstr(ofl->ofl_rpath, MSG_ORIG(MSG_STR_ORIGIN))) {
694 			ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
695 			ofl->ofl_dtflags |= DF_ORIGIN;
696 		}
697 	}
698 	if (ofl->ofl_config) {
699 		cnt++;
700 		if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_config) == -1)
701 			return (S_ERROR);
702 
703 		/*
704 		 * If the config entry contains the $ORIGIN token make sure
705 		 * the associated DT_1_FLAGS entry is created.
706 		 */
707 		if (strstr(ofl->ofl_config, MSG_ORIG(MSG_STR_ORIGIN))) {
708 			ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
709 			ofl->ofl_dtflags |= DF_ORIGIN;
710 		}
711 	}
712 	if (ofl->ofl_depaudit) {
713 		cnt++;
714 		if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_depaudit) == -1)
715 			return (S_ERROR);
716 	}
717 	if (ofl->ofl_audit) {
718 		cnt++;
719 		if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_audit) == -1)
720 			return (S_ERROR);
721 	}
722 
723 
724 	/*
725 	 * The following DT_* entries do not apply to relocatable objects
726 	 */
727 	if (!(ofl->ofl_flags & FLG_OF_RELOBJ)) {
728 		/*
729 		 * Reserve entries for the HASH, STRTAB, STRSZ, SYMTAB, SYMENT,
730 		 * and CHECKSUM.
731 		 */
732 		cnt += 6;
733 
734 		if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) ==
735 		    FLG_OF_VERDEF)
736 			cnt += 2;		/* DT_VERDEF & DT_VERDEFNUM */
737 
738 		if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) ==
739 		    FLG_OF_VERNEED)
740 			cnt += 2;		/* DT_VERNEED & DT_VERNEEDNUM */
741 
742 		if ((ofl->ofl_flags1 & FLG_OF1_RELCNT) &&
743 		    ofl->ofl_relocrelcnt)	/* RELACOUNT */
744 			cnt++;
745 
746 		if (flags & FLG_OF_TEXTREL)	/* TEXTREL */
747 			cnt++;
748 
749 		if (ofl->ofl_osfiniarray)	/* FINI_ARRAY & FINI_ARRAYSZ */
750 			cnt += 2;
751 
752 		if (ofl->ofl_osinitarray)	/* INIT_ARRAY & INIT_ARRAYSZ */
753 			cnt += 2;
754 
755 		if (ofl->ofl_ospreinitarray)	/* PREINIT_ARRAY & */
756 			cnt += 2;		/*	PREINIT_ARRAYSZ */
757 
758 		/*
759 		 * If we have plt's reserve a PLT, PLTSZ, PLTREL and JMPREL.
760 		 */
761 		if (ofl->ofl_pltcnt)
762 			cnt += 3;
763 
764 		/*
765 		 * If pltpadding is needed (Sparcv9)
766 		 */
767 		if (ofl->ofl_pltpad)
768 			cnt += 2;		/* DT_PLTPAD & DT_PLTPADSZ */
769 
770 		/*
771 		 * If we have any relocations reserve a REL, RELSZ and
772 		 * RELENT entry.
773 		 */
774 		if (ofl->ofl_relocsz)
775 			cnt += 3;
776 
777 		/*
778 		 * If a syminfo section is required create SYMINFO, SYMINSZ,
779 		 * and SYMINENT entries.
780 		 */
781 		if (ofl->ofl_flags & FLG_OF_SYMINFO)
782 			cnt += 3;
783 
784 		/*
785 		 * If there are any partially initialized sections allocate
786 		 * MOVEENT, MOVESZ and MOVETAB.
787 		 */
788 		if (ofl->ofl_osmove)
789 			cnt += 3;
790 
791 		/*
792 		 * Allocate one DT_REGISTER entry for ever register symbol.
793 		 */
794 		cnt += ofl->ofl_regsymcnt;
795 
796 		/*
797 		 * Reserve a entry for each '-zrtldinfo=...' specified
798 		 * on the command line.
799 		 */
800 		for (LIST_TRAVERSE(&ofl->ofl_rtldinfo, lnp, sdp))
801 			cnt++;
802 
803 		/*
804 		 * These two entries should only be placed in a segment
805 		 * which is writable.  If it's a read-only segment
806 		 * (due to mapfile magic, e.g. libdl.so.1) then don't allocate
807 		 * these entries.
808 		 */
809 		if ((osp->os_sgdesc) &&
810 		    (osp->os_sgdesc->sg_phdr.p_flags & PF_W)) {
811 			cnt++;			/* FEATURE_1 */
812 
813 			if (ofl->ofl_osinterp)
814 				cnt++;		/* DEBUG */
815 		}
816 
817 		/*
818 		 * Any hardware/software capabilities?
819 		 */
820 		if (ofl->ofl_oscap)
821 			cnt++;			/* SUNW_CAP */
822 	}
823 
824 	if (flags & FLG_OF_SYMBOLIC)
825 		cnt++;				/* SYMBOLIC */
826 
827 	/*
828 	 * Account for Architecture dependent .dynamic entries, and defaults.
829 	 */
830 	ld_mach_make_dynamic(ofl, &cnt);
831 
832 	cnt += 3;				/* DT_FLAGS, DT_FLAGS_1, */
833 						/*   and DT_NULL */
834 
835 	/*
836 	 * Determine the size of the section from the number of entries.
837 	 */
838 	size = cnt * (size_t)shdr->sh_entsize;
839 
840 	shdr->sh_size = (Xword)size;
841 	data->d_size = size;
842 
843 	return ((uintptr_t)ofl->ofl_osdynamic);
844 }
845 
846 /*
847  * Build the GOT section and its associated relocation entries.
848  */
849 uintptr_t
850 ld_make_got(Ofl_desc *ofl)
851 {
852 	Shdr		*shdr;
853 	Elf_Data	*data;
854 	Is_desc		*isec;
855 	size_t		size = (size_t)ofl->ofl_gotcnt * M_GOT_ENTSIZE;
856 	size_t		rsize = (size_t)ofl->ofl_relocgotsz;
857 
858 	/*
859 	 * Allocate and initialize the Elf_Data structure.
860 	 */
861 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
862 		return (S_ERROR);
863 	data->d_type = ELF_T_BYTE;
864 	data->d_size = size;
865 	data->d_align = M_WORD_ALIGN;
866 	data->d_version = ofl->ofl_dehdr->e_version;
867 
868 	/*
869 	 * Allocate and initialize the Shdr structure.
870 	 */
871 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
872 		return (S_ERROR);
873 	shdr->sh_type = SHT_PROGBITS;
874 	shdr->sh_flags = SHF_ALLOC | SHF_WRITE;
875 	shdr->sh_size = (Xword)size;
876 	shdr->sh_addralign = M_WORD_ALIGN;
877 	shdr->sh_entsize = M_GOT_ENTSIZE;
878 
879 	/*
880 	 * Allocate and initialize the Is_desc structure.
881 	 */
882 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
883 		return (S_ERROR);
884 	isec->is_name = MSG_ORIG(MSG_SCN_GOT);
885 	isec->is_shdr = shdr;
886 	isec->is_indata = data;
887 
888 	if ((ofl->ofl_osgot = ld_place_section(ofl, isec, M_ID_GOT, 0)) ==
889 	    (Os_desc *)S_ERROR)
890 		return (S_ERROR);
891 
892 	ofl->ofl_osgot->os_szoutrels = (Xword)rsize;
893 
894 	return (1);
895 }
896 
897 /*
898  * Build an interp section.
899  */
900 static uintptr_t
901 make_interp(Ofl_desc *ofl)
902 {
903 	Shdr		*shdr;
904 	Elf_Data	*data;
905 	Is_desc		*isec;
906 	const char	*iname = ofl->ofl_interp;
907 	size_t		size;
908 
909 	/*
910 	 * We always build an .interp section for dynamic executables.  However
911 	 * if the user has specifically specified an interpretor we'll build
912 	 * this section for any output (presumably the user knows what they are
913 	 * doing. refer ABI section 5-4, and ld.1 man page use of -I).
914 	 */
915 	if (((ofl->ofl_flags & (FLG_OF_DYNAMIC | FLG_OF_EXEC |
916 	    FLG_OF_RELOBJ)) != (FLG_OF_DYNAMIC | FLG_OF_EXEC)) && !iname)
917 		return (1);
918 
919 	/*
920 	 * In the case of a dynamic executable supply a default interpretor
921 	 * if a specific interpreter has not been specified.
922 	 */
923 	if (iname == 0) {
924 		if (ofl->ofl_dehdr->e_machine == EM_SPARCV9)
925 			iname = ofl->ofl_interp =
926 			    MSG_ORIG(MSG_PTH_RTLD_SPARCV9);
927 		else if (ofl->ofl_dehdr->e_machine == EM_AMD64)
928 			iname = ofl->ofl_interp =
929 			    MSG_ORIG(MSG_PTH_RTLD_AMD64);
930 		else
931 			iname = ofl->ofl_interp = MSG_ORIG(MSG_PTH_RTLD);
932 	}
933 
934 	size = strlen(iname) + 1;
935 
936 	/*
937 	 * Allocate and initialize the Elf_Data structure.
938 	 */
939 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
940 		return (S_ERROR);
941 	data->d_type = ELF_T_BYTE;
942 	data->d_size = size;
943 	data->d_version = ofl->ofl_dehdr->e_version;
944 
945 	/*
946 	 * Allocate and initialize the Shdr structure.
947 	 */
948 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
949 		return (S_ERROR);
950 	shdr->sh_type = SHT_PROGBITS;
951 	shdr->sh_flags = SHF_ALLOC;
952 	shdr->sh_size = (Xword)size;
953 
954 	/*
955 	 * Allocate and initialize the Is_desc structure.
956 	 */
957 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
958 		return (S_ERROR);
959 	isec->is_name = MSG_ORIG(MSG_SCN_INTERP);
960 	isec->is_shdr = shdr;
961 	isec->is_indata = data;
962 
963 	ofl->ofl_osinterp = ld_place_section(ofl, isec, M_ID_INTERP, 0);
964 	return ((uintptr_t)ofl->ofl_osinterp);
965 }
966 
967 /*
968  * Build a hardware/software capabilities section.
969  */
970 static uintptr_t
971 make_cap(Ofl_desc *ofl)
972 {
973 	Shdr		*shdr;
974 	Elf_Data	*data;
975 	Is_desc		*isec;
976 	Os_desc		*osec;
977 	Cap		*cap;
978 	size_t		size = 0;
979 
980 	/*
981 	 * Determine how many entries are required.
982 	 */
983 	if (ofl->ofl_hwcap_1)
984 		size++;
985 	if (ofl->ofl_sfcap_1)
986 		size++;
987 	if (size == 0)
988 		return (1);
989 	size++;				/* Add CA_SUNW_NULL */
990 
991 	/*
992 	 * Allocate and initialize the Elf_Data structure.
993 	 */
994 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
995 		return (S_ERROR);
996 	data->d_type = ELF_T_CAP;
997 	data->d_version = ofl->ofl_dehdr->e_version;
998 	data->d_align = M_WORD_ALIGN;
999 
1000 	/*
1001 	 * Allocate and initialize the Shdr structure.
1002 	 */
1003 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1004 		return (S_ERROR);
1005 	shdr->sh_type = SHT_SUNW_cap;
1006 	shdr->sh_flags = SHF_ALLOC;
1007 	shdr->sh_addralign = M_WORD_ALIGN;
1008 	if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_CAP, 1,
1009 	    ofl->ofl_dehdr->e_version)) == 0) {
1010 		eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE),
1011 		    ofl->ofl_name);
1012 		return (S_ERROR);
1013 	}
1014 
1015 	/*
1016 	 * Allocate and initialize the Is_desc structure.
1017 	 */
1018 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1019 		return (S_ERROR);
1020 	isec->is_name = MSG_ORIG(MSG_SCN_SUNWCAP);
1021 	isec->is_shdr = shdr;
1022 	isec->is_indata = data;
1023 
1024 	/*
1025 	 * Determine the size of the section, and create the data.
1026 	 */
1027 	size = size * (size_t)shdr->sh_entsize;
1028 	shdr->sh_size = (Xword)size;
1029 	data->d_size = size;
1030 	if ((data->d_buf = libld_malloc(size)) == 0)
1031 		return (S_ERROR);
1032 
1033 	cap = (Cap *)data->d_buf;
1034 	if (ofl->ofl_hwcap_1) {
1035 		cap->c_tag = CA_SUNW_HW_1;
1036 		cap->c_un.c_val = ofl->ofl_hwcap_1;
1037 		cap++;
1038 	}
1039 	if (ofl->ofl_sfcap_1) {
1040 		cap->c_tag = CA_SUNW_SF_1;
1041 		cap->c_un.c_val = ofl->ofl_sfcap_1;
1042 		cap++;
1043 	}
1044 	cap->c_tag = CA_SUNW_NULL;
1045 	cap->c_un.c_val = 0;
1046 
1047 	/*
1048 	 * If we're not creating a relocatable object, save the output section
1049 	 * to trigger the creation of an associated  a program header.
1050 	 */
1051 	osec = ld_place_section(ofl, isec, M_ID_CAP, 0);
1052 	if ((ofl->ofl_flags & FLG_OF_RELOBJ) == 0)
1053 		ofl->ofl_oscap = osec;
1054 
1055 	return ((uintptr_t)osec);
1056 }
1057 
1058 /*
1059  * Build the PLT section and its associated relocation entries.
1060  */
1061 static uintptr_t
1062 make_plt(Ofl_desc *ofl)
1063 {
1064 	Shdr		*shdr;
1065 	Elf_Data	*data;
1066 	Is_desc		*isec;
1067 	size_t		size = (size_t)M_PLT_RESERVSZ +
1068 				(((size_t)ofl->ofl_pltcnt +
1069 				(size_t)ofl->ofl_pltpad) * M_PLT_ENTSIZE);
1070 	size_t		rsize = (size_t)ofl->ofl_relocpltsz;
1071 
1072 #if	defined(sparc)
1073 	/*
1074 	 * Account for the NOP at the end of the plt.
1075 	 */
1076 	size += sizeof (Word);
1077 #endif
1078 
1079 	/*
1080 	 * Allocate and initialize the Elf_Data structure.
1081 	 */
1082 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1083 		return (S_ERROR);
1084 	data->d_type = ELF_T_BYTE;
1085 	data->d_size = size;
1086 	data->d_align = M_PLT_ALIGN;
1087 	data->d_version = ofl->ofl_dehdr->e_version;
1088 
1089 	/*
1090 	 * Allocate and initialize the Shdr structure.
1091 	 */
1092 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1093 		return (S_ERROR);
1094 	shdr->sh_type = SHT_PROGBITS;
1095 	shdr->sh_flags = M_PLT_SHF_FLAGS;
1096 	shdr->sh_size = (Xword)size;
1097 	shdr->sh_addralign = M_PLT_ALIGN;
1098 	shdr->sh_entsize = M_PLT_ENTSIZE;
1099 
1100 	/*
1101 	 * Allocate and initialize the Is_desc structure.
1102 	 */
1103 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == (Is_desc *)0)
1104 		return (S_ERROR);
1105 	isec->is_name = MSG_ORIG(MSG_SCN_PLT);
1106 	isec->is_shdr = shdr;
1107 	isec->is_indata = data;
1108 
1109 	if ((ofl->ofl_osplt = ld_place_section(ofl, isec, M_ID_PLT, 0)) ==
1110 	    (Os_desc *)S_ERROR)
1111 		return (S_ERROR);
1112 
1113 	ofl->ofl_osplt->os_szoutrels = (Xword)rsize;
1114 
1115 	return (1);
1116 }
1117 
1118 /*
1119  * Make the hash table.  Only built for dynamic executables and shared
1120  * libraries, and provides hashed lookup into the global symbol table
1121  * (.dynsym) for the run-time linker to resolve symbol lookups.
1122  */
1123 static uintptr_t
1124 make_hash(Ofl_desc *ofl)
1125 {
1126 	Shdr		*shdr;
1127 	Elf_Data	*data;
1128 	Is_desc		*isec;
1129 	size_t		size;
1130 	Word		nsyms = ofl->ofl_globcnt;
1131 	size_t		cnt;
1132 
1133 	/*
1134 	 * Allocate and initialize the Elf_Data structure.
1135 	 */
1136 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1137 		return (S_ERROR);
1138 	data->d_type = ELF_T_WORD;
1139 	data->d_align = M_WORD_ALIGN;
1140 	data->d_version = ofl->ofl_dehdr->e_version;
1141 
1142 	/*
1143 	 * Allocate and initialize the Shdr structure.
1144 	 */
1145 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1146 		return (S_ERROR);
1147 	shdr->sh_type = SHT_HASH;
1148 	shdr->sh_flags = SHF_ALLOC;
1149 	shdr->sh_addralign = M_WORD_ALIGN;
1150 	if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_WORD, 1,
1151 	    ofl->ofl_dehdr->e_version)) == 0) {
1152 		eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE),
1153 		    ofl->ofl_name);
1154 		return (S_ERROR);
1155 	}
1156 
1157 	/*
1158 	 * Allocate and initialize the Is_desc structure.
1159 	 */
1160 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1161 		return (S_ERROR);
1162 	isec->is_name = MSG_ORIG(MSG_SCN_HASH);
1163 	isec->is_shdr = shdr;
1164 	isec->is_indata = data;
1165 
1166 	/*
1167 	 * Place the section first since it will affect the local symbol
1168 	 * count.
1169 	 */
1170 	if ((ofl->ofl_oshash = ld_place_section(ofl, isec, M_ID_HASH, 0)) ==
1171 	    (Os_desc *)S_ERROR)
1172 		return (S_ERROR);
1173 
1174 	/*
1175 	 * Calculate the number of output hash buckets.
1176 	 */
1177 	ofl->ofl_hashbkts = findprime(nsyms);
1178 
1179 	/*
1180 	 * The size of the hash table is determined by
1181 	 *
1182 	 *	i.	the initial nbucket and nchain entries (2)
1183 	 *	ii.	the number of buckets (calculated above)
1184 	 *	iii.	the number of chains (this is based on the number of
1185 	 *		symbols in the .dynsym array + NULL symbol).
1186 	 */
1187 	cnt = 2 + ofl->ofl_hashbkts + (ofl->ofl_dynshdrcnt +
1188 		ofl->ofl_globcnt + ofl->ofl_lregsymcnt + 1);
1189 	size = cnt * shdr->sh_entsize;
1190 
1191 	/*
1192 	 * Finalize the section header and data buffer initialization.
1193 	 */
1194 	if ((data->d_buf = libld_calloc(size, 1)) == 0)
1195 		return (S_ERROR);
1196 	data->d_size = size;
1197 	shdr->sh_size = (Xword)size;
1198 
1199 	return (1);
1200 }
1201 
1202 /*
1203  * Generate the standard symbol table.  Contains all locals and globals,
1204  * and resides in a non-allocatable section (ie. it can be stripped).
1205  */
1206 static uintptr_t
1207 make_symtab(Ofl_desc *ofl)
1208 {
1209 	Shdr		*shdr;
1210 	Elf_Data	*data;
1211 	Is_desc		*isec;
1212 	Is_desc		*xisec = 0;
1213 	size_t		size;
1214 	Word		symcnt;
1215 
1216 	/*
1217 	 * Allocate and initialize the Elf_Data structure.
1218 	 */
1219 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1220 		return (S_ERROR);
1221 	data->d_type = ELF_T_SYM;
1222 	data->d_align = M_WORD_ALIGN;
1223 	data->d_version = ofl->ofl_dehdr->e_version;
1224 
1225 	/*
1226 	 * Allocate and initialize the Shdr structure.
1227 	 */
1228 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1229 		return (S_ERROR);
1230 	shdr->sh_type = SHT_SYMTAB;
1231 	shdr->sh_addralign = M_WORD_ALIGN;
1232 	if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_SYM, 1,
1233 	    ofl->ofl_dehdr->e_version)) == 0) {
1234 		eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE),
1235 		    ofl->ofl_name);
1236 		return (S_ERROR);
1237 	}
1238 
1239 	/*
1240 	 * Allocate and initialize the Is_desc structure.
1241 	 */
1242 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1243 		return (S_ERROR);
1244 	isec->is_name = MSG_ORIG(MSG_SCN_SYMTAB);
1245 	isec->is_shdr = shdr;
1246 	isec->is_indata = data;
1247 
1248 	/*
1249 	 * Place the section first since it will affect the local symbol
1250 	 * count.
1251 	 */
1252 	if ((ofl->ofl_ossymtab = ld_place_section(ofl, isec, M_ID_SYMTAB, 0)) ==
1253 	    (Os_desc *)S_ERROR)
1254 		return (S_ERROR);
1255 
1256 	/*
1257 	 * At this point we've created all but the 'shstrtab' section.
1258 	 * Determine if we have to use 'Extended Sections'.  If so - then
1259 	 * also create a SHT_SYMTAB_SHNDX section.
1260 	 */
1261 	if ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE) {
1262 		Shdr		*xshdr;
1263 		Elf_Data	*xdata;
1264 
1265 		if ((xdata = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1266 			return (S_ERROR);
1267 		xdata->d_type = ELF_T_WORD;
1268 		xdata->d_align = M_WORD_ALIGN;
1269 		xdata->d_version = ofl->ofl_dehdr->e_version;
1270 		if ((xshdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1271 			return (S_ERROR);
1272 		xshdr->sh_type = SHT_SYMTAB_SHNDX;
1273 		xshdr->sh_addralign = M_WORD_ALIGN;
1274 		xshdr->sh_entsize = sizeof (Word);
1275 		if ((xisec = libld_calloc(1, sizeof (Is_desc))) == 0)
1276 			return (S_ERROR);
1277 		xisec->is_name = MSG_ORIG(MSG_SCN_SYMTAB_SHNDX);
1278 		xisec->is_shdr = xshdr;
1279 		xisec->is_indata = xdata;
1280 		if ((ofl->ofl_ossymshndx = ld_place_section(ofl, xisec,
1281 		    M_ID_SYMTAB_NDX, 0)) == (Os_desc *)S_ERROR)
1282 			return (S_ERROR);
1283 	}
1284 	/*
1285 	 * Calculated number of symbols, which need to be augmented by
1286 	 * the null first entry, the FILE symbol, and the .shstrtab entry.
1287 	 */
1288 	symcnt = (size_t)(3 + ofl->ofl_shdrcnt + ofl->ofl_scopecnt +
1289 		ofl->ofl_locscnt + ofl->ofl_globcnt);
1290 	size = symcnt * shdr->sh_entsize;
1291 
1292 	/*
1293 	 * Finalize the section header and data buffer initialization.
1294 	 */
1295 	data->d_size = size;
1296 	shdr->sh_size = (Xword)size;
1297 
1298 	/*
1299 	 * If we created a SHT_SYMTAB_SHNDX - then set it's sizes too.
1300 	 */
1301 	if (xisec) {
1302 		size_t	xsize = symcnt * sizeof (Word);
1303 
1304 		xisec->is_indata->d_size = xsize;
1305 		xisec->is_shdr->sh_size = (Xword)xsize;
1306 	}
1307 
1308 	return (1);
1309 }
1310 
1311 
1312 /*
1313  * Build a dynamic symbol table.  Contains only globals symbols and resides
1314  * in the text segment of a dynamic executable or shared library.
1315  */
1316 static uintptr_t
1317 make_dynsym(Ofl_desc *ofl)
1318 {
1319 	Shdr		*shdr;
1320 	Elf_Data	*data;
1321 	Is_desc		*isec;
1322 	size_t		size;
1323 	Xword		cnt;
1324 
1325 	/*
1326 	 * Allocate and initialize the Elf_Data structure.
1327 	 */
1328 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1329 		return (S_ERROR);
1330 	data->d_type = ELF_T_SYM;
1331 	data->d_align = M_WORD_ALIGN;
1332 	data->d_version = ofl->ofl_dehdr->e_version;
1333 
1334 	/*
1335 	 * Allocate and initialize the Shdr structure.
1336 	 */
1337 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1338 		return (S_ERROR);
1339 	shdr->sh_type = SHT_DYNSYM;
1340 	shdr->sh_flags = SHF_ALLOC;
1341 	shdr->sh_addralign = M_WORD_ALIGN;
1342 	if ((shdr->sh_entsize = (Xword)elf_fsize(ELF_T_SYM, 1,
1343 	    ofl->ofl_dehdr->e_version)) == 0) {
1344 		eprintf(ofl->ofl_lml, ERR_ELF, MSG_INTL(MSG_ELF_FSIZE),
1345 		    ofl->ofl_name);
1346 		return (S_ERROR);
1347 	}
1348 
1349 	/*
1350 	 * Allocate and initialize the Is_desc structure.
1351 	 */
1352 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1353 		return (S_ERROR);
1354 	isec->is_name = MSG_ORIG(MSG_SCN_DYNSYM);
1355 	isec->is_shdr = shdr;
1356 	isec->is_indata = data;
1357 
1358 	/*
1359 	 * Place the section first since it will affect the local symbol
1360 	 * count.
1361 	 */
1362 	if ((ofl->ofl_osdynsym = ld_place_section(ofl, isec, M_ID_DYNSYM, 0)) ==
1363 	    (Os_desc *)S_ERROR)
1364 		return (S_ERROR);
1365 
1366 	/*
1367 	 * One extra section header entry for the 'null' entry.
1368 	 */
1369 	cnt = 1 + ofl->ofl_dynshdrcnt + ofl->ofl_globcnt + ofl->ofl_lregsymcnt;
1370 	size = (size_t)cnt * shdr->sh_entsize;
1371 
1372 	/*
1373 	 * Finalize the section header and data buffer initialization.
1374 	 */
1375 	data->d_size = size;
1376 	shdr->sh_size = (Xword)size;
1377 
1378 	return (1);
1379 }
1380 
1381 /*
1382  * Build a SHT_SYMTAB_SHNDX for the .dynsym
1383  */
1384 static uintptr_t
1385 make_dynsym_shndx(Ofl_desc *ofl)
1386 {
1387 	Is_desc		*isec;
1388 	Is_desc		*dynsymisp;
1389 	Shdr		*shdr, *dynshdr;
1390 	Elf_Data	*data;
1391 
1392 	/*
1393 	 * Allocate the Elf_Data structure.
1394 	 */
1395 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1396 		return (S_ERROR);
1397 	data->d_type = ELF_T_WORD;
1398 	data->d_align = M_WORD_ALIGN;
1399 	data->d_version = ofl->ofl_dehdr->e_version;
1400 
1401 	/*
1402 	 * Allocate the Shdr structure.
1403 	 */
1404 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1405 		return (S_ERROR);
1406 	shdr->sh_type = SHT_SYMTAB_SHNDX;
1407 	shdr->sh_addralign = M_WORD_ALIGN;
1408 	shdr->sh_entsize = sizeof (Word);
1409 
1410 	/*
1411 	 * Allocate the Is_desc structure.
1412 	 */
1413 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1414 		return (S_ERROR);
1415 	isec->is_name = MSG_ORIG(MSG_SCN_DYNSYM_SHNDX);
1416 	isec->is_shdr = shdr;
1417 	isec->is_indata = data;
1418 
1419 	if ((ofl->ofl_osdynshndx = ld_place_section(ofl, isec,
1420 	    M_ID_DYNSYM_NDX, 0)) == (Os_desc *)S_ERROR)
1421 		return (S_ERROR);
1422 
1423 	assert(ofl->ofl_osdynsym);
1424 	dynsymisp = (Is_desc *)ofl->ofl_osdynsym->os_isdescs.head->data;
1425 	dynshdr = dynsymisp->is_shdr;
1426 	shdr->sh_size = (Xword)((dynshdr->sh_size / dynshdr->sh_entsize) *
1427 		sizeof (Word));
1428 	data->d_size = shdr->sh_size;
1429 
1430 	return (1);
1431 }
1432 
1433 
1434 /*
1435  * Build a string table for the section headers.
1436  */
1437 static uintptr_t
1438 make_shstrtab(Ofl_desc *ofl)
1439 {
1440 	Shdr		*shdr;
1441 	Elf_Data	*data;
1442 	Is_desc		*isec;
1443 	size_t		size;
1444 
1445 	/*
1446 	 * Allocate the Elf_Data structure.
1447 	 */
1448 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1449 		return (S_ERROR);
1450 	data->d_type = ELF_T_BYTE;
1451 	data->d_align = 1;
1452 	data->d_version = ofl->ofl_dehdr->e_version;
1453 
1454 	/*
1455 	 * Allocate the Shdr structure.
1456 	 */
1457 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1458 		return (S_ERROR);
1459 	shdr->sh_type = SHT_STRTAB;
1460 	shdr->sh_flags |= SHF_STRINGS;
1461 	shdr->sh_addralign = 1;
1462 
1463 	/*
1464 	 * Allocate the Is_desc structure.
1465 	 */
1466 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1467 		return (S_ERROR);
1468 	isec->is_name = MSG_ORIG(MSG_SCN_SHSTRTAB);
1469 	isec->is_shdr = shdr;
1470 	isec->is_indata = data;
1471 
1472 	/*
1473 	 * Place the section first, as it may effect the number of section
1474 	 * headers to account for.
1475 	 */
1476 	if ((ofl->ofl_osshstrtab = ld_place_section(ofl, isec, M_ID_NOTE, 0)) ==
1477 	    (Os_desc *)S_ERROR)
1478 		return (S_ERROR);
1479 
1480 	size = st_getstrtab_sz(ofl->ofl_shdrsttab);
1481 	assert(size > 0);
1482 
1483 	assert(size > 0);
1484 
1485 	data->d_size = size;
1486 	shdr->sh_size = (Xword)size;
1487 
1488 	return (1);
1489 }
1490 
1491 /*
1492  * Build a string section for the standard symbol table.
1493  */
1494 static uintptr_t
1495 make_strtab(Ofl_desc *ofl)
1496 {
1497 	Shdr		*shdr;
1498 	Elf_Data	*data;
1499 	Is_desc		*isec;
1500 	size_t		size;
1501 
1502 	/*
1503 	 * This string table consists of all the global and local symbols.
1504 	 * Account for null bytes at end of the file name and the beginning
1505 	 * of section.
1506 	 */
1507 	if (st_insert(ofl->ofl_strtab, ofl->ofl_name) == -1)
1508 		return (S_ERROR);
1509 
1510 	size = st_getstrtab_sz(ofl->ofl_strtab);
1511 	assert(size > 0);
1512 
1513 	/*
1514 	 * Allocate the Elf_Data structure.
1515 	 */
1516 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1517 		return (S_ERROR);
1518 	data->d_size = size;
1519 	data->d_type = ELF_T_BYTE;
1520 	data->d_align = 1;
1521 	data->d_version = ofl->ofl_dehdr->e_version;
1522 
1523 	/*
1524 	 * Allocate the Shdr structure.
1525 	 */
1526 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1527 		return (S_ERROR);
1528 	shdr->sh_size = (Xword)size;
1529 	shdr->sh_addralign = 1;
1530 	shdr->sh_type = SHT_STRTAB;
1531 	shdr->sh_flags |= SHF_STRINGS;
1532 
1533 	/*
1534 	 * Allocate and initialize the Is_desc structure.
1535 	 */
1536 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1537 		return (S_ERROR);
1538 	isec->is_name = MSG_ORIG(MSG_SCN_STRTAB);
1539 	isec->is_shdr = shdr;
1540 	isec->is_indata = data;
1541 
1542 	ofl->ofl_osstrtab = ld_place_section(ofl, isec, M_ID_STRTAB, 0);
1543 	return ((uintptr_t)ofl->ofl_osstrtab);
1544 }
1545 
1546 /*
1547  * Build a string table for the dynamic symbol table.
1548  */
1549 static uintptr_t
1550 make_dynstr(Ofl_desc *ofl)
1551 {
1552 	Shdr		*shdr;
1553 	Elf_Data	*data;
1554 	Is_desc		*isec;
1555 	size_t		size;
1556 
1557 	/*
1558 	 * Account for any local, named register symbols.  These locals are
1559 	 * required for reference from DT_REGISTER .dynamic entries.
1560 	 */
1561 	if (ofl->ofl_regsyms) {
1562 		int	ndx;
1563 
1564 		for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) {
1565 			Sym_desc *	sdp;
1566 
1567 			if ((sdp = ofl->ofl_regsyms[ndx]) == 0)
1568 				continue;
1569 
1570 			if (((sdp->sd_flags1 & FLG_SY1_LOCL) == 0) &&
1571 			    (ELF_ST_BIND(sdp->sd_sym->st_info) != STB_LOCAL))
1572 				continue;
1573 
1574 			if (sdp->sd_sym->st_name == 0)
1575 				continue;
1576 
1577 			if (st_insert(ofl->ofl_dynstrtab, sdp->sd_name) == -1)
1578 				return (S_ERROR);
1579 		}
1580 	}
1581 
1582 	/*
1583 	 * Reserve entries for any per-symbol auxiliary/filter strings.
1584 	 */
1585 	if (ofl->ofl_dtsfltrs) {
1586 		Dfltr_desc *	dftp;
1587 		Aliste		off;
1588 
1589 		for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, off, dftp))
1590 			if (st_insert(ofl->ofl_dynstrtab, dftp->dft_str) == -1)
1591 				return (S_ERROR);
1592 	}
1593 
1594 	size = st_getstrtab_sz(ofl->ofl_dynstrtab);
1595 	assert(size > 0);
1596 
1597 	/*
1598 	 * Allocate the Elf_Data structure.
1599 	 */
1600 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1601 		return (S_ERROR);
1602 	data->d_type = ELF_T_BYTE;
1603 	data->d_size = size;
1604 	data->d_align = 1;
1605 	data->d_version = ofl->ofl_dehdr->e_version;
1606 
1607 	/*
1608 	 * Allocate the Shdr structure.
1609 	 */
1610 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1611 		return (S_ERROR);
1612 	if (!(ofl->ofl_flags & FLG_OF_RELOBJ))
1613 		shdr->sh_flags = SHF_ALLOC;
1614 
1615 	shdr->sh_type = SHT_STRTAB;
1616 	shdr->sh_flags |= SHF_STRINGS;
1617 	shdr->sh_size = (Xword)size;
1618 	shdr->sh_addralign = 1;
1619 
1620 	/*
1621 	 * Allocate and initialize the Is_desc structure.
1622 	 */
1623 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1624 		return (S_ERROR);
1625 	isec->is_name = MSG_ORIG(MSG_SCN_DYNSTR);
1626 	isec->is_shdr = shdr;
1627 	isec->is_indata = data;
1628 
1629 	ofl->ofl_osdynstr = ld_place_section(ofl, isec, M_ID_DYNSTR, 0);
1630 	return ((uintptr_t)ofl->ofl_osdynstr);
1631 }
1632 
1633 /*
1634  * Generate an output relocation section which will contain the relocation
1635  * information to be applied to the `osp' section.
1636  *
1637  * If (osp == NULL) then we are creating the coalesced relocation section
1638  * for an executable and/or a shared object.
1639  */
1640 static uintptr_t
1641 make_reloc(Ofl_desc *ofl, Os_desc *osp)
1642 {
1643 	Shdr		*shdr;
1644 	Elf_Data	*data;
1645 	Is_desc		*isec;
1646 	size_t		size;
1647 	Xword		sh_flags;
1648 	char 		*sectname;
1649 	Os_desc		*rosp;
1650 	Word		relsize;
1651 	const char	*rel_prefix;
1652 
1653 	/* LINTED */
1654 	if (M_REL_SHT_TYPE == SHT_REL) {
1655 		/* REL */
1656 		relsize = sizeof (Rel);
1657 		rel_prefix = MSG_ORIG(MSG_SCN_REL);
1658 	} else {
1659 		/* RELA */
1660 		relsize = sizeof (Rela);
1661 		rel_prefix = MSG_ORIG(MSG_SCN_RELA);
1662 	}
1663 
1664 	if (osp) {
1665 		size = osp->os_szoutrels;
1666 		sh_flags = osp->os_shdr->sh_flags;
1667 		if ((sectname = libld_malloc(strlen(rel_prefix) +
1668 		    strlen(osp->os_name) + 1)) == 0)
1669 			return (S_ERROR);
1670 		(void) strcpy(sectname, rel_prefix);
1671 		(void) strcat(sectname, osp->os_name);
1672 	} else if (ofl->ofl_flags1 & FLG_OF1_RELCNT) {
1673 		size = (ofl->ofl_reloccnt - ofl->ofl_reloccntsub) * relsize;
1674 		sh_flags = SHF_ALLOC;
1675 		sectname = (char *)MSG_ORIG(MSG_SCN_SUNWRELOC);
1676 	} else {
1677 		size = ofl->ofl_relocrelsz;
1678 		sh_flags = SHF_ALLOC;
1679 		sectname = (char *)rel_prefix;
1680 	}
1681 
1682 	/*
1683 	 * Keep track of total size of 'output relocations' (to be stored
1684 	 * in .dynamic)
1685 	 */
1686 	/* LINTED */
1687 	ofl->ofl_relocsz += (Xword)size;
1688 
1689 	/*
1690 	 * Allocate and initialize the Elf_Data structure.
1691 	 */
1692 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1693 		return (S_ERROR);
1694 	data->d_type = M_REL_ELF_TYPE;
1695 	data->d_size = size;
1696 	data->d_align = M_WORD_ALIGN;
1697 	data->d_version = ofl->ofl_dehdr->e_version;
1698 
1699 	/*
1700 	 * Allocate and initialize the Shdr structure.
1701 	 */
1702 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1703 		return (S_ERROR);
1704 	shdr->sh_type = M_REL_SHT_TYPE;
1705 	shdr->sh_size = (Xword)size;
1706 	shdr->sh_addralign = M_WORD_ALIGN;
1707 	shdr->sh_entsize = relsize;
1708 
1709 	if ((ofl->ofl_flags & FLG_OF_DYNAMIC) &&
1710 	    !(ofl->ofl_flags & FLG_OF_RELOBJ) &&
1711 	    (sh_flags & SHF_ALLOC))
1712 		shdr->sh_flags = SHF_ALLOC;
1713 
1714 	if (osp) {
1715 		/*
1716 		 * The sh_info field of the SHT_REL* sections points to the
1717 		 * section the relocations are to be applied to.
1718 		 */
1719 		shdr->sh_flags |= SHF_INFO_LINK;
1720 	}
1721 
1722 
1723 	/*
1724 	 * Allocate and initialize the Is_desc structure.
1725 	 */
1726 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1727 		return (S_ERROR);
1728 	isec->is_shdr = shdr;
1729 	isec->is_indata = data;
1730 	isec->is_name = sectname;
1731 
1732 
1733 	/*
1734 	 * Associate this relocation section to the section its going to
1735 	 * relocate.
1736 	 */
1737 	if ((rosp = ld_place_section(ofl, isec, M_ID_REL, 0)) ==
1738 	    (Os_desc *)S_ERROR)
1739 		return (S_ERROR);
1740 
1741 	if (osp) {
1742 		Listnode *	lnp;
1743 		Is_desc *	risp;
1744 		/*
1745 		 * We associate the input relocation sections - with
1746 		 * the newly created output relocation section.
1747 		 *
1748 		 * This is used primarily so that we can update
1749 		 * SHT_GROUP[sect_no] entries to point to the
1750 		 * created output relocation sections.
1751 		 */
1752 		for (LIST_TRAVERSE(&(osp->os_relisdescs), lnp, risp)) {
1753 			risp->is_osdesc = rosp;
1754 			/*
1755 			 * If the input relocation section had
1756 			 * the SHF_GROUP flag set - propogate it to
1757 			 * the output relocation section.
1758 			 */
1759 			if (risp->is_shdr->sh_flags & SHF_GROUP) {
1760 				rosp->os_shdr->sh_flags |= SHF_GROUP;
1761 				break;
1762 			}
1763 		}
1764 		osp->os_relosdesc = rosp;
1765 	} else
1766 		ofl->ofl_osrel = rosp;
1767 
1768 	/*
1769 	 * If this is the first relocation section we've encountered save it
1770 	 * so that the .dynamic entry can be initialized accordingly.
1771 	 */
1772 	if (ofl->ofl_osrelhead == (Os_desc *)0)
1773 		ofl->ofl_osrelhead = rosp;
1774 
1775 	return (1);
1776 }
1777 
1778 /*
1779  * Generate version needed section.
1780  */
1781 static uintptr_t
1782 make_verneed(Ofl_desc *ofl)
1783 {
1784 	Shdr		*shdr;
1785 	Elf_Data	*data;
1786 	Is_desc		*isec;
1787 	size_t		size = ofl->ofl_verneedsz;
1788 
1789 	/*
1790 	 * Allocate and initialize the Elf_Data structure.
1791 	 */
1792 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1793 		return (S_ERROR);
1794 	data->d_type = ELF_T_BYTE;
1795 	data->d_size = size;
1796 	data->d_align = M_WORD_ALIGN;
1797 	data->d_version = ofl->ofl_dehdr->e_version;
1798 
1799 	/*
1800 	 * Allocate and initialize the Shdr structure.
1801 	 */
1802 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1803 		return (S_ERROR);
1804 	shdr->sh_type = (Word)SHT_SUNW_verneed;
1805 	shdr->sh_flags = SHF_ALLOC;
1806 	shdr->sh_size = (Xword)size;
1807 	shdr->sh_addralign = M_WORD_ALIGN;
1808 
1809 	/*
1810 	 * Allocate and initialize the Is_desc structure.
1811 	 */
1812 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1813 		return (S_ERROR);
1814 	isec->is_name = MSG_ORIG(MSG_SCN_SUNWVERSION);
1815 	isec->is_shdr = shdr;
1816 	isec->is_indata = data;
1817 
1818 	ofl->ofl_osverneed = ld_place_section(ofl, isec, M_ID_VERSION, 0);
1819 	return ((uintptr_t)ofl->ofl_osverneed);
1820 }
1821 
1822 /*
1823  * Generate a version definition section.
1824  *
1825  *  o	the SHT_SUNW_verdef section defines the versions that exist within this
1826  *	image.
1827  */
1828 static uintptr_t
1829 make_verdef(Ofl_desc *ofl)
1830 {
1831 	Shdr		*shdr;
1832 	Elf_Data	*data;
1833 	Is_desc		*isec;
1834 	Ver_desc	*vdp;
1835 	size_t		size;
1836 
1837 	/*
1838 	 * Reserve a string table entry for the base version dependency (other
1839 	 * dependencies have symbol representations, which will already be
1840 	 * accounted for during symbol processing).
1841 	 */
1842 	vdp = (Ver_desc *)ofl->ofl_verdesc.head->data;
1843 	size = strlen(vdp->vd_name) + 1;
1844 
1845 	if (ofl->ofl_flags & FLG_OF_DYNAMIC) {
1846 		if (st_insert(ofl->ofl_dynstrtab, vdp->vd_name) == -1)
1847 			return (S_ERROR);
1848 	} else {
1849 		if (st_insert(ofl->ofl_strtab, vdp->vd_name) == -1)
1850 			return (S_ERROR);
1851 	}
1852 
1853 	/*
1854 	 * During version processing we calculated the total number of entries.
1855 	 * Allocate and initialize the Elf_Data structure.
1856 	 */
1857 	size = ofl->ofl_verdefsz;
1858 
1859 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1860 		return (S_ERROR);
1861 	data->d_type = ELF_T_BYTE;
1862 	data->d_size = size;
1863 	data->d_align = M_WORD_ALIGN;
1864 	data->d_version = ofl->ofl_dehdr->e_version;
1865 
1866 	/*
1867 	 * Allocate and initialize the Shdr structure.
1868 	 */
1869 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1870 		return (S_ERROR);
1871 	shdr->sh_type = (Word)SHT_SUNW_verdef;
1872 	shdr->sh_flags = SHF_ALLOC;
1873 	shdr->sh_size = (Xword)size;
1874 	shdr->sh_addralign = M_WORD_ALIGN;
1875 
1876 	/*
1877 	 * Allocate and initialize the Is_desc structure.
1878 	 */
1879 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1880 		return (S_ERROR);
1881 	isec->is_name = MSG_ORIG(MSG_SCN_SUNWVERSION);
1882 	isec->is_shdr = shdr;
1883 	isec->is_indata = data;
1884 
1885 	ofl->ofl_osverdef = ld_place_section(ofl, isec, M_ID_VERSION, 0);
1886 	return ((uintptr_t)ofl->ofl_osverdef);
1887 }
1888 
1889 /*
1890  * Common function used to build both the SHT_SUNW_versym
1891  * section and the SHT_SUNW_syminfo section.  Each of these sections
1892  * provides additional symbol information.
1893  */
1894 static Os_desc *
1895 make_sym_sec(Ofl_desc *ofl, const char *sectname, Word entsize,
1896     Word stype, int ident)
1897 {
1898 	Shdr		*shdr;
1899 	Elf_Data	*data;
1900 	Is_desc		*isec;
1901 
1902 	/*
1903 	 * Allocate and initialize the Elf_Data structures for the symbol index
1904 	 * array.
1905 	 */
1906 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1907 		return ((Os_desc *)S_ERROR);
1908 	data->d_type = ELF_T_BYTE;
1909 	data->d_align = M_WORD_ALIGN;
1910 	data->d_version = ofl->ofl_dehdr->e_version;
1911 
1912 	/*
1913 	 * Allocate and initialize the Shdr structure.
1914 	 */
1915 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1916 		return ((Os_desc *)S_ERROR);
1917 	shdr->sh_type = (Word)stype;
1918 	shdr->sh_flags = SHF_ALLOC;
1919 	shdr->sh_addralign = M_WORD_ALIGN;
1920 	shdr->sh_entsize = entsize;
1921 
1922 	if (stype == SHT_SUNW_syminfo) {
1923 		/*
1924 		 * The sh_info field of the SHT_*_syminfo section points
1925 		 * to the header index of the associated .dynamic section.
1926 		 */
1927 		shdr->sh_flags |= SHF_INFO_LINK;
1928 	}
1929 
1930 	/*
1931 	 * Allocate and initialize the Is_desc structure.
1932 	 */
1933 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1934 		return ((Os_desc *)S_ERROR);
1935 	isec->is_name = sectname;
1936 	isec->is_shdr = shdr;
1937 	isec->is_indata = data;
1938 
1939 	return (ld_place_section(ofl, isec, ident, 0));
1940 }
1941 
1942 /*
1943  * Build a .sunwbss section for allocation of tentative definitions.
1944  */
1945 uintptr_t
1946 ld_make_sunwbss(Ofl_desc *ofl, size_t size, Xword align)
1947 {
1948 	Shdr		*shdr;
1949 	Elf_Data	*data;
1950 	Is_desc		*isec;
1951 
1952 	/*
1953 	 * Allocate and initialize the Elf_Data structure.
1954 	 */
1955 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
1956 		return (S_ERROR);
1957 	data->d_type = ELF_T_BYTE;
1958 	data->d_size = size;
1959 	data->d_align = align;
1960 	data->d_version = ofl->ofl_dehdr->e_version;
1961 
1962 	/*
1963 	 * Allocate and initialize the Shdr structure.
1964 	 */
1965 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
1966 		return (S_ERROR);
1967 	shdr->sh_type = SHT_NOBITS;
1968 	shdr->sh_flags = SHF_ALLOC | SHF_WRITE;
1969 	shdr->sh_size = (Xword)size;
1970 	shdr->sh_addralign = align;
1971 
1972 	/*
1973 	 * Allocate and initialize the Is_desc structure.
1974 	 */
1975 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
1976 		return (S_ERROR);
1977 	isec->is_name = MSG_ORIG(MSG_SCN_SUNWBSS);
1978 	isec->is_shdr = shdr;
1979 	isec->is_indata = data;
1980 
1981 	/*
1982 	 * Retain this .sunwbss input section as this will be where global
1983 	 * symbol references are added.
1984 	 */
1985 	ofl->ofl_issunwbss = isec;
1986 	if (ld_place_section(ofl, isec, 0, 0) == (Os_desc *)S_ERROR)
1987 		return (S_ERROR);
1988 
1989 	return (1);
1990 }
1991 
1992 /*
1993  * This routine is called when -z nopartial is in effect.
1994  */
1995 uintptr_t
1996 ld_make_sunwdata(Ofl_desc *ofl, size_t size, Xword align)
1997 {
1998 	Shdr		*shdr;
1999 	Elf_Data	*data;
2000 	Is_desc		*isec;
2001 	Os_desc		*osp;
2002 
2003 	/*
2004 	 * Allocate and initialize the Elf_Data structure.
2005 	 */
2006 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
2007 		return (S_ERROR);
2008 	data->d_type = ELF_T_BYTE;
2009 	data->d_size = size;
2010 	if ((data->d_buf = libld_calloc(size, 1)) == 0)
2011 		return (S_ERROR);
2012 	data->d_align = (size_t)M_WORD_ALIGN;
2013 	data->d_version = ofl->ofl_dehdr->e_version;
2014 
2015 	/*
2016 	 * Allocate and initialize the Shdr structure.
2017 	 */
2018 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
2019 		return (S_ERROR);
2020 	shdr->sh_type = SHT_PROGBITS;
2021 	shdr->sh_flags = SHF_ALLOC | SHF_WRITE;
2022 	shdr->sh_size = (Xword)size;
2023 	if (align == 0)
2024 		shdr->sh_addralign = M_WORD_ALIGN;
2025 	else
2026 		shdr->sh_addralign = align;
2027 
2028 	/*
2029 	 * Allocate and initialize the Is_desc structure.
2030 	 */
2031 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
2032 		return (S_ERROR);
2033 	isec->is_name = MSG_ORIG(MSG_SCN_SUNWDATA1);
2034 	isec->is_shdr = shdr;
2035 	isec->is_indata = data;
2036 
2037 	/*
2038 	 * Retain this .sunwdata1 input section as this will
2039 	 * be where global
2040 	 * symbol references are added.
2041 	 */
2042 	ofl->ofl_issunwdata1 = isec;
2043 	if ((osp = ld_place_section(ofl, isec, M_ID_DATA, 0)) ==
2044 	    (Os_desc *)S_ERROR)
2045 		return (S_ERROR);
2046 
2047 	if (!(osp->os_flags & FLG_OS_OUTREL)) {
2048 		ofl->ofl_dynshdrcnt++;
2049 		osp->os_flags |= FLG_OS_OUTREL;
2050 	}
2051 	return (1);
2052 }
2053 
2054 /*
2055  * Make .sunwmove section
2056  */
2057 uintptr_t
2058 ld_make_sunwmove(Ofl_desc *ofl, int mv_nums)
2059 {
2060 	Shdr		*shdr;
2061 	Elf_Data	*data;
2062 	Is_desc		*isec;
2063 	size_t		size;
2064 	Listnode	*lnp1;
2065 	Psym_info	*psym;
2066 	int 		cnt = 1;
2067 
2068 	/*
2069 	 * Generate the move input sections and output sections
2070 	 */
2071 	size = mv_nums * sizeof (Move);
2072 
2073 	/*
2074 	 * Allocate and initialize the Elf_Data structure.
2075 	 */
2076 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == 0)
2077 		return (S_ERROR);
2078 	data->d_type = ELF_T_BYTE;
2079 	if ((data->d_buf = libld_calloc(size, 1)) == 0)
2080 		return (S_ERROR);
2081 	data->d_size = size;
2082 	data->d_align = sizeof (Lword);
2083 	data->d_version = ofl->ofl_dehdr->e_version;
2084 
2085 	/*
2086 	 * Allocate and initialize the Shdr structure.
2087 	 */
2088 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == 0)
2089 		return (S_ERROR);
2090 	shdr->sh_link = 0;
2091 	shdr->sh_info = 0;
2092 	shdr->sh_type = SHT_SUNW_move;
2093 	shdr->sh_size = (Xword)size;
2094 	shdr->sh_flags = SHF_ALLOC | SHF_WRITE;
2095 	shdr->sh_addralign = sizeof (Lword);
2096 	shdr->sh_entsize = sizeof (Move);
2097 
2098 	/*
2099 	 * Allocate and initialize the Is_desc structure.
2100 	 */
2101 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == 0)
2102 		return (S_ERROR);
2103 	isec->is_name = MSG_ORIG(MSG_SCN_SUNWMOVE);
2104 	isec->is_shdr = shdr;
2105 	isec->is_indata = data;
2106 	isec->is_file = 0;
2107 
2108 	/*
2109 	 * Copy move entries
2110 	 */
2111 	for (LIST_TRAVERSE(&ofl->ofl_parsym, lnp1, psym)) {
2112 		Listnode *	lnp2;
2113 		Mv_itm *	mvitm;
2114 
2115 		if (psym->psym_symd->sd_flags & FLG_SY_PAREXPN)
2116 			continue;
2117 		for (LIST_TRAVERSE(&(psym->psym_mvs), lnp2, mvitm)) {
2118 			if ((mvitm->mv_flag & FLG_MV_OUTSECT) == 0)
2119 				continue;
2120 			mvitm->mv_oidx = cnt;
2121 			cnt++;
2122 		}
2123 	}
2124 	if ((ofl->ofl_osmove = ld_place_section(ofl, isec, 0, 0)) ==
2125 	    (Os_desc *)S_ERROR)
2126 		return (S_ERROR);
2127 
2128 	return (1);
2129 }
2130 
2131 
2132 /*
2133  * The following sections are built after all input file processing and symbol
2134  * validation has been carried out.  The order is important (because the
2135  * addition of a section adds a new symbol there is a chicken and egg problem
2136  * of maintaining the appropriate counts).  By maintaining a known order the
2137  * individual routines can compensate for later, known, additions.
2138  */
2139 uintptr_t
2140 ld_make_sections(Ofl_desc *ofl)
2141 {
2142 	Word		flags = ofl->ofl_flags;
2143 	Listnode	*lnp1;
2144 	Sg_desc		*sgp;
2145 
2146 	/*
2147 	 * Generate any special sections.
2148 	 */
2149 	if (flags & FLG_OF_ADDVERS)
2150 		if (make_comment(ofl) == S_ERROR)
2151 			return (S_ERROR);
2152 
2153 	if (make_interp(ofl) == S_ERROR)
2154 		return (S_ERROR);
2155 
2156 	if (make_cap(ofl) == S_ERROR)
2157 		return (S_ERROR);
2158 
2159 	if (make_array(ofl, SHT_INIT_ARRAY, MSG_ORIG(MSG_SCN_INITARRAY),
2160 	    &ofl->ofl_initarray) == S_ERROR)
2161 		return (S_ERROR);
2162 
2163 	if (make_array(ofl, SHT_FINI_ARRAY, MSG_ORIG(MSG_SCN_FINIARRAY),
2164 	    &ofl->ofl_finiarray) == S_ERROR)
2165 		return (S_ERROR);
2166 
2167 	if (make_array(ofl, SHT_PREINIT_ARRAY, MSG_ORIG(MSG_SCN_PREINITARRAY),
2168 	    &ofl->ofl_preiarray) == S_ERROR)
2169 		return (S_ERROR);
2170 
2171 	/*
2172 	 * Make the .plt section.  This occurs after any other relocation
2173 	 * sections are generated (see reloc_init()) to ensure that the
2174 	 * associated relocation section is after all the other relocation
2175 	 * sections.
2176 	 */
2177 	if ((ofl->ofl_pltcnt) || (ofl->ofl_pltpad))
2178 		if (make_plt(ofl) == S_ERROR)
2179 			return (S_ERROR);
2180 
2181 	/*
2182 	 * Determine whether any sections or files are not referenced.  Under
2183 	 * -Dunused a diagnostic for any unused components is generated, under
2184 	 * -zignore the component is removed from the final output.
2185 	 */
2186 	if (DBG_ENABLED || (ofl->ofl_flags1 & FLG_OF1_IGNPRC)) {
2187 		if (ignore_section_processing(ofl) == S_ERROR)
2188 			return (S_ERROR);
2189 	}
2190 
2191 	/*
2192 	 * Add any necessary versioning information.
2193 	 */
2194 	if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) == FLG_OF_VERNEED) {
2195 		if (make_verneed(ofl) == S_ERROR)
2196 			return (S_ERROR);
2197 	}
2198 	if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) == FLG_OF_VERDEF) {
2199 		if (make_verdef(ofl) == S_ERROR)
2200 			return (S_ERROR);
2201 		if ((ofl->ofl_osversym = make_sym_sec(ofl,
2202 		    MSG_ORIG(MSG_SCN_SUNWVERSYM), sizeof (Versym),
2203 		    SHT_SUNW_versym, M_ID_VERSION)) == (Os_desc*)S_ERROR)
2204 			return (S_ERROR);
2205 	}
2206 
2207 	/*
2208 	 * Create a syminfo section is necessary.
2209 	 */
2210 	if (ofl->ofl_flags & FLG_OF_SYMINFO) {
2211 		if ((ofl->ofl_ossyminfo = make_sym_sec(ofl,
2212 		    MSG_ORIG(MSG_SCN_SUNWSYMINFO), sizeof (Syminfo),
2213 		    SHT_SUNW_syminfo, M_ID_SYMINFO)) == (Os_desc *)S_ERROR)
2214 			return (S_ERROR);
2215 	}
2216 
2217 	if (ofl->ofl_flags1 & FLG_OF1_RELCNT) {
2218 		/*
2219 		 * If -zcombreloc is enabled then all relocations (except for
2220 		 * the PLT's) are coalesced into a single relocation section.
2221 		 */
2222 		if (ofl->ofl_reloccnt) {
2223 			if (make_reloc(ofl, NULL) == S_ERROR)
2224 				return (S_ERROR);
2225 		}
2226 	} else {
2227 		size_t	reloc_size = 0;
2228 
2229 		/*
2230 		 * Create the required output relocation sections.
2231 		 */
2232 		for (LIST_TRAVERSE(&ofl->ofl_segs, lnp1, sgp)) {
2233 			Os_desc		*osp;
2234 			Listnode	*lnp2;
2235 
2236 			for (LIST_TRAVERSE(&(sgp->sg_osdescs), lnp2, osp)) {
2237 				if (osp->os_szoutrels &&
2238 				    (osp != ofl->ofl_osplt)) {
2239 					if (make_reloc(ofl, osp) == S_ERROR)
2240 						return (S_ERROR);
2241 					reloc_size += reloc_size;
2242 				}
2243 			}
2244 		}
2245 
2246 		/*
2247 		 * If we're not building a combined relocation section, then
2248 		 * build a .rel[a] section as required.
2249 		 */
2250 		if (ofl->ofl_relocrelsz) {
2251 			if (make_reloc(ofl, NULL) == S_ERROR)
2252 				return (S_ERROR);
2253 		}
2254 	}
2255 
2256 	/*
2257 	 * The PLT relocations are always in their own section, and we try to
2258 	 * keep them at the end of the PLT table.  We do this to keep the hot
2259 	 * "data" PLT's at the head of the table nearer the .dynsym & .hash.
2260 	 */
2261 	if (ofl->ofl_osplt && ofl->ofl_relocpltsz) {
2262 		if (make_reloc(ofl, ofl->ofl_osplt) == S_ERROR)
2263 			return (S_ERROR);
2264 	}
2265 
2266 	/*
2267 	 * Finally build the symbol and section header sections.
2268 	 */
2269 	if (flags & FLG_OF_DYNAMIC) {
2270 		if (make_dynamic(ofl) == S_ERROR)
2271 			return (S_ERROR);
2272 		if (make_dynstr(ofl) == S_ERROR)
2273 			return (S_ERROR);
2274 		/*
2275 		 * There is no use for .hash and .dynsym sections in a
2276 		 * relocatable object.
2277 		 */
2278 		if (!(flags & FLG_OF_RELOBJ)) {
2279 			if (make_hash(ofl) == S_ERROR)
2280 				return (S_ERROR);
2281 			if (make_dynsym(ofl) == S_ERROR)
2282 				return (S_ERROR);
2283 #if	(defined(__i386) || defined(__amd64)) && defined(_ELF64)
2284 			if (make_amd64_unwindhdr(ofl) == S_ERROR)
2285 				return (S_ERROR);
2286 #endif
2287 		}
2288 	}
2289 
2290 	if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ) ||
2291 	    ((flags & FLG_OF_STATIC) && ofl->ofl_osversym)) {
2292 		/*
2293 		 * Do we need to make a SHT_SYMTAB_SHNDX section
2294 		 * for the dynsym.  If so - do it now.
2295 		 */
2296 		if (ofl->ofl_osdynsym &&
2297 		    ((ofl->ofl_shdrcnt + 3) >= SHN_LORESERVE)) {
2298 			if (make_dynsym_shndx(ofl) == S_ERROR)
2299 				return (S_ERROR);
2300 		}
2301 
2302 		if (make_strtab(ofl) == S_ERROR)
2303 			return (S_ERROR);
2304 		if (make_symtab(ofl) == S_ERROR)
2305 			return (S_ERROR);
2306 	} else {
2307 		/*
2308 		 * Do we need to make a SHT_SYMTAB_SHNDX section
2309 		 * for the dynsym.  If so - do it now.
2310 		 */
2311 		if (ofl->ofl_osdynsym &&
2312 		    ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE)) {
2313 			if (make_dynsym_shndx(ofl) == S_ERROR)
2314 				return (S_ERROR);
2315 		}
2316 	}
2317 
2318 	if (make_shstrtab(ofl) == S_ERROR)
2319 		return (S_ERROR);
2320 
2321 	/*
2322 	 * Now that we've created all of our sections adjust the size
2323 	 * of SHT_SUNW_versym & SHT_SUNW_syminfo which are dependent on
2324 	 * the symbol table sizes.
2325 	 */
2326 	if (ofl->ofl_osversym || ofl->ofl_ossyminfo) {
2327 		Shdr *		shdr;
2328 		Is_desc *	isec;
2329 		Elf_Data *	data;
2330 		size_t		size;
2331 		ulong_t		cnt;
2332 
2333 		if ((flags & FLG_OF_RELOBJ) || (flags & FLG_OF_STATIC))
2334 			isec = (Is_desc *)ofl->ofl_ossymtab->
2335 				os_isdescs.head->data;
2336 		else
2337 			isec = (Is_desc *)ofl->ofl_osdynsym->
2338 				os_isdescs.head->data;
2339 		cnt = isec->is_shdr->sh_size / isec->is_shdr->sh_entsize;
2340 
2341 		if (ofl->ofl_osversym) {
2342 			isec = (Is_desc *)ofl->ofl_osversym->os_isdescs.
2343 				head->data;
2344 			data = isec->is_indata;
2345 			shdr = ofl->ofl_osversym->os_shdr;
2346 			size = cnt * shdr->sh_entsize;
2347 			shdr->sh_size = (Xword)size;
2348 			data->d_size = size;
2349 		}
2350 		if (ofl->ofl_ossyminfo) {
2351 			isec = (Is_desc *)ofl->ofl_ossyminfo->os_isdescs.
2352 				head->data;
2353 			data = isec->is_indata;
2354 			shdr = ofl->ofl_ossyminfo->os_shdr;
2355 			size = cnt * shdr->sh_entsize;
2356 			shdr->sh_size = (Xword)size;
2357 			data->d_size = size;
2358 		}
2359 	}
2360 
2361 	return (1);
2362 }
2363