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