update.c revision 11227:cd2ac59c39f2
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 *	Copyright (c) 1988 AT&T
24 *	  All Rights Reserved
25 *
26 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
27 * Use is subject to license terms.
28 */
29
30/*
31 * Update the new output file image, perform virtual address, offset and
32 * displacement calculations on the program headers and sections headers,
33 * and generate any new output section information.
34 */
35
36#define	ELF_TARGET_AMD64
37
38#include	<stdio.h>
39#include	<string.h>
40#include	<unistd.h>
41#include	<debug.h>
42#include	"msg.h"
43#include	"_libld.h"
44
45/*
46 * Comparison routine used by qsort() for sorting of the global symbol list
47 * based off of the hashbuckets the symbol will eventually be deposited in.
48 */
49static int
50sym_hash_compare(Sym_s_list * s1, Sym_s_list * s2)
51{
52	return (s1->sl_hval - s2->sl_hval);
53}
54
55/*
56 * Comparison routine used by qsort() for sorting of dyn[sym|tls]sort section
57 * indices based on the address of the symbols they reference. The
58 * use of the global dynsort_compare_syms variable is needed because
59 * we need to examine the symbols the indices reference. It is safe, because
60 * the linker is single threaded.
61 */
62Sym *dynsort_compare_syms;
63
64static int
65dynsort_compare(const void *idx1, const void *idx2)
66{
67	Sym *s1 = dynsort_compare_syms + *((const Word *) idx1);
68	Sym *s2 = dynsort_compare_syms + *((const Word *) idx2);
69
70	/*
71	 * Note: the logical computation for this is
72	 *	(st_value1 - st_value2)
73	 * However, that is only correct if the address type is smaller
74	 * than a pointer. Writing it this way makes it immune to the
75	 * class (32 or 64-bit) of the linker.
76	 */
77	return ((s1->st_value < s2->st_value) ? -1 :
78	    (s1->st_value > s2->st_value));
79}
80
81/*
82 * Scan the sorted symbols, and issue warnings if there are any duplicate
83 * values in the list. We only do this if -zverbose is set, or we are
84 * running with LD_DEBUG defined
85 *
86 * entry:
87 *	ofl - Output file descriptor
88 *	ldynsym - Pointer to start of .SUNW_ldynsym section that the
89 *		sort section indexes reference.
90 *	symsort - Pointer to start of .SUNW_dynsymsort or .SUNW_dyntlssort
91 *		section.
92 *	n - # of indices in symsort array
93 *	secname - Name of the symsort section.
94 *
95 * exit:
96 *	If the symsort section contains indexes to more than one
97 *	symbol with the same address value, a warning is issued.
98 */
99static void
100dynsort_dupwarn(Ofl_desc *ofl, Sym *ldynsym, const char *str,
101    Word *symsort, Word n, const char *secname)
102{
103	int zverbose = (ofl->ofl_flags & FLG_OF_VERBOSE) != 0;
104	Word ndx, cmp_ndx;
105	Addr addr, cmp_addr;
106
107	/* Nothing to do if -zverbose or LD_DEBUG are not active */
108	if (!(zverbose || DBG_ENABLED))
109		return;
110
111	cmp_ndx = 0;
112	cmp_addr = ldynsym[symsort[cmp_ndx]].st_value;
113	for (ndx = 1; ndx < n; ndx++) {
114		addr = ldynsym[symsort[ndx]].st_value;
115		if (cmp_addr == addr) {
116			if (zverbose)
117				eprintf(ofl->ofl_lml, ERR_WARNING,
118				    MSG_INTL(MSG_SYM_DUPSORTADDR), secname,
119				    str + ldynsym[symsort[cmp_ndx]].st_name,
120				    str + ldynsym[symsort[ndx]].st_name,
121				    EC_ADDR(addr));
122			DBG_CALL(Dbg_syms_dup_sort_addr(ofl->ofl_lml, secname,
123			    str + ldynsym[symsort[cmp_ndx]].st_name,
124			    str + ldynsym[symsort[ndx]].st_name,
125			    EC_ADDR(addr)));
126		} else {	/* Not a dup. Move reference up */
127			cmp_ndx = ndx;
128			cmp_addr = addr;
129		}
130	}
131}
132
133
134/*
135 * Build and update any output symbol tables.  Here we work on all the symbol
136 * tables at once to reduce the duplication of symbol and string manipulation.
137 * Symbols and their associated strings are copied from the read-only input
138 * file images to the output image and their values and index's updated in the
139 * output image.
140 */
141static Addr
142update_osym(Ofl_desc *ofl)
143{
144	/*
145	 * There are several places in this function where we wish
146	 * to insert a symbol index to the combined .SUNW_ldynsym/.dynsym
147	 * symbol table into one of the two sort sections (.SUNW_dynsymsort
148	 * or .SUNW_dyntlssort), if that symbol has the right attributes.
149	 * This macro is used to generate the necessary code from a single
150	 * specification.
151	 *
152	 * entry:
153	 *	_sdp, _sym, _type - As per DYNSORT_COUNT. See _libld.h
154	 *	_sym_ndx - Index that _sym will have in the combined
155	 *		.SUNW_ldynsym/.dynsym symbol table.
156	 */
157#define	ADD_TO_DYNSORT(_sdp, _sym, _type, _sym_ndx) \
158	{ \
159		Word *_dynsort_arr, *_dynsort_ndx; \
160		\
161		if (dynsymsort_symtype[_type]) { \
162			_dynsort_arr = dynsymsort; \
163			_dynsort_ndx = &dynsymsort_ndx; \
164		} else if (_type == STT_TLS) { \
165			_dynsort_arr = dyntlssort; \
166			_dynsort_ndx = &dyntlssort_ndx; \
167		} else { \
168			_dynsort_arr = NULL; \
169		} \
170		if ((_dynsort_arr != NULL) && DYNSORT_TEST_ATTR(_sdp, _sym)) \
171			_dynsort_arr[(*_dynsort_ndx)++] = _sym_ndx; \
172	}
173
174
175	Sym_desc	*sdp;
176	Sym_avlnode	*sav;
177	Sg_desc		*sgp, *tsgp = NULL, *dsgp = NULL, *esgp = NULL;
178	Os_desc		*osp, *iosp = NULL, *fosp = NULL;
179	Is_desc		*isc;
180	Ifl_desc	*ifl;
181	Word		bssndx, etext_ndx, edata_ndx = 0, end_ndx, start_ndx;
182	Word		end_abs = 0, etext_abs = 0, edata_abs;
183	Word		tlsbssndx = 0, parexpnndx;
184#if	defined(_ELF64)
185	Word		lbssndx = 0;
186	Addr		lbssaddr = 0;
187#endif
188	Addr		bssaddr, etext = 0, edata = 0, end = 0, start = 0;
189	Addr		tlsbssaddr = 0;
190	Addr 		parexpnbase, parexpnaddr;
191	int		start_set = 0;
192	Sym		_sym = {0}, *sym, *symtab = NULL;
193	Sym		*dynsym = NULL, *ldynsym = NULL;
194	Word		symtab_ndx = 0;		/* index into .symtab */
195	Word		symtab_gbl_bndx;	/* .symtab ndx 1st global */
196	Word		ldynsym_ndx = 0;	/* index into .SUNW_ldynsym */
197	Word		dynsym_ndx = 0;		/* index into .dynsym */
198	Word		scopesym_ndx = 0;	/* index into scoped symbols */
199	Word		scopesym_bndx = 0;	/* .symtab ndx 1st scoped sym */
200	Word		ldynscopesym_ndx = 0;	/* index to ldynsym scoped */
201						/*	symbols */
202	Word		*dynsymsort = NULL;	/* SUNW_dynsymsort index */
203						/*	vector */
204	Word		*dyntlssort = NULL;	/* SUNW_dyntlssort index */
205						/*	vector */
206	Word		dynsymsort_ndx;		/* index dynsymsort array */
207	Word		dyntlssort_ndx;		/* index dyntlssort array */
208	Word		*symndx;		/* symbol index (for */
209						/*	relocation use) */
210	Word		*symshndx = NULL;	/* .symtab_shndx table */
211	Word		*dynshndx = NULL;	/* .dynsym_shndx table */
212	Word		*ldynshndx = NULL;	/* .SUNW_ldynsym_shndx table */
213	Word		ldynsym_cnt = NULL;	/* number of items in */
214						/*	.SUNW_ldynsym */
215	Str_tbl		*shstrtab;
216	Str_tbl		*strtab;
217	Str_tbl		*dynstr;
218	Word		*hashtab;	/* hash table pointer */
219	Word		*hashbkt;	/* hash table bucket pointer */
220	Word		*hashchain;	/* hash table chain pointer */
221	Word		hashval;	/* value of hash function */
222	Wk_desc		*wkp;
223	Alist		*weak = NULL;
224	ofl_flag_t	flags = ofl->ofl_flags;
225	Versym		*versym;
226	Gottable	*gottable;	/* used for display got debugging */
227					/*	information */
228	Syminfo		*syminfo;
229	Sym_s_list	*sorted_syms;	/* table to hold sorted symbols */
230	Word		ssndx;		/* global index into sorted_syms */
231	Word		scndx;		/* scoped index into sorted_syms */
232	size_t		stoff;		/* string offset */
233	Aliste		idx1;
234
235	/*
236	 * Initialize pointers to the symbol table entries and the symbol
237	 * table strings.  Skip the first symbol entry and the first string
238	 * table byte.  Note that if we are not generating any output symbol
239	 * tables we must still generate and update internal copies so
240	 * that the relocation phase has the correct information.
241	 */
242	if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ) ||
243	    ((flags & FLG_OF_STATIC) && ofl->ofl_osversym)) {
244		symtab = (Sym *)ofl->ofl_ossymtab->os_outdata->d_buf;
245		symtab[symtab_ndx++] = _sym;
246		if (ofl->ofl_ossymshndx)
247			symshndx =
248			    (Word *)ofl->ofl_ossymshndx->os_outdata->d_buf;
249	}
250	if (OFL_ALLOW_DYNSYM(ofl)) {
251		dynsym = (Sym *)ofl->ofl_osdynsym->os_outdata->d_buf;
252		dynsym[dynsym_ndx++] = _sym;
253		/*
254		 * If we are also constructing a .SUNW_ldynsym section
255		 * to contain local function symbols, then set it up too.
256		 */
257		if (ofl->ofl_osldynsym) {
258			ldynsym = (Sym *)ofl->ofl_osldynsym->os_outdata->d_buf;
259			ldynsym[ldynsym_ndx++] = _sym;
260			ldynsym_cnt = 1 + ofl->ofl_dynlocscnt +
261			    ofl->ofl_dynscopecnt;
262
263			/*
264			 * If there is a SUNW_ldynsym, then there may also
265			 * be a .SUNW_dynsymsort and/or .SUNW_dyntlssort
266			 * sections, used to collect indices of function
267			 * and data symbols sorted by address order.
268			 */
269			if (ofl->ofl_osdynsymsort) {	/* .SUNW_dynsymsort */
270				dynsymsort = (Word *)
271				    ofl->ofl_osdynsymsort->os_outdata->d_buf;
272				dynsymsort_ndx = 0;
273			}
274			if (ofl->ofl_osdyntlssort) {	/* .SUNW_dyntlssort */
275				dyntlssort = (Word *)
276				    ofl->ofl_osdyntlssort->os_outdata->d_buf;
277				dyntlssort_ndx = 0;
278			}
279		}
280
281		/*
282		 * Initialize the hash table.
283		 */
284		hashtab = (Word *)(ofl->ofl_oshash->os_outdata->d_buf);
285		hashbkt = &hashtab[2];
286		hashchain = &hashtab[2 + ofl->ofl_hashbkts];
287		hashtab[0] = ofl->ofl_hashbkts;
288		hashtab[1] = DYNSYM_ALL_CNT(ofl);
289		if (ofl->ofl_osdynshndx)
290			dynshndx =
291			    (Word *)ofl->ofl_osdynshndx->os_outdata->d_buf;
292		if (ofl->ofl_osldynshndx)
293			ldynshndx =
294			    (Word *)ofl->ofl_osldynshndx->os_outdata->d_buf;
295	}
296
297	/*
298	 * symndx is the symbol index to be used for relocation processing.  It
299	 * points to the relevant symtab's (.dynsym or .symtab) symbol ndx.
300	 */
301	if (dynsym)
302		symndx = &dynsym_ndx;
303	else
304		symndx = &symtab_ndx;
305
306	/*
307	 * If we have version definitions initialize the version symbol index
308	 * table.  There is one entry for each symbol which contains the symbols
309	 * version index.
310	 */
311	if (!(flags & FLG_OF_NOVERSEC) &&
312	    (flags & (FLG_OF_VERNEED | FLG_OF_VERDEF))) {
313		versym = (Versym *)ofl->ofl_osversym->os_outdata->d_buf;
314		versym[0] = NULL;
315	} else
316		versym = NULL;
317
318	/*
319	 * If syminfo section exists be prepared to fill it in.
320	 */
321	if (ofl->ofl_ossyminfo) {
322		syminfo = ofl->ofl_ossyminfo->os_outdata->d_buf;
323		syminfo[0].si_flags = SYMINFO_CURRENT;
324	} else
325		syminfo = NULL;
326
327	/*
328	 * Setup our string tables.
329	 */
330	shstrtab = ofl->ofl_shdrsttab;
331	strtab = ofl->ofl_strtab;
332	dynstr = ofl->ofl_dynstrtab;
333
334	DBG_CALL(Dbg_syms_sec_title(ofl->ofl_lml));
335
336	/*
337	 * Put output file name to the first .symtab and .SUNW_ldynsym symbol.
338	 */
339	if (symtab) {
340		(void) st_setstring(strtab, ofl->ofl_name, &stoff);
341		sym = &symtab[symtab_ndx++];
342		/* LINTED */
343		sym->st_name = stoff;
344		sym->st_value = 0;
345		sym->st_size = 0;
346		sym->st_info = ELF_ST_INFO(STB_LOCAL, STT_FILE);
347		sym->st_other = 0;
348		sym->st_shndx = SHN_ABS;
349
350		if (versym && !dynsym)
351			versym[1] = 0;
352	}
353	if (ldynsym) {
354		(void) st_setstring(dynstr, ofl->ofl_name, &stoff);
355		sym = &ldynsym[ldynsym_ndx];
356		/* LINTED */
357		sym->st_name = stoff;
358		sym->st_value = 0;
359		sym->st_size = 0;
360		sym->st_info = ELF_ST_INFO(STB_LOCAL, STT_FILE);
361		sym->st_other = 0;
362		sym->st_shndx = SHN_ABS;
363
364		/* Scoped symbols get filled in global loop below */
365		ldynscopesym_ndx = ldynsym_ndx + 1;
366		ldynsym_ndx += ofl->ofl_dynscopecnt;
367	}
368
369	/*
370	 * If we are to display GOT summary information, then allocate
371	 * the buffer to 'cache' the GOT symbols into now.
372	 */
373	if (DBG_ENABLED) {
374		if ((ofl->ofl_gottable = gottable =
375		    libld_calloc(ofl->ofl_gotcnt, sizeof (Gottable))) == NULL)
376		return ((Addr)S_ERROR);
377	}
378
379	/*
380	 * Traverse the program headers.  Determine the last executable segment
381	 * and the last data segment so that we can update etext and edata. If
382	 * we have empty segments (reservations) record them for setting _end.
383	 */
384	for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
385		Phdr	*phd = &(sgp->sg_phdr);
386		Os_desc	*osp;
387		Aliste	idx2;
388
389		if (phd->p_type == PT_LOAD) {
390			if (sgp->sg_osdescs != NULL) {
391				Word	_flags = phd->p_flags & (PF_W | PF_R);
392
393				if (_flags == PF_R)
394					tsgp = sgp;
395				else if (_flags == (PF_W | PF_R))
396					dsgp = sgp;
397			} else if (sgp->sg_flags & FLG_SG_EMPTY)
398				esgp = sgp;
399		}
400
401		/*
402		 * Generate a section symbol for each output section.
403		 */
404		for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
405			Word	sectndx;
406
407			sym = &_sym;
408			sym->st_value = osp->os_shdr->sh_addr;
409			sym->st_info = ELF_ST_INFO(STB_LOCAL, STT_SECTION);
410			/* LINTED */
411			sectndx = elf_ndxscn(osp->os_scn);
412
413			if (symtab) {
414				if (sectndx >= SHN_LORESERVE) {
415					symshndx[symtab_ndx] = sectndx;
416					sym->st_shndx = SHN_XINDEX;
417				} else {
418					/* LINTED */
419					sym->st_shndx = (Half)sectndx;
420				}
421				symtab[symtab_ndx++] = *sym;
422			}
423
424			if (dynsym && (osp->os_flags & FLG_OS_OUTREL))
425				dynsym[dynsym_ndx++] = *sym;
426
427			if ((dynsym == NULL) ||
428			    (osp->os_flags & FLG_OS_OUTREL)) {
429				if (versym)
430					versym[*symndx - 1] = 0;
431				osp->os_identndx = *symndx - 1;
432				DBG_CALL(Dbg_syms_sec_entry(ofl->ofl_lml,
433				    osp->os_identndx, sgp, osp));
434			}
435
436			/*
437			 * Generate the .shstrtab for this section.
438			 */
439			(void) st_setstring(shstrtab, osp->os_name, &stoff);
440			osp->os_shdr->sh_name = (Word)stoff;
441
442			/*
443			 * Find the section index for our special symbols.
444			 */
445			if (sgp == tsgp) {
446				/* LINTED */
447				etext_ndx = elf_ndxscn(osp->os_scn);
448			} else if (dsgp == sgp) {
449				if (osp->os_shdr->sh_type != SHT_NOBITS) {
450					/* LINTED */
451					edata_ndx = elf_ndxscn(osp->os_scn);
452				}
453			}
454
455			if (start_set == 0) {
456				start = sgp->sg_phdr.p_vaddr;
457				/* LINTED */
458				start_ndx = elf_ndxscn(osp->os_scn);
459				start_set++;
460			}
461
462			/*
463			 * While we're here, determine whether a .init or .fini
464			 * section exist.
465			 */
466			if ((iosp == NULL) && (strcmp(osp->os_name,
467			    MSG_ORIG(MSG_SCN_INIT)) == 0))
468				iosp = osp;
469			if ((fosp == NULL) && (strcmp(osp->os_name,
470			    MSG_ORIG(MSG_SCN_FINI)) == 0))
471				fosp = osp;
472		}
473	}
474
475	/*
476	 * Add local register symbols to the .dynsym.  These are required as
477	 * DT_REGISTER .dynamic entries must have a symbol to reference.
478	 */
479	if (ofl->ofl_regsyms && dynsym) {
480		int	ndx;
481
482		for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) {
483			Sym_desc	*rsdp;
484
485			if ((rsdp = ofl->ofl_regsyms[ndx]) == NULL)
486				continue;
487
488			if (((rsdp->sd_flags & FLG_SY_HIDDEN) == 0) &&
489			    (ELF_ST_BIND(rsdp->sd_sym->st_info) != STB_LOCAL))
490				continue;
491
492			dynsym[dynsym_ndx] = *(rsdp->sd_sym);
493			rsdp->sd_symndx = *symndx;
494
495			if (dynsym[dynsym_ndx].st_name) {
496				(void) st_setstring(dynstr, rsdp->sd_name,
497				    &stoff);
498				dynsym[dynsym_ndx].st_name = stoff;
499			}
500			dynsym_ndx++;
501		}
502	}
503
504	/*
505	 * Having traversed all the output segments, warn the user if the
506	 * traditional text or data segments don't exist.  Otherwise from these
507	 * segments establish the values for `etext', `edata', `end', `END',
508	 * and `START'.
509	 */
510	if (!(flags & FLG_OF_RELOBJ)) {
511		Sg_desc	*sgp;
512
513		if (tsgp)
514			etext = tsgp->sg_phdr.p_vaddr + tsgp->sg_phdr.p_filesz;
515		else {
516			etext = (Addr)0;
517			etext_ndx = SHN_ABS;
518			etext_abs = 1;
519			if (flags & FLG_OF_VERBOSE)
520				eprintf(ofl->ofl_lml, ERR_WARNING,
521				    MSG_INTL(MSG_UPD_NOREADSEG));
522		}
523		if (dsgp) {
524			edata = dsgp->sg_phdr.p_vaddr + dsgp->sg_phdr.p_filesz;
525		} else {
526			edata = (Addr)0;
527			edata_ndx = SHN_ABS;
528			edata_abs = 1;
529			if (flags & FLG_OF_VERBOSE)
530				eprintf(ofl->ofl_lml, ERR_WARNING,
531				    MSG_INTL(MSG_UPD_NORDWRSEG));
532		}
533
534		if (dsgp == NULL) {
535			if (tsgp)
536				sgp = tsgp;
537			else
538				sgp = 0;
539		} else if (tsgp == NULL)
540			sgp = dsgp;
541		else if (dsgp->sg_phdr.p_vaddr > tsgp->sg_phdr.p_vaddr)
542			sgp = dsgp;
543		else if (dsgp->sg_phdr.p_vaddr < tsgp->sg_phdr.p_vaddr)
544			sgp = tsgp;
545		else {
546			/*
547			 * One of the segments must be of zero size.
548			 */
549			if (tsgp->sg_phdr.p_memsz)
550				sgp = tsgp;
551			else
552				sgp = dsgp;
553		}
554
555		if (esgp && (esgp->sg_phdr.p_vaddr > sgp->sg_phdr.p_vaddr))
556			sgp = esgp;
557
558		if (sgp) {
559			end = sgp->sg_phdr.p_vaddr + sgp->sg_phdr.p_memsz;
560
561			/*
562			 * If the last loadable segment is a read-only segment,
563			 * then the application which uses the symbol _end to
564			 * find the beginning of writable heap area may cause
565			 * segmentation violation. We adjust the value of the
566			 * _end to skip to the next page boundary.
567			 *
568			 * 6401812 System interface which returs beginning
569			 *	   heap would be nice.
570			 * When the above RFE is implemented, the changes below
571			 * could be changed in a better way.
572			 */
573			if ((sgp->sg_phdr.p_flags & PF_W) == 0)
574				end = (Addr)S_ROUND(end, sysconf(_SC_PAGESIZE));
575
576			/*
577			 * If we're dealing with a memory reservation there are
578			 * no sections to establish an index for _end, so assign
579			 * it as an absolute.
580			 */
581			if (sgp->sg_osdescs != NULL) {
582				/*
583				 * Determine the last section for this segment.
584				 */
585				Os_desc	*osp = sgp->sg_osdescs->apl_data
586				    [sgp->sg_osdescs->apl_nitems - 1];
587
588				/* LINTED */
589				end_ndx = elf_ndxscn(osp->os_scn);
590			} else {
591				end_ndx = SHN_ABS;
592				end_abs = 1;
593			}
594		} else {
595			end = (Addr) 0;
596			end_ndx = SHN_ABS;
597			end_abs = 1;
598			eprintf(ofl->ofl_lml, ERR_WARNING,
599			    MSG_INTL(MSG_UPD_NOSEG));
600		}
601	}
602
603	/*
604	 * Initialize the scoped symbol table entry point.  This is for all
605	 * the global symbols that have been scoped to locals and will be
606	 * filled in during global symbol processing so that we don't have
607	 * to traverse the globals symbol hash array more than once.
608	 */
609	if (symtab) {
610		scopesym_bndx = symtab_ndx;
611		scopesym_ndx = scopesym_bndx;
612		symtab_ndx += ofl->ofl_scopecnt;
613	}
614
615	/*
616	 * If expanding partially expanded symbols under '-z nopartial',
617	 * prepare to do that.
618	 */
619	if (ofl->ofl_isparexpn) {
620		osp = ofl->ofl_isparexpn->is_osdesc;
621		parexpnbase = parexpnaddr = (Addr)(osp->os_shdr->sh_addr +
622		    ofl->ofl_isparexpn->is_indata->d_off);
623		/* LINTED */
624		parexpnndx = elf_ndxscn(osp->os_scn);
625		ofl->ofl_parexpnndx = osp->os_identndx;
626	}
627
628	/*
629	 * If we are generating a .symtab collect all the local symbols,
630	 * assigning a new virtual address or displacement (value).
631	 */
632	for (APLIST_TRAVERSE(ofl->ofl_objs, idx1, ifl)) {
633		Xword	lndx, local = ifl->ifl_locscnt;
634
635		for (lndx = 1; lndx < local; lndx++) {
636			Gotndx		*gnp;
637			uchar_t		type;
638			Word		*_symshndx;
639			int		enter_in_symtab, enter_in_ldynsym;
640			int		update_done;
641
642			sdp = ifl->ifl_oldndx[lndx];
643			sym = sdp->sd_sym;
644
645			/*
646			 * Assign a got offset if necessary.
647			 */
648			if ((ld_targ.t_mr.mr_assign_got != NULL) &&
649			    (*ld_targ.t_mr.mr_assign_got)(ofl, sdp) == S_ERROR)
650				return ((Addr)S_ERROR);
651
652			if (DBG_ENABLED) {
653				Aliste	idx2;
654
655				for (ALIST_TRAVERSE(sdp->sd_GOTndxs,
656				    idx2, gnp)) {
657					gottable->gt_sym = sdp;
658					gottable->gt_gndx.gn_gotndx =
659					    gnp->gn_gotndx;
660					gottable->gt_gndx.gn_addend =
661					    gnp->gn_addend;
662					gottable++;
663				}
664			}
665
666			if ((type = ELF_ST_TYPE(sym->st_info)) == STT_SECTION)
667				continue;
668
669			/*
670			 * Ignore any symbols that have been marked as invalid
671			 * during input processing.  Providing these aren't used
672			 * for relocation they'll just be dropped from the
673			 * output image.
674			 */
675			if (sdp->sd_flags & FLG_SY_INVALID)
676				continue;
677
678			/*
679			 * If the section that this symbol was associated
680			 * with has been discarded - then we discard
681			 * the local symbol along with it.
682			 */
683			if (sdp->sd_flags & FLG_SY_ISDISC)
684				continue;
685
686			/*
687			 * If this symbol is from a different file
688			 * than the input descriptor we are processing,
689			 * treat it as if it has FLG_SY_ISDISC set.
690			 * This happens when sloppy_comdat_reloc()
691			 * replaces a symbol to a discarded comdat section
692			 * with an equivalent symbol from a different
693			 * file. We only want to enter such a symbol
694			 * once --- as part of the file that actually
695			 * supplies it.
696			 */
697			if (ifl != sdp->sd_file)
698				continue;
699
700
701			/*
702			 * Generate an output symbol to represent this input
703			 * symbol.  Even if the symbol table is to be stripped
704			 * we still need to update any local symbols that are
705			 * used during relocation.
706			 */
707			enter_in_symtab = symtab &&
708			    (!(ofl->ofl_flags & FLG_OF_REDLSYM) ||
709			    sdp->sd_move);
710			enter_in_ldynsym = ldynsym && sdp->sd_name &&
711			    ldynsym_symtype[type] &&
712			    !(ofl->ofl_flags & FLG_OF_REDLSYM);
713			_symshndx = NULL;
714
715			if (enter_in_symtab) {
716				if (!dynsym)
717					sdp->sd_symndx = *symndx;
718				symtab[symtab_ndx] = *sym;
719				/*
720				 * Provided this isn't an unnamed register
721				 * symbol, update its name.
722				 */
723				if (((sdp->sd_flags & FLG_SY_REGSYM) == 0) ||
724				    symtab[symtab_ndx].st_name) {
725					(void) st_setstring(strtab,
726					    sdp->sd_name, &stoff);
727					symtab[symtab_ndx].st_name = stoff;
728				}
729				sdp->sd_flags &= ~FLG_SY_CLEAN;
730				if (symshndx)
731					_symshndx = &symshndx[symtab_ndx];
732				sdp->sd_sym = sym = &symtab[symtab_ndx++];
733
734				if ((sdp->sd_flags & FLG_SY_SPECSEC) &&
735				    (sym->st_shndx == SHN_ABS) &&
736				    !enter_in_ldynsym)
737					continue;
738			} else if (enter_in_ldynsym) {
739				/*
740				 * Not using symtab, but we do have ldynsym
741				 * available.
742				 */
743				ldynsym[ldynsym_ndx] = *sym;
744				(void) st_setstring(dynstr, sdp->sd_name,
745				    &stoff);
746				ldynsym[ldynsym_ndx].st_name = stoff;
747
748				sdp->sd_flags &= ~FLG_SY_CLEAN;
749				if (ldynshndx)
750					_symshndx = &ldynshndx[ldynsym_ndx];
751				sdp->sd_sym = sym = &ldynsym[ldynsym_ndx];
752				/* Add it to sort section if it qualifies */
753				ADD_TO_DYNSORT(sdp, sym, type, ldynsym_ndx);
754				ldynsym_ndx++;
755			} else {	/* Not using symtab or ldynsym */
756				/*
757				 * If this symbol requires modifying to provide
758				 * for a relocation or move table update, make
759				 * a copy of it.
760				 */
761				if (!(sdp->sd_flags & FLG_SY_UPREQD) &&
762				    !(sdp->sd_move))
763					continue;
764				if ((sdp->sd_flags & FLG_SY_SPECSEC) &&
765				    (sym->st_shndx == SHN_ABS))
766					continue;
767
768				if (ld_sym_copy(sdp) == S_ERROR)
769					return ((Addr)S_ERROR);
770				sym = sdp->sd_sym;
771			}
772
773			/*
774			 * Update the symbols contents if necessary.
775			 */
776			update_done = 0;
777			if (type == STT_FILE) {
778				sdp->sd_shndx = sym->st_shndx = SHN_ABS;
779				sdp->sd_flags |= FLG_SY_SPECSEC;
780				update_done = 1;
781			}
782
783			/*
784			 * If we are expanding the locally bound partially
785			 * initialized symbols, then update the address here.
786			 */
787			if (ofl->ofl_isparexpn &&
788			    (sdp->sd_flags & FLG_SY_PAREXPN) && !update_done) {
789				sym->st_shndx = parexpnndx;
790				sdp->sd_isc = ofl->ofl_isparexpn;
791				sym->st_value = parexpnaddr;
792				parexpnaddr += sym->st_size;
793				if ((flags & FLG_OF_RELOBJ) == 0)
794					sym->st_value -= parexpnbase;
795			}
796
797			/*
798			 * If this isn't an UNDEF symbol (ie. an input section
799			 * is associated), update the symbols value and index.
800			 */
801			if (((isc = sdp->sd_isc) != 0) && !update_done) {
802				Word	sectndx;
803
804				osp = isc->is_osdesc;
805				/* LINTED */
806				sym->st_value +=
807				    (Off)_elf_getxoff(isc->is_indata);
808				if ((flags & FLG_OF_RELOBJ) == 0) {
809					sym->st_value += osp->os_shdr->sh_addr;
810					/*
811					 * TLS symbols are relative to
812					 * the TLS segment.
813					 */
814					if ((type == STT_TLS) &&
815					    (ofl->ofl_tlsphdr)) {
816						sym->st_value -=
817						    ofl->ofl_tlsphdr->p_vaddr;
818					}
819				}
820				/* LINTED */
821				if ((sdp->sd_shndx = sectndx =
822				    elf_ndxscn(osp->os_scn)) >= SHN_LORESERVE) {
823					if (_symshndx) {
824						*_symshndx = sectndx;
825					}
826					sym->st_shndx = SHN_XINDEX;
827				} else {
828					/* LINTED */
829					sym->st_shndx = sectndx;
830				}
831			}
832
833			/*
834			 * If entering the symbol in both the symtab and the
835			 * ldynsym, then the one in symtab needs to be
836			 * copied to ldynsym. If it is only in the ldynsym,
837			 * then the code above already set it up and we have
838			 * nothing more to do here.
839			 */
840			if (enter_in_symtab && enter_in_ldynsym) {
841				ldynsym[ldynsym_ndx] = *sym;
842				(void) st_setstring(dynstr, sdp->sd_name,
843				    &stoff);
844				ldynsym[ldynsym_ndx].st_name = stoff;
845
846				if (_symshndx && ldynshndx)
847					ldynshndx[ldynsym_ndx] = *_symshndx;
848
849				/* Add it to sort section if it qualifies */
850				ADD_TO_DYNSORT(sdp, sym, type, ldynsym_ndx);
851
852				ldynsym_ndx++;
853			}
854		}
855	}
856	symtab_gbl_bndx = symtab_ndx;	/* .symtab index of 1st global entry */
857
858	/*
859	 * Two special symbols are `_init' and `_fini'.  If these are supplied
860	 * by crti.o then they are used to represent the total concatenation of
861	 * the `.init' and `.fini' sections.
862	 *
863	 * Determine whether any .init or .fini sections exist.  If these
864	 * sections exist and a dynamic object is being built, but no `_init'
865	 * or `_fini' symbols are found, then the user is probably building
866	 * this object directly from ld(1) rather than using a compiler driver
867	 * that provides the symbols via crt's.
868	 *
869	 * If the .init or .fini section exist, and their associated symbols,
870	 * determine the size of the sections and updated the symbols value
871	 * accordingly.
872	 */
873	if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U), SYM_NOHASH, 0,
874	    ofl)) != NULL) && (sdp->sd_ref == REF_REL_NEED) && sdp->sd_isc &&
875	    (sdp->sd_isc->is_osdesc == iosp)) {
876		if (ld_sym_copy(sdp) == S_ERROR)
877			return ((Addr)S_ERROR);
878		sdp->sd_sym->st_size = sdp->sd_isc->is_osdesc->os_shdr->sh_size;
879
880	} else if (iosp && !(flags & FLG_OF_RELOBJ)) {
881		eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_SYM_NOCRT),
882		    MSG_ORIG(MSG_SYM_INIT_U), MSG_ORIG(MSG_SCN_INIT));
883	}
884
885	if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U), SYM_NOHASH, 0,
886	    ofl)) != NULL) && (sdp->sd_ref == REF_REL_NEED) && sdp->sd_isc &&
887	    (sdp->sd_isc->is_osdesc == fosp)) {
888		if (ld_sym_copy(sdp) == S_ERROR)
889			return ((Addr)S_ERROR);
890		sdp->sd_sym->st_size = sdp->sd_isc->is_osdesc->os_shdr->sh_size;
891
892	} else if (fosp && !(flags & FLG_OF_RELOBJ)) {
893		eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_SYM_NOCRT),
894		    MSG_ORIG(MSG_SYM_FINI_U), MSG_ORIG(MSG_SCN_FINI));
895	}
896
897	/*
898	 * Assign .bss information for use with updating COMMON symbols.
899	 */
900	if (ofl->ofl_isbss) {
901		isc = ofl->ofl_isbss;
902		osp = isc->is_osdesc;
903
904		bssaddr = osp->os_shdr->sh_addr +
905		    (Off)_elf_getxoff(isc->is_indata);
906		/* LINTED */
907		bssndx = elf_ndxscn(osp->os_scn);
908	}
909
910#if	defined(_ELF64)
911	/*
912	 * For amd64 target, assign .lbss information for use
913	 * with updating LCOMMON symbols.
914	 */
915	if ((ld_targ.t_m.m_mach == EM_AMD64) && ofl->ofl_islbss) {
916		osp = ofl->ofl_islbss->is_osdesc;
917
918		lbssaddr = osp->os_shdr->sh_addr +
919		    (Off)_elf_getxoff(ofl->ofl_islbss->is_indata);
920		/* LINTED */
921		lbssndx = elf_ndxscn(osp->os_scn);
922	}
923#endif
924
925	/*
926	 * Assign .tlsbss information for use with updating COMMON symbols.
927	 */
928	if (ofl->ofl_istlsbss) {
929		osp = ofl->ofl_istlsbss->is_osdesc;
930		tlsbssaddr = osp->os_shdr->sh_addr +
931		    (Off)_elf_getxoff(ofl->ofl_istlsbss->is_indata);
932		/* LINTED */
933		tlsbssndx = elf_ndxscn(osp->os_scn);
934	}
935
936	if ((sorted_syms = libld_calloc(ofl->ofl_globcnt +
937	    ofl->ofl_elimcnt + ofl->ofl_scopecnt,
938	    sizeof (*sorted_syms))) == NULL)
939		return ((Addr)S_ERROR);
940
941	scndx = 0;
942	ssndx = ofl->ofl_scopecnt + ofl->ofl_elimcnt;
943
944	DBG_CALL(Dbg_syms_up_title(ofl->ofl_lml));
945
946	/*
947	 * Traverse the internal symbol table updating global symbol information
948	 * and allocating common.
949	 */
950	for (sav = avl_first(&ofl->ofl_symavl); sav;
951	    sav = AVL_NEXT(&ofl->ofl_symavl, sav)) {
952		Sym	*symptr;
953		int	local;
954		int	restore;
955
956		sdp = sav->sav_sdp;
957
958		/*
959		 * Ignore any symbols that have been marked as invalid during
960		 * input processing.  Providing these aren't used for
961		 * relocation, they will be dropped from the output image.
962		 */
963		if (sdp->sd_flags & FLG_SY_INVALID) {
964			DBG_CALL(Dbg_syms_old(ofl, sdp));
965			DBG_CALL(Dbg_syms_ignore(ofl, sdp));
966			continue;
967		}
968
969		/*
970		 * Only needed symbols are copied to the output symbol table.
971		 */
972		if (sdp->sd_ref == REF_DYN_SEEN)
973			continue;
974
975		if ((sdp->sd_flags & FLG_SY_HIDDEN) && (flags & FLG_OF_PROCRED))
976			local = 1;
977		else
978			local = 0;
979
980		if (local || (ofl->ofl_hashbkts == 0)) {
981			sorted_syms[scndx++].sl_sdp = sdp;
982		} else {
983			sorted_syms[ssndx].sl_hval = sdp->sd_aux->sa_hash %
984			    ofl->ofl_hashbkts;
985			sorted_syms[ssndx].sl_sdp = sdp;
986			ssndx++;
987		}
988
989		/*
990		 * Note - expand the COMMON symbols here because an address
991		 * must be assigned to them in the same order that space was
992		 * calculated in sym_validate().  If this ordering isn't
993		 * followed differing alignment requirements can throw us all
994		 * out of whack.
995		 *
996		 * The expanded .bss global symbol is handled here as well.
997		 *
998		 * The actual adding entries into the symbol table still occurs
999		 * below in hashbucket order.
1000		 */
1001		symptr = sdp->sd_sym;
1002		restore = 0;
1003		if ((sdp->sd_flags & FLG_SY_PAREXPN) ||
1004		    ((sdp->sd_flags & FLG_SY_SPECSEC) &&
1005		    (sdp->sd_shndx = symptr->st_shndx) == SHN_COMMON)) {
1006
1007			/*
1008			 * An expanded symbol goes to a special .data section
1009			 * prepared for that purpose (ofl->ofl_isparexpn).
1010			 * Assign COMMON allocations to .bss.
1011			 * Otherwise leave it as is.
1012			 */
1013			if (sdp->sd_flags & FLG_SY_PAREXPN) {
1014				restore = 1;
1015				sdp->sd_shndx = parexpnndx;
1016				sdp->sd_flags &= ~FLG_SY_SPECSEC;
1017				symptr->st_value = (Xword) S_ROUND(
1018				    parexpnaddr, symptr->st_value);
1019				parexpnaddr = symptr->st_value +
1020				    symptr->st_size;
1021				sdp->sd_isc = ofl->ofl_isparexpn;
1022				sdp->sd_flags |= FLG_SY_COMMEXP;
1023
1024			} else if (ELF_ST_TYPE(symptr->st_info) != STT_TLS &&
1025			    (local || !(flags & FLG_OF_RELOBJ))) {
1026				restore = 1;
1027				sdp->sd_shndx = bssndx;
1028				sdp->sd_flags &= ~FLG_SY_SPECSEC;
1029				symptr->st_value = (Xword)S_ROUND(bssaddr,
1030				    symptr->st_value);
1031				bssaddr = symptr->st_value + symptr->st_size;
1032				sdp->sd_isc = ofl->ofl_isbss;
1033				sdp->sd_flags |= FLG_SY_COMMEXP;
1034
1035			} else if (ELF_ST_TYPE(symptr->st_info) == STT_TLS &&
1036			    (local || !(flags & FLG_OF_RELOBJ))) {
1037				restore = 1;
1038				sdp->sd_shndx = tlsbssndx;
1039				sdp->sd_flags &= ~FLG_SY_SPECSEC;
1040				symptr->st_value = (Xword)S_ROUND(tlsbssaddr,
1041				    symptr->st_value);
1042				tlsbssaddr = symptr->st_value + symptr->st_size;
1043				sdp->sd_isc = ofl->ofl_istlsbss;
1044				sdp->sd_flags |= FLG_SY_COMMEXP;
1045				/*
1046				 * TLS symbols are relative to the TLS segment.
1047				 */
1048				symptr->st_value -= ofl->ofl_tlsphdr->p_vaddr;
1049			}
1050#if	defined(_ELF64)
1051		} else if ((ld_targ.t_m.m_mach == EM_AMD64) &&
1052		    (sdp->sd_flags & FLG_SY_SPECSEC) &&
1053		    ((sdp->sd_shndx = symptr->st_shndx) ==
1054		    SHN_X86_64_LCOMMON) &&
1055		    ((local || !(flags & FLG_OF_RELOBJ)))) {
1056			restore = 1;
1057			sdp->sd_shndx = lbssndx;
1058			sdp->sd_flags &= ~FLG_SY_SPECSEC;
1059			symptr->st_value = (Xword)S_ROUND(lbssaddr,
1060			    symptr->st_value);
1061			lbssaddr = symptr->st_value + symptr->st_size;
1062			sdp->sd_isc = ofl->ofl_islbss;
1063			sdp->sd_flags |= FLG_SY_COMMEXP;
1064#endif
1065		}
1066
1067		if (restore != 0) {
1068			uchar_t		type, bind;
1069
1070			/*
1071			 * Make sure this COMMON symbol is returned to the same
1072			 * binding as was defined in the original relocatable
1073			 * object reference.
1074			 */
1075			type = ELF_ST_TYPE(symptr->st_info);
1076			if (sdp->sd_flags & FLG_SY_GLOBREF)
1077				bind = STB_GLOBAL;
1078			else
1079				bind = STB_WEAK;
1080
1081			symptr->st_info = ELF_ST_INFO(bind, type);
1082		}
1083	}
1084
1085	if (ofl->ofl_hashbkts) {
1086		qsort(sorted_syms + ofl->ofl_scopecnt + ofl->ofl_elimcnt,
1087		    ofl->ofl_globcnt, sizeof (Sym_s_list),
1088		    (int (*)(const void *, const void *))sym_hash_compare);
1089	}
1090
1091	for (ssndx = 0; ssndx < (ofl->ofl_elimcnt + ofl->ofl_scopecnt +
1092	    ofl->ofl_globcnt); ssndx++) {
1093		const char	*name;
1094		Sym		*sym;
1095		Sym_aux		*sap;
1096		Half		spec;
1097		int		local = 0, dynlocal = 0, enter_in_symtab;
1098		Gotndx		*gnp;
1099		Word		sectndx;
1100
1101		sdp = sorted_syms[ssndx].sl_sdp;
1102		sectndx = 0;
1103
1104		if (symtab)
1105			enter_in_symtab = 1;
1106		else
1107			enter_in_symtab = 0;
1108
1109		/*
1110		 * Assign a got offset if necessary.
1111		 */
1112		if ((ld_targ.t_mr.mr_assign_got != NULL) &&
1113		    (*ld_targ.t_mr.mr_assign_got)(ofl, sdp) == S_ERROR)
1114			return ((Addr)S_ERROR);
1115
1116		if (DBG_ENABLED) {
1117			Aliste	idx2;
1118
1119			for (ALIST_TRAVERSE(sdp->sd_GOTndxs, idx2, gnp)) {
1120				gottable->gt_sym = sdp;
1121				gottable->gt_gndx.gn_gotndx = gnp->gn_gotndx;
1122				gottable->gt_gndx.gn_addend = gnp->gn_addend;
1123				gottable++;
1124			}
1125
1126			if (sdp->sd_aux && sdp->sd_aux->sa_PLTGOTndx) {
1127				gottable->gt_sym = sdp;
1128				gottable->gt_gndx.gn_gotndx =
1129				    sdp->sd_aux->sa_PLTGOTndx;
1130				gottable++;
1131			}
1132		}
1133
1134
1135		/*
1136		 * If this symbol has been marked as being reduced to local
1137		 * scope then it will have to be placed in the scoped portion
1138		 * of the .symtab.  Retain the appropriate index for use in
1139		 * version symbol indexing and relocation.
1140		 */
1141		if ((sdp->sd_flags & FLG_SY_HIDDEN) &&
1142		    (flags & FLG_OF_PROCRED)) {
1143			local = 1;
1144			if (!(sdp->sd_flags & FLG_SY_ELIM) && !dynsym)
1145				sdp->sd_symndx = scopesym_ndx;
1146			else
1147				sdp->sd_symndx = 0;
1148
1149			if (sdp->sd_flags & FLG_SY_ELIM) {
1150				enter_in_symtab = 0;
1151			} else if (ldynsym && sdp->sd_sym->st_name &&
1152			    ldynsym_symtype[
1153			    ELF_ST_TYPE(sdp->sd_sym->st_info)]) {
1154				dynlocal = 1;
1155			}
1156		} else {
1157			sdp->sd_symndx = *symndx;
1158		}
1159
1160		/*
1161		 * Copy basic symbol and string information.
1162		 */
1163		name = sdp->sd_name;
1164		sap = sdp->sd_aux;
1165
1166		/*
1167		 * If we require to record version symbol indexes, update the
1168		 * associated version symbol information for all defined
1169		 * symbols.  If a version definition is required any zero value
1170		 * symbol indexes would have been flagged as undefined symbol
1171		 * errors, however if we're just scoping these need to fall into
1172		 * the base of global symbols.
1173		 */
1174		if (sdp->sd_symndx && versym) {
1175			Half	vndx = 0;
1176
1177			if (sdp->sd_flags & FLG_SY_MVTOCOMM) {
1178				vndx = VER_NDX_GLOBAL;
1179			} else if (sdp->sd_ref == REF_REL_NEED) {
1180				sd_flag_t	sdflags = sdp->sd_flags;
1181
1182				vndx = sap->sa_overndx;
1183				if ((vndx == 0) &&
1184				    (sdp->sd_sym->st_shndx != SHN_UNDEF)) {
1185					if (sdflags & FLG_SY_HIDDEN)
1186						vndx = VER_NDX_LOCAL;
1187					else
1188						vndx = VER_NDX_GLOBAL;
1189				}
1190			} else if ((sdp->sd_ref == REF_DYN_NEED) &&
1191			    (sap->sa_dverndx > 0) &&
1192			    (sap->sa_dverndx <= sdp->sd_file->ifl_vercnt) &&
1193			    (sdp->sd_file->ifl_verndx != NULL)) {
1194				/* Use index of verneed record */
1195				vndx = sdp->sd_file->ifl_verndx
1196				    [sap->sa_dverndx].vi_overndx;
1197			}
1198			versym[sdp->sd_symndx] = vndx;
1199		}
1200
1201		/*
1202		 * If we are creating the .syminfo section then set per symbol
1203		 * flags here.
1204		 */
1205		if (sdp->sd_symndx && syminfo &&
1206		    !(sdp->sd_flags & FLG_SY_NOTAVAIL)) {
1207			int	ndx = sdp->sd_symndx;
1208			APlist	**alpp = &(ofl->ofl_symdtent);
1209
1210			if (sdp->sd_flags & FLG_SY_MVTOCOMM)
1211				/*
1212				 * Identify a copy relocation symbol.
1213				 */
1214				syminfo[ndx].si_flags |= SYMINFO_FLG_COPY;
1215
1216			if (sdp->sd_ref == REF_DYN_NEED) {
1217				/*
1218				 * A reference is bound to a needed dependency.
1219				 * Save the syminfo entry, so that when the
1220				 * .dynamic section has been updated, a
1221				 * DT_NEEDED entry can be associated
1222				 * (see update_osyminfo()).
1223				 */
1224				if (aplist_append(alpp, sdp,
1225				    AL_CNT_OFL_SYMINFOSYMS) == NULL)
1226					return (0);
1227
1228				/*
1229				 * Flag that the symbol has a direct association
1230				 * with the external reference (this is an old
1231				 * tagging, that has no real effect by itself).
1232				 * And flag whether this reference is lazy
1233				 * loadable.
1234				 */
1235				syminfo[ndx].si_flags |= SYMINFO_FLG_DIRECT;
1236				if (sdp->sd_flags & FLG_SY_LAZYLD)
1237					syminfo[ndx].si_flags |=
1238					    SYMINFO_FLG_LAZYLOAD;
1239
1240				/*
1241				 * Enable direct symbol bindings if:
1242				 *
1243				 *  -	Symbol was identified with the DIRECT
1244				 *	keyword in a mapfile.
1245				 *
1246				 *  -	Symbol reference has been bound to a
1247				 * 	dependency which was specified as
1248				 *	requiring direct bindings with -zdirect.
1249				 *
1250				 *  -	All symbol references are required to
1251				 *	use direct bindings via -Bdirect.
1252				 */
1253				if (sdp->sd_flags & FLG_SY_DIR)
1254					syminfo[ndx].si_flags |=
1255					    SYMINFO_FLG_DIRECTBIND;
1256
1257			} else if ((sdp->sd_flags & FLG_SY_EXTERN) &&
1258			    (sdp->sd_sym->st_shndx == SHN_UNDEF)) {
1259				/*
1260				 * If this symbol has been explicitly defined
1261				 * as external, and remains unresolved, mark
1262				 * it as external.
1263				 */
1264				syminfo[ndx].si_boundto = SYMINFO_BT_EXTERN;
1265
1266			} else if ((sdp->sd_flags & FLG_SY_PARENT) &&
1267			    (sdp->sd_sym->st_shndx == SHN_UNDEF)) {
1268				/*
1269				 * If this symbol has been explicitly defined
1270				 * to be a reference to a parent object,
1271				 * indicate whether a direct binding should be
1272				 * established.
1273				 */
1274				syminfo[ndx].si_flags |= SYMINFO_FLG_DIRECT;
1275				syminfo[ndx].si_boundto = SYMINFO_BT_PARENT;
1276				if (sdp->sd_flags & FLG_SY_DIR)
1277					syminfo[ndx].si_flags |=
1278					    SYMINFO_FLG_DIRECTBIND;
1279
1280			} else if (sdp->sd_flags & FLG_SY_STDFLTR) {
1281				/*
1282				 * A filter definition.  Although this symbol
1283				 * can only be a stub, it might be necessary to
1284				 * prevent external direct bindings.
1285				 */
1286				syminfo[ndx].si_flags |= SYMINFO_FLG_FILTER;
1287				if (sdp->sd_flags & FLG_SY_NDIR)
1288					syminfo[ndx].si_flags |=
1289					    SYMINFO_FLG_NOEXTDIRECT;
1290
1291			} else if (sdp->sd_flags & FLG_SY_AUXFLTR) {
1292				/*
1293				 * An auxiliary filter definition.  By nature,
1294				 * this definition is direct, in that should the
1295				 * filtee lookup fail, we'll fall back to this
1296				 * object.  It may still be necesssary to
1297				 * prevent external direct bindings.
1298				 */
1299				syminfo[ndx].si_flags |= SYMINFO_FLG_AUXILIARY;
1300				if (sdp->sd_flags & FLG_SY_NDIR)
1301					syminfo[ndx].si_flags |=
1302					    SYMINFO_FLG_NOEXTDIRECT;
1303
1304			} else if ((sdp->sd_ref == REF_REL_NEED) &&
1305			    (sdp->sd_sym->st_shndx != SHN_UNDEF)) {
1306				/*
1307				 * This definition exists within the object
1308				 * being created.  Provide a default boundto
1309				 * definition, which may be overridden later.
1310				 */
1311				syminfo[ndx].si_boundto = SYMINFO_BT_NONE;
1312
1313				/*
1314				 * Indicate whether it is necessary to prevent
1315				 * external direct bindings.
1316				 */
1317				if (sdp->sd_flags & FLG_SY_NDIR) {
1318					syminfo[ndx].si_flags |=
1319					    SYMINFO_FLG_NOEXTDIRECT;
1320				}
1321
1322				/*
1323				 * Indicate that this symbol is acting as an
1324				 * individual interposer.
1325				 */
1326				if (sdp->sd_flags & FLG_SY_INTPOSE) {
1327					syminfo[ndx].si_flags |=
1328					    SYMINFO_FLG_INTERPOSE;
1329				}
1330
1331				/*
1332				 * If external bindings are allowed, indicate
1333				 * the binding, and a direct binding if
1334				 * necessary.
1335				 */
1336				if ((sdp->sd_flags & FLG_SY_NDIR) == 0) {
1337					syminfo[ndx].si_flags |=
1338					    SYMINFO_FLG_DIRECT;
1339
1340					if (sdp->sd_flags & FLG_SY_DIR)
1341						syminfo[ndx].si_flags |=
1342						    SYMINFO_FLG_DIRECTBIND;
1343
1344					/*
1345					 * Provide a default boundto definition,
1346					 * which may be overridden later.
1347					 */
1348					syminfo[ndx].si_boundto =
1349					    SYMINFO_BT_SELF;
1350				}
1351			}
1352		}
1353
1354		/*
1355		 * Note that the `sym' value is reset to be one of the new
1356		 * symbol table entries.  This symbol will be updated further
1357		 * depending on the type of the symbol.  Process the .symtab
1358		 * first, followed by the .dynsym, thus the `sym' value will
1359		 * remain as the .dynsym value when the .dynsym is present.
1360		 * This ensures that any versioning symbols st_name value will
1361		 * be appropriate for the string table used by version
1362		 * entries.
1363		 */
1364		if (enter_in_symtab) {
1365			Word	_symndx;
1366
1367			if (local)
1368				_symndx = scopesym_ndx;
1369			else
1370				_symndx = symtab_ndx;
1371
1372			symtab[_symndx] = *sdp->sd_sym;
1373			sdp->sd_sym = sym = &symtab[_symndx];
1374			(void) st_setstring(strtab, name, &stoff);
1375			sym->st_name = stoff;
1376		}
1377		if (dynlocal) {
1378			ldynsym[ldynscopesym_ndx] = *sdp->sd_sym;
1379			sdp->sd_sym = sym = &ldynsym[ldynscopesym_ndx];
1380			(void) st_setstring(dynstr, name, &stoff);
1381			ldynsym[ldynscopesym_ndx].st_name = stoff;
1382			/* Add it to sort section if it qualifies */
1383			ADD_TO_DYNSORT(sdp, sym, ELF_ST_TYPE(sym->st_info),
1384			    ldynscopesym_ndx);
1385		}
1386
1387		if (dynsym && !local) {
1388			dynsym[dynsym_ndx] = *sdp->sd_sym;
1389
1390			/*
1391			 * Provided this isn't an unnamed register symbol,
1392			 * update the symbols name and hash value.
1393			 */
1394			if (((sdp->sd_flags & FLG_SY_REGSYM) == 0) ||
1395			    dynsym[dynsym_ndx].st_name) {
1396				(void) st_setstring(dynstr, name, &stoff);
1397				dynsym[dynsym_ndx].st_name = stoff;
1398
1399				if (stoff) {
1400					Word _hashndx;
1401
1402					hashval =
1403					    sap->sa_hash % ofl->ofl_hashbkts;
1404
1405					/* LINTED */
1406					if (_hashndx = hashbkt[hashval]) {
1407						while (hashchain[_hashndx]) {
1408							_hashndx =
1409							    hashchain[_hashndx];
1410						}
1411						hashchain[_hashndx] =
1412						    sdp->sd_symndx;
1413					} else {
1414						hashbkt[hashval] =
1415						    sdp->sd_symndx;
1416					}
1417				}
1418			}
1419			sdp->sd_sym = sym = &dynsym[dynsym_ndx];
1420
1421			/*
1422			 * Add it to sort section if it qualifies.
1423			 * The indexes in that section are relative to the
1424			 * the adjacent SUNW_ldynsym/dymsym pair, so we
1425			 * add the number of items in SUNW_ldynsym to the
1426			 * dynsym index.
1427			 */
1428			ADD_TO_DYNSORT(sdp, sym, ELF_ST_TYPE(sym->st_info),
1429			    ldynsym_cnt + dynsym_ndx);
1430		}
1431		if (!enter_in_symtab && (!dynsym || (local && !dynlocal))) {
1432			if (!(sdp->sd_flags & FLG_SY_UPREQD))
1433				continue;
1434			sym = sdp->sd_sym;
1435		} else
1436			sdp->sd_flags &= ~FLG_SY_CLEAN;
1437
1438
1439		/*
1440		 * If we have a weak data symbol for which we need the real
1441		 * symbol also, save this processing until later.
1442		 *
1443		 * The exception to this is if the weak/strong have PLT's
1444		 * assigned to them.  In that case we don't do the post-weak
1445		 * processing because the PLT's must be maintained so that we
1446		 * can do 'interpositioning' on both of the symbols.
1447		 */
1448		if ((sap->sa_linkndx) &&
1449		    (ELF_ST_BIND(sym->st_info) == STB_WEAK) &&
1450		    (!sap->sa_PLTndx)) {
1451			Sym_desc	*_sdp;
1452
1453			_sdp = sdp->sd_file->ifl_oldndx[sap->sa_linkndx];
1454
1455			if (_sdp->sd_ref != REF_DYN_SEEN) {
1456				Wk_desc	wk;
1457
1458				if (enter_in_symtab) {
1459					if (local) {
1460						wk.wk_symtab =
1461						    &symtab[scopesym_ndx];
1462						scopesym_ndx++;
1463					} else {
1464						wk.wk_symtab =
1465						    &symtab[symtab_ndx];
1466						symtab_ndx++;
1467					}
1468				} else {
1469					wk.wk_symtab = NULL;
1470				}
1471				if (dynsym) {
1472					if (!local) {
1473						wk.wk_dynsym =
1474						    &dynsym[dynsym_ndx];
1475						dynsym_ndx++;
1476					} else if (dynlocal) {
1477						wk.wk_dynsym =
1478						    &ldynsym[ldynscopesym_ndx];
1479						ldynscopesym_ndx++;
1480					}
1481				} else {
1482					wk.wk_dynsym = NULL;
1483				}
1484				wk.wk_weak = sdp;
1485				wk.wk_alias = _sdp;
1486
1487				if (alist_append(&weak, &wk,
1488				    sizeof (Wk_desc), AL_CNT_WEAK) == NULL)
1489					return ((Addr)S_ERROR);
1490
1491				continue;
1492			}
1493		}
1494
1495		DBG_CALL(Dbg_syms_old(ofl, sdp));
1496
1497		spec = NULL;
1498		/*
1499		 * assign new symbol value.
1500		 */
1501		sectndx = sdp->sd_shndx;
1502		if (sectndx == SHN_UNDEF) {
1503			if (((sdp->sd_flags & FLG_SY_REGSYM) == 0) &&
1504			    (sym->st_value != 0)) {
1505				eprintf(ofl->ofl_lml, ERR_WARNING,
1506				    MSG_INTL(MSG_SYM_NOTNULL),
1507				    demangle(name), sdp->sd_file->ifl_name);
1508			}
1509
1510			/*
1511			 * Undefined weak global, if we are generating a static
1512			 * executable, output as an absolute zero.  Otherwise
1513			 * leave it as is, ld.so.1 will skip symbols of this
1514			 * type (this technique allows applications and
1515			 * libraries to test for the existence of a symbol as an
1516			 * indication of the presence or absence of certain
1517			 * functionality).
1518			 */
1519			if (OFL_IS_STATIC_EXEC(ofl) &&
1520			    (ELF_ST_BIND(sym->st_info) == STB_WEAK)) {
1521				sdp->sd_flags |= FLG_SY_SPECSEC;
1522				sdp->sd_shndx = sectndx = SHN_ABS;
1523			}
1524		} else if ((sdp->sd_flags & FLG_SY_SPECSEC) &&
1525		    (sectndx == SHN_COMMON)) {
1526			/* COMMONs have already been processed */
1527			/* EMPTY */
1528			;
1529		} else {
1530			if ((sdp->sd_flags & FLG_SY_SPECSEC) &&
1531			    (sectndx == SHN_ABS))
1532				spec = sdp->sd_aux->sa_symspec;
1533
1534			/* LINTED */
1535			if (sdp->sd_flags & FLG_SY_COMMEXP) {
1536				/*
1537				 * This is (or was) a COMMON symbol which was
1538				 * processed above - no processing
1539				 * required here.
1540				 */
1541				;
1542			} else if (sdp->sd_ref == REF_DYN_NEED) {
1543				uchar_t	type, bind;
1544
1545				sectndx = SHN_UNDEF;
1546				sym->st_value = 0;
1547				sym->st_size = 0;
1548
1549				/*
1550				 * Make sure this undefined symbol is returned
1551				 * to the same binding as was defined in the
1552				 * original relocatable object reference.
1553				 */
1554				type = ELF_ST_TYPE(sym-> st_info);
1555				if (sdp->sd_flags & FLG_SY_GLOBREF)
1556					bind = STB_GLOBAL;
1557				else
1558					bind = STB_WEAK;
1559
1560				sym->st_info = ELF_ST_INFO(bind, type);
1561
1562			} else if (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) &&
1563			    (sdp->sd_ref == REF_REL_NEED)) {
1564				osp = sdp->sd_isc->is_osdesc;
1565				/* LINTED */
1566				sectndx = elf_ndxscn(osp->os_scn);
1567
1568				/*
1569				 * In an executable, the new symbol value is the
1570				 * old value (offset into defining section) plus
1571				 * virtual address of defining section.  In a
1572				 * relocatable, the new value is the old value
1573				 * plus the displacement of the section within
1574				 * the file.
1575				 */
1576				/* LINTED */
1577				sym->st_value +=
1578				    (Off)_elf_getxoff(sdp->sd_isc->is_indata);
1579
1580				if (!(flags & FLG_OF_RELOBJ)) {
1581					sym->st_value += osp->os_shdr->sh_addr;
1582					/*
1583					 * TLS symbols are relative to
1584					 * the TLS segment.
1585					 */
1586					if ((ELF_ST_TYPE(sym->st_info) ==
1587					    STT_TLS) && (ofl->ofl_tlsphdr))
1588						sym->st_value -=
1589						    ofl->ofl_tlsphdr->p_vaddr;
1590				}
1591			}
1592		}
1593
1594		if (spec) {
1595			switch (spec) {
1596			case SDAUX_ID_ETEXT:
1597				sym->st_value = etext;
1598				sectndx = etext_ndx;
1599				if (etext_abs)
1600					sdp->sd_flags |= FLG_SY_SPECSEC;
1601				else
1602					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1603				break;
1604			case SDAUX_ID_EDATA:
1605				sym->st_value = edata;
1606				sectndx = edata_ndx;
1607				if (edata_abs)
1608					sdp->sd_flags |= FLG_SY_SPECSEC;
1609				else
1610					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1611				break;
1612			case SDAUX_ID_END:
1613				sym->st_value = end;
1614				sectndx = end_ndx;
1615				if (end_abs)
1616					sdp->sd_flags |= FLG_SY_SPECSEC;
1617				else
1618					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1619				break;
1620			case SDAUX_ID_START:
1621				sym->st_value = start;
1622				sectndx = start_ndx;
1623				sdp->sd_flags &= ~FLG_SY_SPECSEC;
1624				break;
1625			case SDAUX_ID_DYN:
1626				if (flags & FLG_OF_DYNAMIC) {
1627					sym->st_value = ofl->
1628					    ofl_osdynamic->os_shdr->sh_addr;
1629					/* LINTED */
1630					sectndx = elf_ndxscn(
1631					    ofl->ofl_osdynamic->os_scn);
1632					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1633				}
1634				break;
1635			case SDAUX_ID_PLT:
1636				if (ofl->ofl_osplt) {
1637					sym->st_value = ofl->
1638					    ofl_osplt->os_shdr->sh_addr;
1639					/* LINTED */
1640					sectndx = elf_ndxscn(
1641					    ofl->ofl_osplt->os_scn);
1642					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1643				}
1644				break;
1645			case SDAUX_ID_GOT:
1646				/*
1647				 * Symbol bias for negative growing tables is
1648				 * stored in symbol's value during
1649				 * allocate_got().
1650				 */
1651				sym->st_value += ofl->
1652				    ofl_osgot->os_shdr->sh_addr;
1653				/* LINTED */
1654				sectndx = elf_ndxscn(ofl->
1655				    ofl_osgot->os_scn);
1656				sdp->sd_flags &= ~FLG_SY_SPECSEC;
1657				break;
1658			default:
1659				/* NOTHING */
1660				;
1661			}
1662		}
1663
1664		/*
1665		 * If a plt index has been assigned to an undefined function,
1666		 * update the symbols value to the appropriate .plt address.
1667		 */
1668		if ((flags & FLG_OF_DYNAMIC) && (flags & FLG_OF_EXEC) &&
1669		    (sdp->sd_file) &&
1670		    (sdp->sd_file->ifl_ehdr->e_type == ET_DYN) &&
1671		    (ELF_ST_TYPE(sym->st_info) == STT_FUNC) &&
1672		    !(flags & FLG_OF_BFLAG)) {
1673			if (sap->sa_PLTndx)
1674				sym->st_value =
1675				    (*ld_targ.t_mr.mr_calc_plt_addr)(sdp, ofl);
1676		}
1677
1678		/*
1679		 * Finish updating the symbols.
1680		 */
1681
1682		/*
1683		 * Sym Update: if scoped local - set local binding
1684		 */
1685		if (local)
1686			sym->st_info = ELF_ST_INFO(STB_LOCAL,
1687			    ELF_ST_TYPE(sym->st_info));
1688
1689		/*
1690		 * Sym Updated: If both the .symtab and .dynsym
1691		 * are present then we've actually updated the information in
1692		 * the .dynsym, therefore copy this same information to the
1693		 * .symtab entry.
1694		 */
1695		sdp->sd_shndx = sectndx;
1696		if (enter_in_symtab && dynsym && (!local || dynlocal)) {
1697			Word _symndx = dynlocal ? scopesym_ndx : symtab_ndx;
1698
1699			symtab[_symndx].st_value = sym->st_value;
1700			symtab[_symndx].st_size = sym->st_size;
1701			symtab[_symndx].st_info = sym->st_info;
1702			symtab[_symndx].st_other = sym->st_other;
1703		}
1704
1705		if (enter_in_symtab) {
1706			Word	_symndx;
1707
1708			if (local)
1709				_symndx = scopesym_ndx++;
1710			else
1711				_symndx = symtab_ndx++;
1712			if (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) &&
1713			    (sectndx >= SHN_LORESERVE)) {
1714				assert(symshndx != NULL);
1715				symshndx[_symndx] = sectndx;
1716				symtab[_symndx].st_shndx = SHN_XINDEX;
1717			} else {
1718				/* LINTED */
1719				symtab[_symndx].st_shndx = (Half)sectndx;
1720			}
1721		}
1722
1723		if (dynsym && (!local || dynlocal)) {
1724			/*
1725			 * dynsym and ldynsym are distinct tables, so
1726			 * we use indirection to access the right one
1727			 * and the related extended section index array.
1728			 */
1729			Word	_symndx;
1730			Sym	*_dynsym;
1731			Word	*_dynshndx;
1732
1733			if (!local) {
1734				_symndx = dynsym_ndx++;
1735				_dynsym = dynsym;
1736				_dynshndx = dynshndx;
1737			} else {
1738				_symndx = ldynscopesym_ndx++;
1739				_dynsym = ldynsym;
1740				_dynshndx = ldynshndx;
1741			}
1742			if (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) &&
1743			    (sectndx >= SHN_LORESERVE)) {
1744				assert(_dynshndx != NULL);
1745				_dynshndx[_symndx] = sectndx;
1746				_dynsym[_symndx].st_shndx = SHN_XINDEX;
1747			} else {
1748				/* LINTED */
1749				_dynsym[_symndx].st_shndx = (Half)sectndx;
1750			}
1751		}
1752
1753		DBG_CALL(Dbg_syms_new(ofl, sym, sdp));
1754	}
1755
1756	/*
1757	 * Now that all the symbols have been processed update any weak symbols
1758	 * information (ie. copy all information except `st_name').  As both
1759	 * symbols will be represented in the output, return the weak symbol to
1760	 * its correct type.
1761	 */
1762	for (ALIST_TRAVERSE(weak, idx1, wkp)) {
1763		Sym_desc	*sdp, *_sdp;
1764		Sym		*sym, *_sym, *__sym;
1765		uchar_t		bind;
1766
1767		sdp = wkp->wk_weak;
1768		_sdp = wkp->wk_alias;
1769		_sym = __sym = _sdp->sd_sym;
1770
1771		sdp->sd_flags |= FLG_SY_WEAKDEF;
1772
1773		/*
1774		 * If the symbol definition has been scoped then assign it to
1775		 * be local, otherwise if it's from a shared object then we need
1776		 * to maintain the binding of the original reference.
1777		 */
1778		if (sdp->sd_flags & FLG_SY_HIDDEN) {
1779			if (flags & FLG_OF_PROCRED)
1780				bind = STB_LOCAL;
1781			else
1782				bind = STB_WEAK;
1783		} else if ((sdp->sd_ref == REF_DYN_NEED) &&
1784		    (sdp->sd_flags & FLG_SY_GLOBREF))
1785			bind = STB_GLOBAL;
1786		else
1787			bind = STB_WEAK;
1788
1789		DBG_CALL(Dbg_syms_old(ofl, sdp));
1790		if ((sym = wkp->wk_symtab) != NULL) {
1791			sym->st_value = _sym->st_value;
1792			sym->st_size = _sym->st_size;
1793			sym->st_other = _sym->st_other;
1794			sym->st_shndx = _sym->st_shndx;
1795			sym->st_info = ELF_ST_INFO(bind,
1796			    ELF_ST_TYPE(sym->st_info));
1797			__sym = sym;
1798		}
1799		if ((sym = wkp->wk_dynsym) != NULL) {
1800			sym->st_value = _sym->st_value;
1801			sym->st_size = _sym->st_size;
1802			sym->st_other = _sym->st_other;
1803			sym->st_shndx = _sym->st_shndx;
1804			sym->st_info = ELF_ST_INFO(bind,
1805			    ELF_ST_TYPE(sym->st_info));
1806			__sym = sym;
1807		}
1808		DBG_CALL(Dbg_syms_new(ofl, __sym, sdp));
1809	}
1810
1811	/*
1812	 * Now display GOT debugging information if required.
1813	 */
1814	DBG_CALL(Dbg_got_display(ofl, 0, 0,
1815	    ld_targ.t_m.m_got_xnumber, ld_targ.t_m.m_got_entsize));
1816
1817	/*
1818	 * Update the section headers information. sh_info is
1819	 * supposed to contain the offset at which the first
1820	 * global symbol resides in the symbol table, while
1821	 * sh_link contains the section index of the associated
1822	 * string table.
1823	 */
1824	if (symtab) {
1825		Shdr	*shdr = ofl->ofl_ossymtab->os_shdr;
1826
1827		shdr->sh_info = symtab_gbl_bndx;
1828		/* LINTED */
1829		shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_osstrtab->os_scn);
1830		if (symshndx)
1831			ofl->ofl_ossymshndx->os_shdr->sh_link =
1832			    (Word)elf_ndxscn(ofl->ofl_ossymtab->os_scn);
1833
1834		/*
1835		 * Ensure that the expected number of symbols
1836		 * were entered into the right spots:
1837		 *	- Scoped symbols in the right range
1838		 *	- Globals start at the right spot
1839		 *		(correct number of locals entered)
1840		 *	- The table is exactly filled
1841		 *		(correct number of globals entered)
1842		 */
1843		assert((scopesym_bndx + ofl->ofl_scopecnt) == scopesym_ndx);
1844		assert(shdr->sh_info == SYMTAB_LOC_CNT(ofl));
1845		assert((shdr->sh_info + ofl->ofl_globcnt) == symtab_ndx);
1846	}
1847	if (dynsym) {
1848		Shdr	*shdr = ofl->ofl_osdynsym->os_shdr;
1849
1850		shdr->sh_info = DYNSYM_LOC_CNT(ofl);
1851		/* LINTED */
1852		shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_osdynstr->os_scn);
1853
1854		ofl->ofl_oshash->os_shdr->sh_link =
1855		    /* LINTED */
1856		    (Word)elf_ndxscn(ofl->ofl_osdynsym->os_scn);
1857		if (dynshndx) {
1858			shdr = ofl->ofl_osdynshndx->os_shdr;
1859			shdr->sh_link =
1860			    (Word)elf_ndxscn(ofl->ofl_osdynsym->os_scn);
1861		}
1862	}
1863	if (ldynsym) {
1864		Shdr	*shdr = ofl->ofl_osldynsym->os_shdr;
1865
1866		/* ldynsym has no globals, so give index one past the end */
1867		shdr->sh_info = ldynsym_ndx;
1868
1869		/*
1870		 * The ldynsym and dynsym must be adjacent. The
1871		 * idea is that rtld should be able to start with
1872		 * the ldynsym and march straight through the end
1873		 * of dynsym, seeing them as a single symbol table,
1874		 * despite the fact that they are in distinct sections.
1875		 * Ensure that this happened correctly.
1876		 *
1877		 * Note that I use ldynsym_ndx here instead of the
1878		 * computation I used to set the section size
1879		 * (found in ldynsym_cnt). The two will agree, unless
1880		 * we somehow miscounted symbols or failed to insert them
1881		 * all. Using ldynsym_ndx here catches that error in
1882		 * addition to checking for adjacency.
1883		 */
1884		assert(dynsym == (ldynsym + ldynsym_ndx));
1885
1886
1887		/* LINTED */
1888		shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_osdynstr->os_scn);
1889
1890		if (ldynshndx) {
1891			shdr = ofl->ofl_osldynshndx->os_shdr;
1892			shdr->sh_link =
1893			    (Word)elf_ndxscn(ofl->ofl_osldynsym->os_scn);
1894		}
1895
1896		/*
1897		 * The presence of .SUNW_ldynsym means that there may be
1898		 * associated sort sections, one for regular symbols
1899		 * and the other for TLS. Each sort section needs the
1900		 * following done:
1901		 *	- Section header link references .SUNW_ldynsym
1902		 *	- Should have received the expected # of items
1903		 *	- Sorted by increasing address
1904		 */
1905		if (ofl->ofl_osdynsymsort) {	/* .SUNW_dynsymsort */
1906			ofl->ofl_osdynsymsort->os_shdr->sh_link =
1907			    (Word)elf_ndxscn(ofl->ofl_osldynsym->os_scn);
1908			assert(ofl->ofl_dynsymsortcnt == dynsymsort_ndx);
1909
1910			if (dynsymsort_ndx > 1) {
1911				dynsort_compare_syms = ldynsym;
1912				qsort(dynsymsort, dynsymsort_ndx,
1913				    sizeof (*dynsymsort), dynsort_compare);
1914				dynsort_dupwarn(ofl, ldynsym,
1915				    st_getstrbuf(dynstr),
1916				    dynsymsort, dynsymsort_ndx,
1917				    MSG_ORIG(MSG_SCN_DYNSYMSORT));
1918			}
1919		}
1920		if (ofl->ofl_osdyntlssort) {	/* .SUNW_dyntlssort */
1921			ofl->ofl_osdyntlssort->os_shdr->sh_link =
1922			    (Word)elf_ndxscn(ofl->ofl_osldynsym->os_scn);
1923			assert(ofl->ofl_dyntlssortcnt == dyntlssort_ndx);
1924
1925			if (dyntlssort_ndx > 1) {
1926				dynsort_compare_syms = ldynsym;
1927				qsort(dyntlssort, dyntlssort_ndx,
1928				    sizeof (*dyntlssort), dynsort_compare);
1929				dynsort_dupwarn(ofl, ldynsym,
1930				    st_getstrbuf(dynstr),
1931				    dyntlssort, dyntlssort_ndx,
1932				    MSG_ORIG(MSG_SCN_DYNTLSSORT));
1933			}
1934		}
1935	}
1936
1937	/*
1938	 * Used by ld.so.1 only.
1939	 */
1940	return (etext);
1941
1942#undef ADD_TO_DYNSORT
1943}
1944
1945/*
1946 * Build the dynamic section.
1947 *
1948 * This routine must be maintained in parallel with make_dynamic()
1949 * in sections.c
1950 */
1951static int
1952update_odynamic(Ofl_desc *ofl)
1953{
1954	Aliste		idx;
1955	Ifl_desc	*ifl;
1956	Sym_desc	*sdp;
1957	Shdr		*shdr;
1958	Dyn		*_dyn = (Dyn *)ofl->ofl_osdynamic->os_outdata->d_buf;
1959	Dyn		*dyn;
1960	Os_desc		*symosp, *strosp;
1961	Str_tbl		*strtbl;
1962	size_t		stoff;
1963	ofl_flag_t	flags = ofl->ofl_flags;
1964	int		not_relobj = !(flags & FLG_OF_RELOBJ);
1965	Word		cnt;
1966
1967	/*
1968	 * Relocatable objects can be built with -r and -dy to trigger the
1969	 * creation of a .dynamic section.  This model is used to create kernel
1970	 * device drivers.  The .dynamic section provides a subset of userland
1971	 * .dynamic entries, typically entries such as DT_NEEDED and DT_RUNPATH.
1972	 *
1973	 * Within a dynamic object, any .dynamic string references are to the
1974	 * .dynstr table.  Within a relocatable object, these strings can reside
1975	 * within the .strtab.
1976	 */
1977	if (OFL_IS_STATIC_OBJ(ofl)) {
1978		symosp = ofl->ofl_ossymtab;
1979		strosp = ofl->ofl_osstrtab;
1980		strtbl = ofl->ofl_strtab;
1981	} else {
1982		symosp = ofl->ofl_osdynsym;
1983		strosp = ofl->ofl_osdynstr;
1984		strtbl = ofl->ofl_dynstrtab;
1985	}
1986
1987	/* LINTED */
1988	ofl->ofl_osdynamic->os_shdr->sh_link = (Word)elf_ndxscn(strosp->os_scn);
1989
1990	dyn = _dyn;
1991
1992	for (APLIST_TRAVERSE(ofl->ofl_sos, idx, ifl)) {
1993		if ((ifl->ifl_flags &
1994		    (FLG_IF_IGNORE | FLG_IF_DEPREQD)) == FLG_IF_IGNORE)
1995			continue;
1996
1997		/*
1998		 * Create and set up the DT_POSFLAG_1 entry here if required.
1999		 */
2000		if ((ifl->ifl_flags & (FLG_IF_LAZYLD|FLG_IF_GRPPRM)) &&
2001		    (ifl->ifl_flags & (FLG_IF_NEEDED)) && not_relobj) {
2002			dyn->d_tag = DT_POSFLAG_1;
2003			if (ifl->ifl_flags & FLG_IF_LAZYLD)
2004				dyn->d_un.d_val = DF_P1_LAZYLOAD;
2005			if (ifl->ifl_flags & FLG_IF_GRPPRM)
2006				dyn->d_un.d_val |= DF_P1_GROUPPERM;
2007			dyn++;
2008		}
2009
2010		if (ifl->ifl_flags & (FLG_IF_NEEDED | FLG_IF_NEEDSTR))
2011			dyn->d_tag = DT_NEEDED;
2012		else
2013			continue;
2014
2015		(void) st_setstring(strtbl, ifl->ifl_soname, &stoff);
2016		dyn->d_un.d_val = stoff;
2017		/* LINTED */
2018		ifl->ifl_neededndx = (Half)(((uintptr_t)dyn - (uintptr_t)_dyn) /
2019		    sizeof (Dyn));
2020		dyn++;
2021	}
2022
2023	if (not_relobj) {
2024		if (ofl->ofl_dtsfltrs != NULL) {
2025			Dfltr_desc	*dftp;
2026
2027			for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, idx, dftp)) {
2028				if (dftp->dft_flag == FLG_SY_AUXFLTR)
2029					dyn->d_tag = DT_SUNW_AUXILIARY;
2030				else
2031					dyn->d_tag = DT_SUNW_FILTER;
2032
2033				(void) st_setstring(strtbl, dftp->dft_str,
2034				    &stoff);
2035				dyn->d_un.d_val = stoff;
2036				dftp->dft_ndx = (Half)(((uintptr_t)dyn -
2037				    (uintptr_t)_dyn) / sizeof (Dyn));
2038				dyn++;
2039			}
2040		}
2041		if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U),
2042		    SYM_NOHASH, 0, ofl)) != NULL) &&
2043		    (sdp->sd_ref == REF_REL_NEED) &&
2044		    (sdp->sd_sym->st_shndx != SHN_UNDEF)) {
2045			dyn->d_tag = DT_INIT;
2046			dyn->d_un.d_ptr = sdp->sd_sym->st_value;
2047			dyn++;
2048		}
2049		if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U),
2050		    SYM_NOHASH, 0, ofl)) != NULL) &&
2051		    (sdp->sd_ref == REF_REL_NEED) &&
2052		    (sdp->sd_sym->st_shndx != SHN_UNDEF)) {
2053			dyn->d_tag = DT_FINI;
2054			dyn->d_un.d_ptr = sdp->sd_sym->st_value;
2055			dyn++;
2056		}
2057		if (ofl->ofl_soname) {
2058			dyn->d_tag = DT_SONAME;
2059			(void) st_setstring(strtbl, ofl->ofl_soname, &stoff);
2060			dyn->d_un.d_val = stoff;
2061			dyn++;
2062		}
2063		if (ofl->ofl_filtees) {
2064			if (flags & FLG_OF_AUX) {
2065				dyn->d_tag = DT_AUXILIARY;
2066			} else {
2067				dyn->d_tag = DT_FILTER;
2068			}
2069			(void) st_setstring(strtbl, ofl->ofl_filtees, &stoff);
2070			dyn->d_un.d_val = stoff;
2071			dyn++;
2072		}
2073	}
2074
2075	if (ofl->ofl_rpath) {
2076		(void) st_setstring(strtbl, ofl->ofl_rpath, &stoff);
2077		dyn->d_tag = DT_RUNPATH;
2078		dyn->d_un.d_val = stoff;
2079		dyn++;
2080		dyn->d_tag = DT_RPATH;
2081		dyn->d_un.d_val = stoff;
2082		dyn++;
2083	}
2084
2085	if (not_relobj) {
2086		Aliste	idx;
2087
2088		if (ofl->ofl_config) {
2089			dyn->d_tag = DT_CONFIG;
2090			(void) st_setstring(strtbl, ofl->ofl_config, &stoff);
2091			dyn->d_un.d_val = stoff;
2092			dyn++;
2093		}
2094		if (ofl->ofl_depaudit) {
2095			dyn->d_tag = DT_DEPAUDIT;
2096			(void) st_setstring(strtbl, ofl->ofl_depaudit, &stoff);
2097			dyn->d_un.d_val = stoff;
2098			dyn++;
2099		}
2100		if (ofl->ofl_audit) {
2101			dyn->d_tag = DT_AUDIT;
2102			(void) st_setstring(strtbl, ofl->ofl_audit, &stoff);
2103			dyn->d_un.d_val = stoff;
2104			dyn++;
2105		}
2106
2107		dyn->d_tag = DT_HASH;
2108		dyn->d_un.d_ptr = ofl->ofl_oshash->os_shdr->sh_addr;
2109		dyn++;
2110
2111		shdr = strosp->os_shdr;
2112		dyn->d_tag = DT_STRTAB;
2113		dyn->d_un.d_ptr = shdr->sh_addr;
2114		dyn++;
2115
2116		dyn->d_tag = DT_STRSZ;
2117		dyn->d_un.d_ptr = shdr->sh_size;
2118		dyn++;
2119
2120		/*
2121		 * Note, the shdr is set and used in the ofl->ofl_osldynsym case
2122		 * that follows.
2123		 */
2124		shdr = symosp->os_shdr;
2125		dyn->d_tag = DT_SYMTAB;
2126		dyn->d_un.d_ptr = shdr->sh_addr;
2127		dyn++;
2128
2129		dyn->d_tag = DT_SYMENT;
2130		dyn->d_un.d_ptr = shdr->sh_entsize;
2131		dyn++;
2132
2133		if (ofl->ofl_osldynsym) {
2134			Shdr	*lshdr = ofl->ofl_osldynsym->os_shdr;
2135
2136			/*
2137			 * We have arranged for the .SUNW_ldynsym data to be
2138			 * immediately in front of the .dynsym data.
2139			 * This means that you could start at the top
2140			 * of .SUNW_ldynsym and see the data for both tables
2141			 * without a break. This is the view we want to
2142			 * provide for DT_SUNW_SYMTAB, which is why we
2143			 * add the lengths together.
2144			 */
2145			dyn->d_tag = DT_SUNW_SYMTAB;
2146			dyn->d_un.d_ptr = lshdr->sh_addr;
2147			dyn++;
2148
2149			dyn->d_tag = DT_SUNW_SYMSZ;
2150			dyn->d_un.d_val = lshdr->sh_size + shdr->sh_size;
2151			dyn++;
2152		}
2153
2154		if (ofl->ofl_osdynsymsort || ofl->ofl_osdyntlssort) {
2155			dyn->d_tag = DT_SUNW_SORTENT;
2156			dyn->d_un.d_val = sizeof (Word);
2157			dyn++;
2158		}
2159
2160		if (ofl->ofl_osdynsymsort) {
2161			shdr = ofl->ofl_osdynsymsort->os_shdr;
2162
2163			dyn->d_tag = DT_SUNW_SYMSORT;
2164			dyn->d_un.d_ptr = shdr->sh_addr;
2165			dyn++;
2166
2167			dyn->d_tag = DT_SUNW_SYMSORTSZ;
2168			dyn->d_un.d_val = shdr->sh_size;
2169			dyn++;
2170		}
2171
2172		if (ofl->ofl_osdyntlssort) {
2173			shdr = ofl->ofl_osdyntlssort->os_shdr;
2174
2175			dyn->d_tag = DT_SUNW_TLSSORT;
2176			dyn->d_un.d_ptr = shdr->sh_addr;
2177			dyn++;
2178
2179			dyn->d_tag = DT_SUNW_TLSSORTSZ;
2180			dyn->d_un.d_val = shdr->sh_size;
2181			dyn++;
2182		}
2183
2184		/*
2185		 * Reserve the DT_CHECKSUM entry.  Its value will be filled in
2186		 * after the complete image is built.
2187		 */
2188		dyn->d_tag = DT_CHECKSUM;
2189		ofl->ofl_checksum = &dyn->d_un.d_val;
2190		dyn++;
2191
2192		/*
2193		 * Versioning sections: DT_VERDEF and DT_VERNEED.
2194		 *
2195		 * The Solaris ld does not produce DT_VERSYM, but the GNU ld
2196		 * does, in order to support their style of versioning, which
2197		 * differs from ours:
2198		 *
2199		 *	- The top bit of the 16-bit Versym index is
2200		 *		not part of the version, but is interpreted
2201		 *		as a "hidden bit".
2202		 *
2203		 *	- External (SHN_UNDEF) symbols can have non-zero
2204		 *		Versym values, which specify versions in
2205		 *		referenced objects, via the Verneed section.
2206		 *
2207		 *	- The vna_other field of the Vernaux structures
2208		 *		found in the Verneed section are not zero as
2209		 *		with Solaris, but instead contain the version
2210		 *		index to be used by Versym indices to reference
2211		 *		the given external version.
2212		 *
2213		 * The Solaris ld, rtld, and elfdump programs all interpret the
2214		 * presence of DT_VERSYM as meaning that GNU versioning rules
2215		 * apply to the given file. If DT_VERSYM is not present,
2216		 * then Solaris versioning rules apply. If we should ever need
2217		 * to change our ld so that it does issue DT_VERSYM, then
2218		 * this rule for detecting GNU versioning will no longer work.
2219		 * In that case, we will have to invent a way to explicitly
2220		 * specify the style of versioning in use, perhaps via a
2221		 * new dynamic entry named something like DT_SUNW_VERSIONSTYLE,
2222		 * where the d_un.d_val value specifies which style is to be
2223		 * used.
2224		 */
2225		if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) ==
2226		    FLG_OF_VERDEF) {
2227			shdr = ofl->ofl_osverdef->os_shdr;
2228
2229			dyn->d_tag = DT_VERDEF;
2230			dyn->d_un.d_ptr = shdr->sh_addr;
2231			dyn++;
2232			dyn->d_tag = DT_VERDEFNUM;
2233			dyn->d_un.d_ptr = shdr->sh_info;
2234			dyn++;
2235		}
2236		if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) ==
2237		    FLG_OF_VERNEED) {
2238			shdr = ofl->ofl_osverneed->os_shdr;
2239
2240			dyn->d_tag = DT_VERNEED;
2241			dyn->d_un.d_ptr = shdr->sh_addr;
2242			dyn++;
2243			dyn->d_tag = DT_VERNEEDNUM;
2244			dyn->d_un.d_ptr = shdr->sh_info;
2245			dyn++;
2246		}
2247
2248		if ((flags & FLG_OF_COMREL) && ofl->ofl_relocrelcnt) {
2249			dyn->d_tag = ld_targ.t_m.m_rel_dt_count;
2250			dyn->d_un.d_val = ofl->ofl_relocrelcnt;
2251			dyn++;
2252		}
2253		if (flags & FLG_OF_TEXTREL) {
2254			/*
2255			 * Only the presence of this entry is used in this
2256			 * implementation, not the value stored.
2257			 */
2258			dyn->d_tag = DT_TEXTREL;
2259			dyn->d_un.d_val = 0;
2260			dyn++;
2261		}
2262
2263		if (ofl->ofl_osfiniarray) {
2264			shdr = ofl->ofl_osfiniarray->os_shdr;
2265
2266			dyn->d_tag = DT_FINI_ARRAY;
2267			dyn->d_un.d_ptr = shdr->sh_addr;
2268			dyn++;
2269
2270			dyn->d_tag = DT_FINI_ARRAYSZ;
2271			dyn->d_un.d_val = shdr->sh_size;
2272			dyn++;
2273		}
2274
2275		if (ofl->ofl_osinitarray) {
2276			shdr = ofl->ofl_osinitarray->os_shdr;
2277
2278			dyn->d_tag = DT_INIT_ARRAY;
2279			dyn->d_un.d_ptr = shdr->sh_addr;
2280			dyn++;
2281
2282			dyn->d_tag = DT_INIT_ARRAYSZ;
2283			dyn->d_un.d_val = shdr->sh_size;
2284			dyn++;
2285		}
2286
2287		if (ofl->ofl_ospreinitarray) {
2288			shdr = ofl->ofl_ospreinitarray->os_shdr;
2289
2290			dyn->d_tag = DT_PREINIT_ARRAY;
2291			dyn->d_un.d_ptr = shdr->sh_addr;
2292			dyn++;
2293
2294			dyn->d_tag = DT_PREINIT_ARRAYSZ;
2295			dyn->d_un.d_val = shdr->sh_size;
2296			dyn++;
2297		}
2298
2299		if (ofl->ofl_pltcnt) {
2300			shdr = ofl->ofl_osplt->os_relosdesc->os_shdr;
2301
2302			dyn->d_tag = DT_PLTRELSZ;
2303			dyn->d_un.d_ptr = shdr->sh_size;
2304			dyn++;
2305			dyn->d_tag = DT_PLTREL;
2306			dyn->d_un.d_ptr = ld_targ.t_m.m_rel_dt_type;
2307			dyn++;
2308			dyn->d_tag = DT_JMPREL;
2309			dyn->d_un.d_ptr = shdr->sh_addr;
2310			dyn++;
2311		}
2312		if (ofl->ofl_pltpad) {
2313			shdr = ofl->ofl_osplt->os_shdr;
2314
2315			dyn->d_tag = DT_PLTPAD;
2316			if (ofl->ofl_pltcnt) {
2317				dyn->d_un.d_ptr = shdr->sh_addr +
2318				    ld_targ.t_m.m_plt_reservsz +
2319				    ofl->ofl_pltcnt * ld_targ.t_m.m_plt_entsize;
2320			} else
2321				dyn->d_un.d_ptr = shdr->sh_addr;
2322			dyn++;
2323			dyn->d_tag = DT_PLTPADSZ;
2324			dyn->d_un.d_val = ofl->ofl_pltpad *
2325			    ld_targ.t_m.m_plt_entsize;
2326			dyn++;
2327		}
2328		if (ofl->ofl_relocsz) {
2329			shdr = ofl->ofl_osrelhead->os_shdr;
2330
2331			dyn->d_tag = ld_targ.t_m.m_rel_dt_type;
2332			dyn->d_un.d_ptr = shdr->sh_addr;
2333			dyn++;
2334			dyn->d_tag = ld_targ.t_m.m_rel_dt_size;
2335			dyn->d_un.d_ptr = ofl->ofl_relocsz;
2336			dyn++;
2337			dyn->d_tag = ld_targ.t_m.m_rel_dt_ent;
2338			if (shdr->sh_type == SHT_REL)
2339				dyn->d_un.d_ptr = sizeof (Rel);
2340			else
2341				dyn->d_un.d_ptr = sizeof (Rela);
2342			dyn++;
2343		}
2344		if (ofl->ofl_ossyminfo) {
2345			shdr = ofl->ofl_ossyminfo->os_shdr;
2346
2347			dyn->d_tag = DT_SYMINFO;
2348			dyn->d_un.d_ptr = shdr->sh_addr;
2349			dyn++;
2350			dyn->d_tag = DT_SYMINSZ;
2351			dyn->d_un.d_val = shdr->sh_size;
2352			dyn++;
2353			dyn->d_tag = DT_SYMINENT;
2354			dyn->d_un.d_val = sizeof (Syminfo);
2355			dyn++;
2356		}
2357		if (ofl->ofl_osmove) {
2358			shdr = ofl->ofl_osmove->os_shdr;
2359
2360			dyn->d_tag = DT_MOVEENT;
2361			dyn->d_un.d_val = shdr->sh_entsize;
2362			dyn++;
2363			dyn->d_tag = DT_MOVESZ;
2364			dyn->d_un.d_val = shdr->sh_size;
2365			dyn++;
2366			dyn->d_tag = DT_MOVETAB;
2367			dyn->d_un.d_val = shdr->sh_addr;
2368			dyn++;
2369		}
2370		if (ofl->ofl_regsymcnt) {
2371			int	ndx;
2372
2373			for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) {
2374				if ((sdp = ofl->ofl_regsyms[ndx]) == NULL)
2375					continue;
2376
2377				dyn->d_tag = ld_targ.t_m.m_dt_register;
2378				dyn->d_un.d_val = sdp->sd_symndx;
2379				dyn++;
2380			}
2381		}
2382
2383		for (APLIST_TRAVERSE(ofl->ofl_rtldinfo, idx, sdp)) {
2384			dyn->d_tag = DT_SUNW_RTLDINF;
2385			dyn->d_un.d_ptr = sdp->sd_sym->st_value;
2386			dyn++;
2387		}
2388
2389		if (ofl->ofl_osdynamic->os_sgdesc &&
2390		    (ofl->ofl_osdynamic->os_sgdesc->sg_phdr.p_flags & PF_W)) {
2391			if (ofl->ofl_osinterp) {
2392				dyn->d_tag = DT_DEBUG;
2393				dyn->d_un.d_ptr = 0;
2394				dyn++;
2395			}
2396
2397			dyn->d_tag = DT_FEATURE_1;
2398			if (ofl->ofl_osmove)
2399				dyn->d_un.d_val = 0;
2400			else
2401				dyn->d_un.d_val = DTF_1_PARINIT;
2402			dyn++;
2403		}
2404
2405		if (ofl->ofl_oscap) {
2406			dyn->d_tag = DT_SUNW_CAP;
2407			dyn->d_un.d_val = ofl->ofl_oscap->os_shdr->sh_addr;
2408			dyn++;
2409		}
2410
2411		if (flags & FLG_OF_SYMBOLIC) {
2412			dyn->d_tag = DT_SYMBOLIC;
2413			dyn->d_un.d_val = 0;
2414			dyn++;
2415		}
2416	}
2417
2418	dyn->d_tag = DT_FLAGS;
2419	dyn->d_un.d_val = ofl->ofl_dtflags;
2420	dyn++;
2421
2422	/*
2423	 * If -Bdirect was specified, but some NODIRECT symbols were specified
2424	 * via a mapfile, or -znodirect was used on the command line, then
2425	 * clear the DF_1_DIRECT flag.  The resultant object will use per-symbol
2426	 * direct bindings rather than be enabled for global direct bindings.
2427	 *
2428	 * If any no-direct bindings exist within this object, set the
2429	 * DF_1_NODIRECT flag.  ld(1) recognizes this flag when processing
2430	 * dependencies, and performs extra work to ensure that no direct
2431	 * bindings are established to the no-direct symbols that exist
2432	 * within these dependencies.
2433	 */
2434	if (ofl->ofl_flags1 & FLG_OF1_NGLBDIR)
2435		ofl->ofl_dtflags_1 &= ~DF_1_DIRECT;
2436	if (ofl->ofl_flags1 & FLG_OF1_NDIRECT)
2437		ofl->ofl_dtflags_1 |= DF_1_NODIRECT;
2438
2439	dyn->d_tag = DT_FLAGS_1;
2440	dyn->d_un.d_val = ofl->ofl_dtflags_1;
2441	dyn++;
2442
2443	dyn->d_tag = DT_SUNW_STRPAD;
2444	dyn->d_un.d_val = DYNSTR_EXTRA_PAD;
2445	dyn++;
2446
2447	dyn->d_tag = DT_SUNW_LDMACH;
2448	dyn->d_un.d_val = ld_sunw_ldmach();
2449	dyn++;
2450
2451	(*ld_targ.t_mr.mr_mach_update_odynamic)(ofl, &dyn);
2452
2453	for (cnt = 1 + DYNAMIC_EXTRA_ELTS; cnt--; dyn++) {
2454		dyn->d_tag = DT_NULL;
2455		dyn->d_un.d_val = 0;
2456	}
2457
2458	/*
2459	 * Ensure that we wrote the right number of entries. If not, we either
2460	 * miscounted in make_dynamic(), or we did something wrong in this
2461	 * function.
2462	 */
2463	assert((ofl->ofl_osdynamic->os_shdr->sh_size /
2464	    ofl->ofl_osdynamic->os_shdr->sh_entsize) ==
2465	    ((uintptr_t)dyn - (uintptr_t)_dyn) / sizeof (*dyn));
2466
2467	return (1);
2468}
2469
2470/*
2471 * Build the version definition section
2472 */
2473static int
2474update_overdef(Ofl_desc *ofl)
2475{
2476	Aliste		idx1;
2477	Ver_desc	*vdp, *_vdp;
2478	Verdef		*vdf, *_vdf;
2479	int		num = 0;
2480	Os_desc		*strosp;
2481	Str_tbl		*strtbl;
2482
2483	/*
2484	 * Determine which string table to use.
2485	 */
2486	if (OFL_IS_STATIC_OBJ(ofl)) {
2487		strtbl = ofl->ofl_strtab;
2488		strosp = ofl->ofl_osstrtab;
2489	} else {
2490		strtbl = ofl->ofl_dynstrtab;
2491		strosp = ofl->ofl_osdynstr;
2492	}
2493
2494	/*
2495	 * Traverse the version descriptors and update the version structures
2496	 * to point to the dynstr name in preparation for building the version
2497	 * section structure.
2498	 */
2499	for (APLIST_TRAVERSE(ofl->ofl_verdesc, idx1, vdp)) {
2500		Sym_desc	*sdp;
2501
2502		if (vdp->vd_flags & VER_FLG_BASE) {
2503			const char	*name = vdp->vd_name;
2504			size_t		stoff;
2505
2506			/*
2507			 * Create a new string table entry to represent the base
2508			 * version name (there is no corresponding symbol for
2509			 * this).
2510			 */
2511			(void) st_setstring(strtbl, name, &stoff);
2512			/* LINTED */
2513			vdp->vd_name = (const char *)stoff;
2514		} else {
2515			sdp = ld_sym_find(vdp->vd_name, vdp->vd_hash, 0, ofl);
2516			/* LINTED */
2517			vdp->vd_name = (const char *)
2518			    (uintptr_t)sdp->sd_sym->st_name;
2519		}
2520	}
2521
2522	_vdf = vdf = (Verdef *)ofl->ofl_osverdef->os_outdata->d_buf;
2523
2524	/*
2525	 * Traverse the version descriptors and update the version section to
2526	 * reflect each version and its associated dependencies.
2527	 */
2528	for (APLIST_TRAVERSE(ofl->ofl_verdesc, idx1, vdp)) {
2529		Aliste		idx2;
2530		Half		cnt = 1;
2531		Verdaux		*vdap, *_vdap;
2532
2533		_vdap = vdap = (Verdaux *)(vdf + 1);
2534
2535		vdf->vd_version = VER_DEF_CURRENT;
2536		vdf->vd_flags	= vdp->vd_flags & MSK_VER_USER;
2537		vdf->vd_ndx	= vdp->vd_ndx;
2538		vdf->vd_hash	= vdp->vd_hash;
2539
2540		/* LINTED */
2541		vdap->vda_name = (uintptr_t)vdp->vd_name;
2542		vdap++;
2543		/* LINTED */
2544		_vdap->vda_next = (Word)((uintptr_t)vdap - (uintptr_t)_vdap);
2545
2546		/*
2547		 * Traverse this versions dependency list generating the
2548		 * appropriate version dependency entries.
2549		 */
2550		for (APLIST_TRAVERSE(vdp->vd_deps, idx2, _vdp)) {
2551			/* LINTED */
2552			vdap->vda_name = (uintptr_t)_vdp->vd_name;
2553			_vdap = vdap;
2554			vdap++, cnt++;
2555			/* LINTED */
2556			_vdap->vda_next = (Word)((uintptr_t)vdap -
2557			    (uintptr_t)_vdap);
2558		}
2559		_vdap->vda_next = 0;
2560
2561		/*
2562		 * Record the versions auxiliary array offset and the associated
2563		 * dependency count.
2564		 */
2565		/* LINTED */
2566		vdf->vd_aux = (Word)((uintptr_t)(vdf + 1) - (uintptr_t)vdf);
2567		vdf->vd_cnt = cnt;
2568
2569		/*
2570		 * Record the next versions offset and update the version
2571		 * pointer.  Remember the previous version offset as the very
2572		 * last structures next pointer should be null.
2573		 */
2574		_vdf = vdf;
2575		vdf = (Verdef *)vdap, num++;
2576		/* LINTED */
2577		_vdf->vd_next = (Word)((uintptr_t)vdf - (uintptr_t)_vdf);
2578	}
2579	_vdf->vd_next = 0;
2580
2581	/*
2582	 * Record the string table association with the version definition
2583	 * section, and the symbol table associated with the version symbol
2584	 * table (the actual contents of the version symbol table are filled
2585	 * in during symbol update).
2586	 */
2587	/* LINTED */
2588	ofl->ofl_osverdef->os_shdr->sh_link = (Word)elf_ndxscn(strosp->os_scn);
2589
2590	/*
2591	 * The version definition sections `info' field is used to indicate the
2592	 * number of entries in this section.
2593	 */
2594	ofl->ofl_osverdef->os_shdr->sh_info = num;
2595
2596	return (1);
2597}
2598
2599/*
2600 * Finish the version symbol index section
2601 */
2602static void
2603update_oversym(Ofl_desc *ofl)
2604{
2605	Os_desc		*osp;
2606
2607	/*
2608	 * Record the symbol table associated with the version symbol table.
2609	 * The contents of the version symbol table are filled in during
2610	 * symbol update.
2611	 */
2612	if (OFL_IS_STATIC_OBJ(ofl))
2613		osp = ofl->ofl_ossymtab;
2614	else
2615		osp = ofl->ofl_osdynsym;
2616
2617	/* LINTED */
2618	ofl->ofl_osversym->os_shdr->sh_link = (Word)elf_ndxscn(osp->os_scn);
2619}
2620
2621/*
2622 * Build the version needed section
2623 */
2624static int
2625update_overneed(Ofl_desc *ofl)
2626{
2627	Aliste		idx1;
2628	Ifl_desc	*ifl;
2629	Verneed		*vnd, *_vnd;
2630	Os_desc		*strosp;
2631	Str_tbl		*strtbl;
2632	Word		num = 0;
2633
2634	_vnd = vnd = (Verneed *)ofl->ofl_osverneed->os_outdata->d_buf;
2635
2636	/*
2637	 * Determine which string table is appropriate.
2638	 */
2639	if (OFL_IS_STATIC_OBJ(ofl)) {
2640		strosp = ofl->ofl_osstrtab;
2641		strtbl = ofl->ofl_strtab;
2642	} else {
2643		strosp = ofl->ofl_osdynstr;
2644		strtbl = ofl->ofl_dynstrtab;
2645	}
2646
2647	/*
2648	 * Traverse the shared object list looking for dependencies that have
2649	 * versions defined within them.
2650	 */
2651	for (APLIST_TRAVERSE(ofl->ofl_sos, idx1, ifl)) {
2652		Half		_cnt;
2653		Word		cnt = 0;
2654		Vernaux		*_vnap, *vnap;
2655		size_t		stoff;
2656
2657		if (!(ifl->ifl_flags & FLG_IF_VERNEED))
2658			continue;
2659
2660		vnd->vn_version = VER_NEED_CURRENT;
2661
2662		(void) st_setstring(strtbl, ifl->ifl_soname, &stoff);
2663		vnd->vn_file = stoff;
2664
2665		_vnap = vnap = (Vernaux *)(vnd + 1);
2666
2667		/*
2668		 * Traverse the version index list recording
2669		 * each version as a needed dependency.
2670		 */
2671		for (_cnt = 0; _cnt <= ifl->ifl_vercnt; _cnt++) {
2672			Ver_index	*vip = &ifl->ifl_verndx[_cnt];
2673
2674			if (vip->vi_flags & FLG_VER_REFER) {
2675				(void) st_setstring(strtbl, vip->vi_name,
2676				    &stoff);
2677				vnap->vna_name = stoff;
2678
2679				if (vip->vi_desc) {
2680					vnap->vna_hash = vip->vi_desc->vd_hash;
2681					vnap->vna_flags =
2682					    vip->vi_desc->vd_flags;
2683				} else {
2684					vnap->vna_hash = 0;
2685					vnap->vna_flags = 0;
2686				}
2687				vnap->vna_other = vip->vi_overndx;
2688
2689				/*
2690				 * If version A inherits version B, then
2691				 * B is implicit in A. It suffices for ld.so.1
2692				 * to verify A at runtime and skip B. The
2693				 * version normalization process sets the INFO
2694				 * flag for the versions we want ld.so.1 to
2695				 * skip.
2696				 */
2697				if (vip->vi_flags & VER_FLG_INFO)
2698					vnap->vna_flags |= VER_FLG_INFO;
2699
2700				_vnap = vnap;
2701				vnap++, cnt++;
2702				_vnap->vna_next =
2703				    /* LINTED */
2704				    (Word)((uintptr_t)vnap - (uintptr_t)_vnap);
2705			}
2706		}
2707
2708		_vnap->vna_next = 0;
2709
2710		/*
2711		 * Record the versions auxiliary array offset and
2712		 * the associated dependency count.
2713		 */
2714		/* LINTED */
2715		vnd->vn_aux = (Word)((uintptr_t)(vnd + 1) - (uintptr_t)vnd);
2716		/* LINTED */
2717		vnd->vn_cnt = (Half)cnt;
2718
2719		/*
2720		 * Record the next versions offset and update the version
2721		 * pointer.  Remember the previous version offset as the very
2722		 * last structures next pointer should be null.
2723		 */
2724		_vnd = vnd;
2725		vnd = (Verneed *)vnap, num++;
2726		/* LINTED */
2727		_vnd->vn_next = (Word)((uintptr_t)vnd - (uintptr_t)_vnd);
2728	}
2729	_vnd->vn_next = 0;
2730
2731	/*
2732	 * Use sh_link to record the associated string table section, and
2733	 * sh_info to indicate the number of entries contained in the section.
2734	 */
2735	/* LINTED */
2736	ofl->ofl_osverneed->os_shdr->sh_link = (Word)elf_ndxscn(strosp->os_scn);
2737	ofl->ofl_osverneed->os_shdr->sh_info = num;
2738
2739	return (1);
2740}
2741
2742/*
2743 * Update syminfo section.
2744 */
2745static uintptr_t
2746update_osyminfo(Ofl_desc *ofl)
2747{
2748	Os_desc		*symosp, *infosp = ofl->ofl_ossyminfo;
2749	Syminfo		*sip = infosp->os_outdata->d_buf;
2750	Shdr		*shdr = infosp->os_shdr;
2751	char		*strtab;
2752	Aliste		idx;
2753	Sym_desc	*sdp;
2754	Sfltr_desc	*sftp;
2755
2756	if (ofl->ofl_flags & FLG_OF_RELOBJ) {
2757		symosp = ofl->ofl_ossymtab;
2758		strtab = ofl->ofl_osstrtab->os_outdata->d_buf;
2759	} else {
2760		symosp = ofl->ofl_osdynsym;
2761		strtab = ofl->ofl_osdynstr->os_outdata->d_buf;
2762	}
2763
2764	/* LINTED */
2765	infosp->os_shdr->sh_link = (Word)elf_ndxscn(symosp->os_scn);
2766	if (ofl->ofl_osdynamic)
2767		infosp->os_shdr->sh_info =
2768		    /* LINTED */
2769		    (Word)elf_ndxscn(ofl->ofl_osdynamic->os_scn);
2770
2771	/*
2772	 * Update any references with the index into the dynamic table.
2773	 */
2774	for (APLIST_TRAVERSE(ofl->ofl_symdtent, idx, sdp))
2775		sip[sdp->sd_symndx].si_boundto = sdp->sd_file->ifl_neededndx;
2776
2777	/*
2778	 * Update any filtee references with the index into the dynamic table.
2779	 */
2780	for (ALIST_TRAVERSE(ofl->ofl_symfltrs, idx, sftp)) {
2781		Dfltr_desc	*dftp;
2782
2783		dftp = alist_item(ofl->ofl_dtsfltrs, sftp->sft_idx);
2784		sip[sftp->sft_sdp->sd_symndx].si_boundto = dftp->dft_ndx;
2785	}
2786
2787	/*
2788	 * Display debugging information about section.
2789	 */
2790	DBG_CALL(Dbg_syminfo_title(ofl->ofl_lml));
2791	if (DBG_ENABLED) {
2792		Word	_cnt, cnt = shdr->sh_size / shdr->sh_entsize;
2793		Sym	*symtab = symosp->os_outdata->d_buf;
2794		Dyn	*dyn;
2795
2796		if (ofl->ofl_osdynamic)
2797			dyn = ofl->ofl_osdynamic->os_outdata->d_buf;
2798		else
2799			dyn = NULL;
2800
2801		for (_cnt = 1; _cnt < cnt; _cnt++) {
2802			if (sip[_cnt].si_flags || sip[_cnt].si_boundto)
2803				/* LINTED */
2804				DBG_CALL(Dbg_syminfo_entry(ofl->ofl_lml, _cnt,
2805				    &sip[_cnt], &symtab[_cnt], strtab, dyn));
2806		}
2807	}
2808	return (1);
2809}
2810
2811/*
2812 * Build the output elf header.
2813 */
2814static uintptr_t
2815update_oehdr(Ofl_desc * ofl)
2816{
2817	Ehdr	*ehdr = ofl->ofl_nehdr;
2818
2819	/*
2820	 * If an entry point symbol has already been established (refer
2821	 * sym_validate()) simply update the elf header entry point with the
2822	 * symbols value.  If no entry point is defined it will have been filled
2823	 * with the start address of the first section within the text segment
2824	 * (refer update_outfile()).
2825	 */
2826	if (ofl->ofl_entry)
2827		ehdr->e_entry =
2828		    ((Sym_desc *)(ofl->ofl_entry))->sd_sym->st_value;
2829
2830	/*
2831	 * Note. it may be necessary to update the `e_flags' field in the
2832	 * machine dependent section.
2833	 */
2834	ehdr->e_ident[EI_DATA] = ld_targ.t_m.m_data;
2835	ehdr->e_machine = ofl->ofl_dehdr->e_machine;
2836	ehdr->e_flags = ofl->ofl_dehdr->e_flags;
2837	ehdr->e_version = ofl->ofl_dehdr->e_version;
2838
2839	if (ehdr->e_machine != ld_targ.t_m.m_mach) {
2840		if (ehdr->e_machine != ld_targ.t_m.m_machplus)
2841			return (S_ERROR);
2842		if ((ehdr->e_flags & ld_targ.t_m.m_flagsplus) == 0)
2843			return (S_ERROR);
2844	}
2845
2846	if (ofl->ofl_flags & FLG_OF_SHAROBJ)
2847		ehdr->e_type = ET_DYN;
2848	else if (ofl->ofl_flags & FLG_OF_RELOBJ)
2849		ehdr->e_type = ET_REL;
2850	else
2851		ehdr->e_type = ET_EXEC;
2852
2853	return (1);
2854}
2855
2856/*
2857 * Perform move table expansion.
2858 */
2859static void
2860expand_move(Ofl_desc *ofl, Sym_desc *sdp, Move *mvp)
2861{
2862	Os_desc		*osp;
2863	uchar_t		*taddr, *taddr0;
2864	Sxword		offset;
2865	Half		cnt;
2866	uint_t		stride;
2867
2868	osp = ofl->ofl_isparexpn->is_osdesc;
2869	offset = sdp->sd_sym->st_value - osp->os_shdr->sh_addr;
2870
2871	taddr0 = taddr = osp->os_outdata->d_buf;
2872	taddr += offset;
2873	taddr = taddr + mvp->m_poffset;
2874
2875	for (cnt = 0; cnt < mvp->m_repeat; cnt++) {
2876		/* LINTED */
2877		DBG_CALL(Dbg_move_expand(ofl->ofl_lml, mvp,
2878		    (Addr)(taddr - taddr0)));
2879		stride = (uint_t)mvp->m_stride + 1;
2880
2881		/*
2882		 * Update the target address based upon the move entry size.
2883		 * This size was validated in ld_process_move().
2884		 */
2885		/* LINTED */
2886		switch (ELF_M_SIZE(mvp->m_info)) {
2887		case 1:
2888			/* LINTED */
2889			*taddr = (uchar_t)mvp->m_value;
2890			taddr += stride;
2891			break;
2892		case 2:
2893			/* LINTED */
2894			*((Half *)taddr) = (Half)mvp->m_value;
2895			taddr += 2 * stride;
2896			break;
2897		case 4:
2898			/* LINTED */
2899			*((Word *)taddr) = (Word)mvp->m_value;
2900			taddr += 4 * stride;
2901			break;
2902		case 8:
2903			/* LINTED */
2904			*((u_longlong_t *)taddr) = mvp->m_value;
2905			taddr += 8 * stride;
2906			break;
2907		}
2908	}
2909}
2910
2911/*
2912 * Update Move sections.
2913 */
2914static void
2915update_move(Ofl_desc *ofl)
2916{
2917	Word		ndx = 0;
2918	ofl_flag_t	flags = ofl->ofl_flags;
2919	Move		*omvp;
2920	Aliste		idx1;
2921	Sym_desc	*sdp;
2922
2923	/*
2924	 * Determine the index of the symbol table that will be referenced by
2925	 * the Move section.
2926	 */
2927	if (OFL_ALLOW_DYNSYM(ofl))
2928		/* LINTED */
2929		ndx = (Word) elf_ndxscn(ofl->ofl_osdynsym->os_scn);
2930	else if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ))
2931		/* LINTED */
2932		ndx = (Word) elf_ndxscn(ofl->ofl_ossymtab->os_scn);
2933
2934	/*
2935	 * Update sh_link of the Move section, and point to the new Move data.
2936	 */
2937	if (ofl->ofl_osmove) {
2938		ofl->ofl_osmove->os_shdr->sh_link = ndx;
2939		omvp = (Move *)ofl->ofl_osmove->os_outdata->d_buf;
2940	}
2941
2942	/*
2943	 * Update symbol entry index
2944	 */
2945	for (APLIST_TRAVERSE(ofl->ofl_parsyms, idx1, sdp)) {
2946		Aliste		idx2;
2947		Mv_desc		*mdp;
2948
2949		/*
2950		 * Expand move table
2951		 */
2952		if (sdp->sd_flags & FLG_SY_PAREXPN) {
2953			const char	*str;
2954
2955			if (flags & FLG_OF_STATIC)
2956				str = MSG_INTL(MSG_PSYM_EXPREASON1);
2957			else if (ofl->ofl_flags1 & FLG_OF1_NOPARTI)
2958				str = MSG_INTL(MSG_PSYM_EXPREASON2);
2959			else
2960				str = MSG_INTL(MSG_PSYM_EXPREASON3);
2961
2962			DBG_CALL(Dbg_move_parexpn(ofl->ofl_lml,
2963			    sdp->sd_name, str));
2964
2965			for (ALIST_TRAVERSE(sdp->sd_move, idx2, mdp)) {
2966				DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 0,
2967				    mdp->md_move, sdp));
2968				expand_move(ofl, sdp, mdp->md_move);
2969			}
2970			continue;
2971		}
2972
2973		/*
2974		 * Process move table
2975		 */
2976		DBG_CALL(Dbg_move_outmove(ofl->ofl_lml, sdp->sd_name));
2977
2978		for (ALIST_TRAVERSE(sdp->sd_move, idx2, mdp)) {
2979			Move	*imvp;
2980			int	idx = 1;
2981			Sym	*sym;
2982
2983			imvp = mdp->md_move;
2984			sym = sdp->sd_sym;
2985
2986			DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 1, imvp, sdp));
2987
2988			*omvp = *imvp;
2989			if ((flags & FLG_OF_RELOBJ) == 0) {
2990				if (ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
2991					Os_desc	*osp = sdp->sd_isc->is_osdesc;
2992					Word	ndx = osp->os_identndx;
2993
2994					omvp->m_info =
2995					    /* LINTED */
2996					    ELF_M_INFO(ndx, imvp->m_info);
2997
2998					if (ELF_ST_TYPE(sym->st_info) !=
2999					    STT_SECTION) {
3000						omvp->m_poffset =
3001						    sym->st_value -
3002						    osp->os_shdr->sh_addr +
3003						    imvp->m_poffset;
3004					}
3005				} else {
3006					omvp->m_info =
3007					    /* LINTED */
3008					    ELF_M_INFO(sdp->sd_symndx,
3009					    imvp->m_info);
3010				}
3011			} else {
3012				Boolean 	isredloc = FALSE;
3013
3014				if ((ELF_ST_BIND(sym->st_info) == STB_LOCAL) &&
3015				    (ofl->ofl_flags & FLG_OF_REDLSYM))
3016					isredloc = TRUE;
3017
3018				if (isredloc && !(sdp->sd_move)) {
3019					Os_desc	*osp = sdp->sd_isc->is_osdesc;
3020					Word	ndx = osp->os_identndx;
3021
3022					omvp->m_info =
3023					    /* LINTED */
3024					    ELF_M_INFO(ndx, imvp->m_info);
3025
3026					omvp->m_poffset += sym->st_value;
3027				} else {
3028					if (isredloc)
3029						DBG_CALL(Dbg_syms_reduce(ofl,
3030						    DBG_SYM_REDUCE_RETAIN,
3031						    sdp, idx,
3032						    ofl->ofl_osmove->os_name));
3033
3034					omvp->m_info =
3035					    /* LINTED */
3036					    ELF_M_INFO(sdp->sd_symndx,
3037					    imvp->m_info);
3038				}
3039			}
3040
3041			DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 0, omvp, sdp));
3042			omvp++;
3043			idx++;
3044		}
3045	}
3046}
3047
3048/*
3049 * Scan through the SHT_GROUP output sections.  Update their sh_link/sh_info
3050 * fields as well as the section contents.
3051 */
3052static uintptr_t
3053update_ogroup(Ofl_desc *ofl)
3054{
3055	Aliste		idx;
3056	Os_desc		*osp;
3057	uintptr_t	error = 0;
3058
3059	for (APLIST_TRAVERSE(ofl->ofl_osgroups, idx, osp)) {
3060		Is_desc		*isp;
3061		Ifl_desc	*ifl;
3062		Shdr		*shdr = osp->os_shdr;
3063		Sym_desc	*sdp;
3064		Xword		i, grpcnt;
3065		Word		*gdata;
3066
3067		/*
3068		 * Since input GROUP sections always create unique
3069		 * output GROUP sections - we know there is only one
3070		 * item on the list.
3071		 */
3072		isp = ld_os_first_isdesc(osp);
3073
3074		ifl = isp->is_file;
3075		sdp = ifl->ifl_oldndx[isp->is_shdr->sh_info];
3076		shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_ossymtab->os_scn);
3077		shdr->sh_info = sdp->sd_symndx;
3078
3079		/*
3080		 * Scan through the group data section and update
3081		 * all of the links to new values.
3082		 */
3083		grpcnt = shdr->sh_size / shdr->sh_entsize;
3084		gdata = (Word *)osp->os_outdata->d_buf;
3085
3086		for (i = 1; i < grpcnt; i++) {
3087			Os_desc	*_osp;
3088			Is_desc	*_isp = ifl->ifl_isdesc[gdata[i]];
3089
3090			/*
3091			 * If the referenced section didn't make it to the
3092			 * output file - just zero out the entry.
3093			 */
3094			if ((_osp = _isp->is_osdesc) == NULL)
3095				gdata[i] = 0;
3096			else
3097				gdata[i] = (Word)elf_ndxscn(_osp->os_scn);
3098		}
3099	}
3100	return (error);
3101}
3102
3103static void
3104update_ostrtab(Os_desc *osp, Str_tbl *stp, uint_t extra)
3105{
3106	Elf_Data	*data;
3107
3108	if (osp == NULL)
3109		return;
3110
3111	data = osp->os_outdata;
3112	assert(data->d_size == (st_getstrtab_sz(stp) + extra));
3113	(void) st_setstrbuf(stp, data->d_buf, data->d_size - extra);
3114	/* If leaving an extra hole at the end, zero it */
3115	if (extra > 0)
3116		(void) memset((char *)data->d_buf + data->d_size - extra,
3117		    0x0, extra);
3118}
3119
3120/*
3121 * Translate the shdr->sh_{link, info} from its input section value to that
3122 * of the corresponding shdr->sh_{link, info} output section value.
3123 */
3124static Word
3125translate_link(Ofl_desc *ofl, Os_desc *osp, Word link, const char *msg)
3126{
3127	Is_desc		*isp;
3128	Ifl_desc	*ifl;
3129
3130	/*
3131	 * Don't translate the special section numbers.
3132	 */
3133	if (link >= SHN_LORESERVE)
3134		return (link);
3135
3136	/*
3137	 * Does this output section translate back to an input file.  If not
3138	 * then there is no translation to do.  In this case we will assume that
3139	 * if sh_link has a value, it's the right value.
3140	 */
3141	isp = ld_os_first_isdesc(osp);
3142	if ((ifl = isp->is_file) == NULL)
3143		return (link);
3144
3145	/*
3146	 * Sanity check to make sure that the sh_{link, info} value
3147	 * is within range for the input file.
3148	 */
3149	if (link >= ifl->ifl_shnum) {
3150		eprintf(ofl->ofl_lml, ERR_WARNING, msg, ifl->ifl_name,
3151		    EC_WORD(isp->is_scnndx), isp->is_name, EC_XWORD(link));
3152		return (link);
3153	}
3154
3155	/*
3156	 * Follow the link to the input section.
3157	 */
3158	if ((isp = ifl->ifl_isdesc[link]) == NULL)
3159		return (0);
3160	if ((osp = isp->is_osdesc) == NULL)
3161		return (0);
3162
3163	/* LINTED */
3164	return ((Word)elf_ndxscn(osp->os_scn));
3165}
3166
3167/*
3168 * Having created all of the necessary sections, segments, and associated
3169 * headers, fill in the program headers and update any other data in the
3170 * output image.  Some general rules:
3171 *
3172 *  -	If an interpreter is required always generate a PT_PHDR entry as
3173 *	well.  It is this entry that triggers the kernel into passing the
3174 *	interpreter an aux vector instead of just a file descriptor.
3175 *
3176 *  -	When generating an image that will be interpreted (ie. a dynamic
3177 *	executable, a shared object, or a static executable that has been
3178 *	provided with an interpreter - weird, but possible), make the initial
3179 *	loadable segment include both the ehdr and phdr[].  Both of these
3180 *	tables are used by the interpreter therefore it seems more intuitive
3181 *	to explicitly defined them as part of the mapped image rather than
3182 *	relying on page rounding by the interpreter to allow their access.
3183 *
3184 *  -	When generating a static image that does not require an interpreter
3185 *	have the first loadable segment indicate the address of the first
3186 *	.section as the start address (things like /kernel/unix and ufsboot
3187 *	expect this behavior).
3188 */
3189uintptr_t
3190ld_update_outfile(Ofl_desc *ofl)
3191{
3192	Addr		size, etext, vaddr;
3193	Sg_desc		*sgp;
3194	Sg_desc		*dtracesgp = NULL, *capsgp = NULL, *intpsgp = NULL;
3195	Os_desc		*osp;
3196	int		phdrndx = 0, segndx = -1, secndx, intppndx, intpsndx;
3197	int		dtracepndx, dtracesndx, cappndx, capsndx;
3198	Ehdr		*ehdr = ofl->ofl_nehdr;
3199	Shdr		*hshdr;
3200	Phdr		*_phdr = NULL;
3201	Word		phdrsz = (ehdr->e_phnum * ehdr->e_phentsize), shscnndx;
3202	ofl_flag_t	flags = ofl->ofl_flags;
3203	Word		ehdrsz = ehdr->e_ehsize;
3204	Boolean		nobits;
3205	Off		offset;
3206	Aliste		idx1;
3207
3208	/*
3209	 * Initialize the starting address for the first segment.  Executables
3210	 * have different starting addresses depending upon the target ABI,
3211	 * where as shared objects have a starting address of 0.  If this is
3212	 * a 64-bit executable that is being constructed to run in a restricted
3213	 * address space, use an alternative origin that will provide more free
3214	 * address space for the the eventual process.
3215	 */
3216	if (ofl->ofl_flags & FLG_OF_EXEC) {
3217#if	defined(_ELF64)
3218		if (ofl->ofl_sfcap_1 & SF1_SUNW_ADDR32)
3219			vaddr = ld_targ.t_m.m_segm_aorigin;
3220		else
3221#endif
3222			vaddr = ld_targ.t_m.m_segm_origin;
3223	} else
3224		vaddr = 0;
3225
3226	/*
3227	 * Loop through the segment descriptors and pick out what we need.
3228	 */
3229	DBG_CALL(Dbg_seg_title(ofl->ofl_lml));
3230	for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
3231		Phdr	*phdr = &(sgp->sg_phdr);
3232		Xword 	p_align;
3233		Aliste	idx2;
3234
3235		segndx++;
3236
3237		/*
3238		 * If an interpreter is required generate a PT_INTERP and
3239		 * PT_PHDR program header entry.  The PT_PHDR entry describes
3240		 * the program header table itself.  This information will be
3241		 * passed via the aux vector to the interpreter (ld.so.1).
3242		 * The program header array is actually part of the first
3243		 * loadable segment (and the PT_PHDR entry is the first entry),
3244		 * therefore its virtual address isn't known until the first
3245		 * loadable segment is processed.
3246		 */
3247		if (phdr->p_type == PT_PHDR) {
3248			if (ofl->ofl_osinterp) {
3249				phdr->p_offset = ehdr->e_phoff;
3250				phdr->p_filesz = phdr->p_memsz = phdrsz;
3251
3252				DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
3253				ofl->ofl_phdr[phdrndx++] = *phdr;
3254			}
3255			continue;
3256		}
3257		if (phdr->p_type == PT_INTERP) {
3258			if (ofl->ofl_osinterp) {
3259				intpsgp = sgp;
3260				intpsndx = segndx;
3261				intppndx = phdrndx++;
3262			}
3263			continue;
3264		}
3265
3266		/*
3267		 * If we are creating a PT_SUNWDTRACE segment, remember where
3268		 * the program header is.  The header values are assigned after
3269		 * update_osym() has completed and the symbol table addresses
3270		 * have been updated.
3271		 */
3272		if (phdr->p_type == PT_SUNWDTRACE) {
3273			if (ofl->ofl_dtracesym &&
3274			    ((flags & FLG_OF_RELOBJ) == 0)) {
3275				dtracesgp = sgp;
3276				dtracesndx = segndx;
3277				dtracepndx = phdrndx++;
3278			}
3279			continue;
3280		}
3281
3282		/*
3283		 * If a hardware/software capabilities section is required,
3284		 * generate the PT_SUNWCAP header.  Note, as this comes before
3285		 * the first loadable segment, we don't yet know its real
3286		 * virtual address.  This is updated later.
3287		 */
3288		if (phdr->p_type == PT_SUNWCAP) {
3289			if (ofl->ofl_oscap) {
3290				capsgp = sgp;
3291				capsndx = segndx;
3292				cappndx = phdrndx++;
3293			}
3294			continue;
3295		}
3296
3297		/*
3298		 * As the dynamic program header occurs after the loadable
3299		 * headers in the segment descriptor table, all the address
3300		 * information for the .dynamic output section will have been
3301		 * figured out by now.
3302		 */
3303		if (phdr->p_type == PT_DYNAMIC) {
3304			if (OFL_ALLOW_DYNSYM(ofl)) {
3305				Shdr	*shdr = ofl->ofl_osdynamic->os_shdr;
3306
3307				phdr->p_vaddr = shdr->sh_addr;
3308				phdr->p_offset = shdr->sh_offset;
3309				phdr->p_filesz = shdr->sh_size;
3310				phdr->p_flags = ld_targ.t_m.m_dataseg_perm;
3311
3312				DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
3313				ofl->ofl_phdr[phdrndx++] = *phdr;
3314			}
3315			continue;
3316		}
3317
3318		/*
3319		 * As the unwind (.eh_frame_hdr) program header occurs after
3320		 * the loadable headers in the segment descriptor table, all
3321		 * the address information for the .eh_frame output section
3322		 * will have been figured out by now.
3323		 */
3324		if (phdr->p_type == PT_SUNW_UNWIND) {
3325			Shdr	    *shdr;
3326
3327			if (ofl->ofl_unwindhdr == NULL)
3328				continue;
3329
3330			shdr = ofl->ofl_unwindhdr->os_shdr;
3331
3332			phdr->p_flags = PF_R;
3333			phdr->p_vaddr = shdr->sh_addr;
3334			phdr->p_memsz = shdr->sh_size;
3335			phdr->p_filesz = shdr->sh_size;
3336			phdr->p_offset = shdr->sh_offset;
3337			phdr->p_align = shdr->sh_addralign;
3338			phdr->p_paddr = 0;
3339			ofl->ofl_phdr[phdrndx++] = *phdr;
3340			continue;
3341		}
3342
3343		/*
3344		 * As the TLS program header occurs after the loadable
3345		 * headers in the segment descriptor table, all the address
3346		 * information for the .tls output section will have been
3347		 * figured out by now.
3348		 */
3349		if (phdr->p_type == PT_TLS) {
3350			Os_desc		*tlsosp;
3351			Shdr		*firstshdr = NULL, *lastfileshdr = NULL;
3352			Shdr		*lastshdr;
3353			Aliste		idx;
3354
3355			if (ofl->ofl_ostlsseg == NULL)
3356				continue;
3357
3358			/*
3359			 * Scan through the sections that have contributed TLS.
3360			 * Remember the first and last so as to determine the
3361			 * TLS memory size requirement.  Remember the last
3362			 * non-nobits section to determine the TLS data
3363			 * contribution, which determines the TLS file size.
3364			 */
3365			for (APLIST_TRAVERSE(ofl->ofl_ostlsseg, idx, tlsosp)) {
3366				Shdr	*tlsshdr = tlsosp->os_shdr;
3367
3368				if (firstshdr == NULL)
3369					firstshdr = tlsshdr;
3370				if (tlsshdr->sh_type != SHT_NOBITS)
3371					lastfileshdr = tlsshdr;
3372				lastshdr = tlsshdr;
3373			}
3374
3375			phdr->p_flags = PF_R | PF_W;
3376			phdr->p_vaddr = firstshdr->sh_addr;
3377			phdr->p_offset = firstshdr->sh_offset;
3378			phdr->p_align = firstshdr->sh_addralign;
3379
3380			if (lastfileshdr)
3381				phdr->p_filesz = lastfileshdr->sh_offset +
3382				    lastfileshdr->sh_size - phdr->p_offset;
3383			else
3384				phdr->p_filesz = 0;
3385
3386			phdr->p_memsz = lastshdr->sh_offset +
3387			    lastshdr->sh_size - phdr->p_offset;
3388
3389			DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
3390			ofl->ofl_phdr[phdrndx] = *phdr;
3391			ofl->ofl_tlsphdr = &ofl->ofl_phdr[phdrndx++];
3392			continue;
3393		}
3394
3395		/*
3396		 * If this is an empty segment declaration, it will occur after
3397		 * all other loadable segments.  As empty segments can be
3398		 * defind with fixed addresses, make sure that no loadable
3399		 * segments overlap.  This might occur as the object evolves
3400		 * and the loadable segments grow, thus encroaching upon an
3401		 * existing segment reservation.
3402		 *
3403		 * Segments are only created for dynamic objects, thus this
3404		 * checking can be skipped when building a relocatable object.
3405		 */
3406		if (!(flags & FLG_OF_RELOBJ) &&
3407		    (sgp->sg_flags & FLG_SG_EMPTY)) {
3408			int	i;
3409			Addr	v_e;
3410
3411			vaddr = phdr->p_vaddr;
3412			phdr->p_memsz = sgp->sg_length;
3413			DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
3414			ofl->ofl_phdr[phdrndx++] = *phdr;
3415
3416			if (phdr->p_type != PT_LOAD)
3417				continue;
3418
3419			v_e = vaddr + phdr->p_memsz;
3420
3421			/*
3422			 * Check overlaps
3423			 */
3424			for (i = 0; i < phdrndx - 1; i++) {
3425				Addr 	p_s = (ofl->ofl_phdr[i]).p_vaddr;
3426				Addr 	p_e;
3427
3428				if ((ofl->ofl_phdr[i]).p_type != PT_LOAD)
3429					continue;
3430
3431				p_e = p_s + (ofl->ofl_phdr[i]).p_memsz;
3432				if (((p_s <= vaddr) && (p_e > vaddr)) ||
3433				    ((vaddr <= p_s) && (v_e > p_s)))
3434					eprintf(ofl->ofl_lml, ERR_WARNING,
3435					    MSG_INTL(MSG_UPD_SEGOVERLAP),
3436					    ofl->ofl_name, EC_ADDR(p_e),
3437					    sgp->sg_name, EC_ADDR(vaddr));
3438			}
3439			continue;
3440		}
3441
3442		/*
3443		 * Having processed any of the special program headers any
3444		 * remaining headers will be built to express individual
3445		 * segments.  Segments are only built if they have output
3446		 * section descriptors associated with them (ie. some form of
3447		 * input section has been matched to this segment).
3448		 */
3449		if (sgp->sg_osdescs == NULL)
3450			continue;
3451
3452		/*
3453		 * Determine the segments offset and size from the section
3454		 * information provided from elf_update().
3455		 * Allow for multiple NOBITS sections.
3456		 */
3457		osp = sgp->sg_osdescs->apl_data[0];
3458		hshdr = osp->os_shdr;
3459
3460		phdr->p_filesz = 0;
3461		phdr->p_memsz = 0;
3462		phdr->p_offset = offset = hshdr->sh_offset;
3463
3464		nobits = ((hshdr->sh_type == SHT_NOBITS) &&
3465		    ((sgp->sg_flags & FLG_SG_PHREQ) == 0));
3466
3467		for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
3468			Shdr	*shdr = osp->os_shdr;
3469
3470			p_align = 0;
3471			if (shdr->sh_addralign > p_align)
3472				p_align = shdr->sh_addralign;
3473
3474			offset = (Off)S_ROUND(offset, shdr->sh_addralign);
3475			offset += shdr->sh_size;
3476
3477			if (shdr->sh_type != SHT_NOBITS) {
3478				if (nobits) {
3479					eprintf(ofl->ofl_lml, ERR_FATAL,
3480					    MSG_INTL(MSG_UPD_NOBITS));
3481					return (S_ERROR);
3482				}
3483				phdr->p_filesz = offset - phdr->p_offset;
3484			} else if ((sgp->sg_flags & FLG_SG_PHREQ) == 0)
3485				nobits = TRUE;
3486		}
3487		phdr->p_memsz = offset - hshdr->sh_offset;
3488
3489		/*
3490		 * If this is the first loadable segment of a dynamic object,
3491		 * or an interpreter has been specified (a static object built
3492		 * with an interpreter will still be given a PT_HDR entry), then
3493		 * compensate for the elf header and program header array.  Both
3494		 * of these are actually part of the loadable segment as they
3495		 * may be inspected by the interpreter.  Adjust the segments
3496		 * size and offset accordingly.
3497		 */
3498		if ((_phdr == NULL) && (phdr->p_type == PT_LOAD) &&
3499		    ((ofl->ofl_osinterp) || (flags & FLG_OF_DYNAMIC)) &&
3500		    (!(ofl->ofl_dtflags_1 & DF_1_NOHDR))) {
3501			size = (Addr)S_ROUND((phdrsz + ehdrsz),
3502			    hshdr->sh_addralign);
3503			phdr->p_offset -= size;
3504			phdr->p_filesz += size;
3505			phdr->p_memsz += size;
3506		}
3507
3508		/*
3509		 * If a segment size symbol is required (specified via a
3510		 * mapfile) update its value.
3511		 */
3512		if (sgp->sg_sizesym != NULL)
3513			sgp->sg_sizesym->sd_sym->st_value = phdr->p_memsz;
3514
3515		/*
3516		 * If no file content has been assigned to this segment (it
3517		 * only contains no-bits sections), then reset the offset for
3518		 * consistency.
3519		 */
3520		if (phdr->p_filesz == 0)
3521			phdr->p_offset = 0;
3522
3523		/*
3524		 * If a virtual address has been specified for this segment
3525		 * (presumably from a mapfile) use it and make sure the
3526		 * previous segment does not run into this segment.
3527		 */
3528		if (phdr->p_type == PT_LOAD) {
3529			if ((sgp->sg_flags & FLG_SG_VADDR)) {
3530				if (_phdr && (vaddr > phdr->p_vaddr) &&
3531				    (phdr->p_type == PT_LOAD))
3532					eprintf(ofl->ofl_lml, ERR_WARNING,
3533					    MSG_INTL(MSG_UPD_SEGOVERLAP),
3534					    ofl->ofl_name, EC_ADDR(vaddr),
3535					    sgp->sg_name,
3536					    EC_ADDR(phdr->p_vaddr));
3537				vaddr = phdr->p_vaddr;
3538				phdr->p_align = 0;
3539			} else {
3540				vaddr = phdr->p_vaddr =
3541				    (Addr)S_ROUND(vaddr, phdr->p_align);
3542			}
3543		}
3544
3545		/*
3546		 * Adjust the address offset and p_align if needed.
3547		 */
3548		if (((sgp->sg_flags & FLG_SG_VADDR) == 0) &&
3549		    ((ofl->ofl_dtflags_1 & DF_1_NOHDR) == 0)) {
3550			if (phdr->p_align != 0)
3551				vaddr += phdr->p_offset % phdr->p_align;
3552			else
3553				vaddr += phdr->p_offset;
3554			phdr->p_vaddr = vaddr;
3555		}
3556
3557		/*
3558		 * If an interpreter is required set the virtual address of the
3559		 * PT_PHDR program header now that we know the virtual address
3560		 * of the loadable segment that contains it.  Update the
3561		 * PT_SUNWCAP header similarly.
3562		 */
3563		if ((_phdr == NULL) && (phdr->p_type == PT_LOAD)) {
3564			_phdr = phdr;
3565
3566			if ((ofl->ofl_dtflags_1 & DF_1_NOHDR) == 0) {
3567				if (ofl->ofl_osinterp)
3568					ofl->ofl_phdr[0].p_vaddr =
3569					    vaddr + ehdrsz;
3570
3571				/*
3572				 * Finally, if we're creating a dynamic object
3573				 * (or a static object in which an interpreter
3574				 * is specified) update the vaddr to reflect
3575				 * the address of the first section within this
3576				 * segment.
3577				 */
3578				if ((ofl->ofl_osinterp) ||
3579				    (flags & FLG_OF_DYNAMIC))
3580					vaddr += size;
3581			} else {
3582				/*
3583				 * If the DF_1_NOHDR flag was set, and an
3584				 * interpreter is being generated, the PT_PHDR
3585				 * will not be part of any loadable segment.
3586				 */
3587				if (ofl->ofl_osinterp) {
3588					ofl->ofl_phdr[0].p_vaddr = 0;
3589					ofl->ofl_phdr[0].p_memsz = 0;
3590					ofl->ofl_phdr[0].p_flags = 0;
3591				}
3592			}
3593		}
3594
3595		/*
3596		 * Ensure the ELF entry point defaults to zero.  Typically, this
3597		 * value is overridden in update_oehdr() to one of the standard
3598		 * entry points.  Historically, this default was set to the
3599		 * address of first executable section, but this has since been
3600		 * found to be more confusing than it is helpful.
3601		 */
3602		ehdr->e_entry = 0;
3603
3604		DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
3605
3606		/*
3607		 * Traverse the output section descriptors for this segment so
3608		 * that we can update the section headers addresses.  We've
3609		 * calculated the virtual address of the initial section within
3610		 * this segment, so each successive section can be calculated
3611		 * based on their offsets from each other.
3612		 */
3613		secndx = 0;
3614		hshdr = 0;
3615		for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
3616			Shdr	*shdr = osp->os_shdr;
3617
3618			if (shdr->sh_link)
3619				shdr->sh_link = translate_link(ofl, osp,
3620				    shdr->sh_link, MSG_INTL(MSG_FIL_INVSHLINK));
3621
3622			if (shdr->sh_info && (shdr->sh_flags & SHF_INFO_LINK))
3623				shdr->sh_info = translate_link(ofl, osp,
3624				    shdr->sh_info, MSG_INTL(MSG_FIL_INVSHINFO));
3625
3626			if (!(flags & FLG_OF_RELOBJ) &&
3627			    (phdr->p_type == PT_LOAD)) {
3628				if (hshdr)
3629					vaddr += (shdr->sh_offset -
3630					    hshdr->sh_offset);
3631
3632				shdr->sh_addr = vaddr;
3633				hshdr = shdr;
3634			}
3635
3636			DBG_CALL(Dbg_seg_os(ofl, osp, secndx));
3637			secndx++;
3638		}
3639
3640		/*
3641		 * Establish the virtual address of the end of the last section
3642		 * in this segment so that the next segments offset can be
3643		 * calculated from this.
3644		 */
3645		if (hshdr)
3646			vaddr += hshdr->sh_size;
3647
3648		/*
3649		 * Output sections for this segment complete.  Adjust the
3650		 * virtual offset for the last sections size, and make sure we
3651		 * haven't exceeded any maximum segment length specification.
3652		 */
3653		if ((sgp->sg_length != 0) && (sgp->sg_length < phdr->p_memsz)) {
3654			eprintf(ofl->ofl_lml, ERR_FATAL,
3655			    MSG_INTL(MSG_UPD_LARGSIZE), ofl->ofl_name,
3656			    sgp->sg_name, EC_XWORD(phdr->p_memsz),
3657			    EC_XWORD(sgp->sg_length));
3658			return (S_ERROR);
3659		}
3660
3661		if (phdr->p_type == PT_NOTE) {
3662			phdr->p_vaddr = 0;
3663			phdr->p_paddr = 0;
3664			phdr->p_align = 0;
3665			phdr->p_memsz = 0;
3666		}
3667
3668		if ((phdr->p_type != PT_NULL) && !(flags & FLG_OF_RELOBJ))
3669			ofl->ofl_phdr[phdrndx++] = *phdr;
3670	}
3671
3672	/*
3673	 * Update any new output sections.  When building the initial output
3674	 * image, a number of sections were created but left uninitialized (eg.
3675	 * .dynsym, .dynstr, .symtab, .symtab, etc.).  Here we update these
3676	 * sections with the appropriate data.  Other sections may still be
3677	 * modified via reloc_process().
3678	 *
3679	 * Copy the interpreter name into the .interp section.
3680	 */
3681	if (ofl->ofl_interp)
3682		(void) strcpy((char *)ofl->ofl_osinterp->os_outdata->d_buf,
3683		    ofl->ofl_interp);
3684
3685	/*
3686	 * Update the .shstrtab, .strtab and .dynstr sections.
3687	 */
3688	update_ostrtab(ofl->ofl_osshstrtab, ofl->ofl_shdrsttab, 0);
3689	update_ostrtab(ofl->ofl_osstrtab, ofl->ofl_strtab, 0);
3690	update_ostrtab(ofl->ofl_osdynstr, ofl->ofl_dynstrtab, DYNSTR_EXTRA_PAD);
3691
3692	/*
3693	 * Build any output symbol tables, the symbols information is copied
3694	 * and updated into the new output image.
3695	 */
3696	if ((etext = update_osym(ofl)) == (Addr)S_ERROR)
3697		return (S_ERROR);
3698
3699	/*
3700	 * If we have an PT_INTERP phdr, update it now from the associated
3701	 * section information.
3702	 */
3703	if (intpsgp) {
3704		Phdr	*phdr = &(intpsgp->sg_phdr);
3705		Shdr	*shdr = ofl->ofl_osinterp->os_shdr;
3706
3707		phdr->p_vaddr = shdr->sh_addr;
3708		phdr->p_offset = shdr->sh_offset;
3709		phdr->p_memsz = phdr->p_filesz = shdr->sh_size;
3710		phdr->p_flags = PF_R;
3711
3712		DBG_CALL(Dbg_seg_entry(ofl, intpsndx, intpsgp));
3713		ofl->ofl_phdr[intppndx] = *phdr;
3714	}
3715
3716	/*
3717	 * If we have a PT_SUNWDTRACE phdr, update it now with the address of
3718	 * the symbol.  It's only now been updated via update_sym().
3719	 */
3720	if (dtracesgp) {
3721		Phdr		*aphdr, *phdr = &(dtracesgp->sg_phdr);
3722		Sym_desc	*sdp = ofl->ofl_dtracesym;
3723
3724		phdr->p_vaddr = sdp->sd_sym->st_value;
3725		phdr->p_memsz = sdp->sd_sym->st_size;
3726
3727		/*
3728		 * Take permisions of the segment the symbol is associated with.
3729		 */
3730		aphdr = &sdp->sd_isc->is_osdesc->os_sgdesc->sg_phdr;
3731		assert(aphdr);
3732		phdr->p_flags = aphdr->p_flags;
3733
3734		DBG_CALL(Dbg_seg_entry(ofl, dtracesndx, dtracesgp));
3735		ofl->ofl_phdr[dtracepndx] = *phdr;
3736	}
3737
3738	/*
3739	 * If we have a PT_SUNWCAP phdr, update it now from the associated
3740	 * section information.
3741	 */
3742	if (capsgp) {
3743		Phdr	*phdr = &(capsgp->sg_phdr);
3744		Shdr	*shdr = ofl->ofl_oscap->os_shdr;
3745
3746		phdr->p_vaddr = shdr->sh_addr;
3747		phdr->p_offset = shdr->sh_offset;
3748		phdr->p_memsz = phdr->p_filesz = shdr->sh_size;
3749		phdr->p_flags = PF_R;
3750
3751		DBG_CALL(Dbg_seg_entry(ofl, capsndx, capsgp));
3752		ofl->ofl_phdr[cappndx] = *phdr;
3753	}
3754
3755	/*
3756	 * Update the GROUP sections.
3757	 */
3758	if (update_ogroup(ofl) == S_ERROR)
3759		return (S_ERROR);
3760
3761	/*
3762	 * Update Move Table.
3763	 */
3764	if (ofl->ofl_osmove || ofl->ofl_isparexpn)
3765		update_move(ofl);
3766
3767	/*
3768	 * Build any output headers, version information, dynamic structure and
3769	 * syminfo structure.
3770	 */
3771	if (update_oehdr(ofl) == S_ERROR)
3772		return (S_ERROR);
3773	if (!(flags & FLG_OF_NOVERSEC)) {
3774		if ((flags & FLG_OF_VERDEF) &&
3775		    (update_overdef(ofl) == S_ERROR))
3776			return (S_ERROR);
3777		if ((flags & FLG_OF_VERNEED) &&
3778		    (update_overneed(ofl) == S_ERROR))
3779			return (S_ERROR);
3780		if (flags & (FLG_OF_VERNEED | FLG_OF_VERDEF))
3781			update_oversym(ofl);
3782	}
3783	if (flags & FLG_OF_DYNAMIC) {
3784		if (update_odynamic(ofl) == S_ERROR)
3785			return (S_ERROR);
3786	}
3787	if (ofl->ofl_ossyminfo) {
3788		if (update_osyminfo(ofl) == S_ERROR)
3789			return (S_ERROR);
3790	}
3791
3792	/*
3793	 * Sanity test: the first and last data byte of a string table
3794	 * must be NULL.
3795	 */
3796	assert((ofl->ofl_osshstrtab == NULL) ||
3797	    (*((char *)ofl->ofl_osshstrtab->os_outdata->d_buf) == '\0'));
3798	assert((ofl->ofl_osshstrtab == NULL) ||
3799	    (*(((char *)ofl->ofl_osshstrtab->os_outdata->d_buf) +
3800	    ofl->ofl_osshstrtab->os_outdata->d_size - 1) == '\0'));
3801
3802	assert((ofl->ofl_osstrtab == NULL) ||
3803	    (*((char *)ofl->ofl_osstrtab->os_outdata->d_buf) == '\0'));
3804	assert((ofl->ofl_osstrtab == NULL) ||
3805	    (*(((char *)ofl->ofl_osstrtab->os_outdata->d_buf) +
3806	    ofl->ofl_osstrtab->os_outdata->d_size - 1) == '\0'));
3807
3808	assert((ofl->ofl_osdynstr == NULL) ||
3809	    (*((char *)ofl->ofl_osdynstr->os_outdata->d_buf) == '\0'));
3810	assert((ofl->ofl_osdynstr == NULL) ||
3811	    (*(((char *)ofl->ofl_osdynstr->os_outdata->d_buf) +
3812	    ofl->ofl_osdynstr->os_outdata->d_size - DYNSTR_EXTRA_PAD - 1) ==
3813	    '\0'));
3814
3815	/*
3816	 * Emit Strtab diagnostics.
3817	 */
3818	DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osshstrtab,
3819	    ofl->ofl_shdrsttab));
3820	DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osstrtab,
3821	    ofl->ofl_strtab));
3822	DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osdynstr,
3823	    ofl->ofl_dynstrtab));
3824
3825	/*
3826	 * Initialize the section headers string table index within the elf
3827	 * header.
3828	 */
3829	/* LINTED */
3830	if ((shscnndx = elf_ndxscn(ofl->ofl_osshstrtab->os_scn)) <
3831	    SHN_LORESERVE) {
3832		ofl->ofl_nehdr->e_shstrndx =
3833		    /* LINTED */
3834		    (Half)shscnndx;
3835	} else {
3836		/*
3837		 * If the STRTAB section index doesn't fit into
3838		 * e_shstrndx, then we store it in 'shdr[0].st_link'.
3839		 */
3840		Elf_Scn	*scn;
3841		Shdr	*shdr0;
3842
3843		if ((scn = elf_getscn(ofl->ofl_elf, 0)) == NULL) {
3844			eprintf(ofl->ofl_lml, ERR_ELF,
3845			    MSG_INTL(MSG_ELF_GETSCN), ofl->ofl_name);
3846			return (S_ERROR);
3847		}
3848		if ((shdr0 = elf_getshdr(scn)) == NULL) {
3849			eprintf(ofl->ofl_lml, ERR_ELF,
3850			    MSG_INTL(MSG_ELF_GETSHDR), ofl->ofl_name);
3851			return (S_ERROR);
3852		}
3853		ofl->ofl_nehdr->e_shstrndx = SHN_XINDEX;
3854		shdr0->sh_link = shscnndx;
3855	}
3856
3857	return ((uintptr_t)etext);
3858}
3859