xref: /illumos-gate/usr/src/cmd/sgs/libld/common/update.c (revision 80ab886d233f514d54c2a6bdeb9fdfd951bd6881)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  *	Copyright (c) 1988 AT&T
24  *	  All Rights Reserved
25  *
26  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
27  * Use is subject to license terms.
28  */
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 /*
32  * Update the new output file image, perform virtual address, offset and
33  * displacement calculations on the program headers and sections headers,
34  * and generate any new output section information.
35  */
36 #include	<stdio.h>
37 #include	<string.h>
38 #include	<debug.h>
39 #include	"msg.h"
40 #include	"_libld.h"
41 
42 /*
43  * Comparison routine used by qsort() for sorting of the global yymbol list
44  * based off of the hashbuckets the symbol will eventually be deposited in.
45  */
46 static int
47 sym_hash_compare(Sym_s_list * s1, Sym_s_list * s2)
48 {
49 	return (s1->sl_hval - s2->sl_hval);
50 }
51 
52 /*
53  * Build and update any output symbol tables.  Here we work on all the symbol
54  * tables at once to reduce the duplication of symbol and string manipulation.
55  * Symbols and their associated strings are copied from the read-only input
56  * file images to the output image and their values and index's updated in the
57  * output image.
58  */
59 static Addr
60 update_osym(Ofl_desc *ofl)
61 {
62 	Listnode	*lnp1;
63 	Sym_desc	*sdp;
64 	Sym_avlnode	*sav;
65 	Sg_desc		*sgp, *tsgp = 0, *dsgp = 0, *esgp = 0;
66 	Os_desc		*osp;
67 	Ifl_desc	*ifl;
68 	Word		bssndx, etext_ndx, edata_ndx = 0, end_ndx, start_ndx;
69 	Word		end_abs = 0, etext_abs = 0, edata_abs;
70 	Word		tlsbssndx = 0, sunwbssndx = 0, sunwdata1ndx;
71 #if	(defined(__i386) || defined(__amd64)) && defined(_ELF64)
72 	Word		lbssndx = 0;
73 	Addr		lbssaddr = 0;
74 #endif
75 	Addr		bssaddr, etext = 0, edata = 0, end = 0, start = 0;
76 	Addr		tlsbssaddr = 0;
77 	Addr 		sunwbssaddr = 0, sunwdata1addr;
78 	int		start_set = 0;
79 	Sym		_sym = {0}, *sym, *symtab = 0, *dynsym = 0;
80 	Word		symtab_ndx = 0;	/* index into .symtab */
81 	Word		dynsym_ndx = 0;	/* index into .dynsym */
82 	Word		scopesym_ndx = 0; /* index into scoped symbols */
83 	Word		*symndx = 0;	/* Symbol index (for relocation use) */
84 	Word		*symshndx = 0;	/* .symtab_shndx table */
85 	Word		*dynshndx = 0;	/* .dynsym_shndx table */
86 	Str_tbl		*shstrtab;
87 	Str_tbl		*strtab;
88 	Str_tbl		*dynstr;
89 	Word		*hashtab;	/* hash table pointer */
90 	Word		*hashbkt;	/* hash table bucket pointer */
91 	Word		*hashchain;	/* hash table chain pointer */
92 	Word		hashval;	/* value of hash function */
93 	Wk_desc		*wkp;
94 	List		weak = {NULL, NULL};
95 	Word		flags = ofl->ofl_flags;
96 	Word		dtflags_1 = ofl->ofl_dtflags_1;
97 	Versym		*versym;
98 	Gottable	*gottable;	/* used for display got debugging */
99 					/*	information */
100 	Gottable	*_gottable;
101 	Syminfo		*syminfo;
102 	Sym_s_list	*sorted_syms;	/* table to hold sorted symbols */
103 	Word		ssndx;		/* global index into sorted_syms */
104 	Word		scndx;		/* scoped index into sorted_syms */
105 	uint_t		stoff;		/* string offset */
106 
107 	/*
108 	 * Initialize pointers to the symbol table entries and the symbol
109 	 * table strings.  Skip the first symbol entry and the first string
110 	 * table byte.  Note that if we are not generating any output symbol
111 	 * tables we must still generate and update an internal copies so
112 	 * that the relocation phase has the correct information.
113 	 */
114 	if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ) ||
115 	    ((flags & FLG_OF_STATIC) && ofl->ofl_osversym)) {
116 		symtab = (Sym *)ofl->ofl_ossymtab->os_outdata->d_buf;
117 		symtab[symtab_ndx++] = _sym;
118 		if (ofl->ofl_ossymshndx)
119 		    symshndx = (Word *)ofl->ofl_ossymshndx->os_outdata->d_buf;
120 	}
121 	if ((flags & FLG_OF_DYNAMIC) && !(flags & FLG_OF_RELOBJ)) {
122 		dynsym = (Sym *)ofl->ofl_osdynsym->os_outdata->d_buf;
123 		dynsym[dynsym_ndx++] = _sym;
124 		/*
125 		 * Initialize the hash table.
126 		 */
127 		hashtab = (Word *)(ofl->ofl_oshash->os_outdata->d_buf);
128 		hashbkt = &hashtab[2];
129 		hashchain = &hashtab[2 + ofl->ofl_hashbkts];
130 		hashtab[0] = ofl->ofl_hashbkts;
131 		hashtab[1] = ofl->ofl_dynshdrcnt + ofl->ofl_globcnt +
132 		    ofl->ofl_lregsymcnt + 1;
133 		if (ofl->ofl_osdynshndx)
134 		    dynshndx = (Word *)ofl->ofl_osdynshndx->os_outdata->d_buf;
135 	}
136 
137 	/*
138 	 * symndx is the symbol index to be used for relocation processing.  It
139 	 * points to the relevant symtab's (.dynsym or .symtab) symbol ndx.
140 	 */
141 	if (dynsym)
142 		symndx = &dynsym_ndx;
143 	else
144 		symndx = &symtab_ndx;
145 
146 	/*
147 	 * If we have version definitions initialize the version symbol index
148 	 * table.  There is one entry for each symbol which contains the symbols
149 	 * version index.
150 	 */
151 	if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) == FLG_OF_VERDEF) {
152 		versym = (Versym *)ofl->ofl_osversym->os_outdata->d_buf;
153 		versym[0] = 0;
154 	} else
155 		versym = 0;
156 
157 	/*
158 	 * If syminfo section exists be prepared to fill it in.
159 	 */
160 	if (ofl->ofl_ossyminfo) {
161 		syminfo = ofl->ofl_ossyminfo->os_outdata->d_buf;
162 		syminfo[0].si_flags = SYMINFO_CURRENT;
163 	} else
164 		syminfo = 0;
165 
166 	/*
167 	 * Setup our string tables.
168 	 */
169 	shstrtab = ofl->ofl_shdrsttab;
170 	strtab = ofl->ofl_strtab;
171 	dynstr = ofl->ofl_dynstrtab;
172 
173 	DBG_CALL(Dbg_syms_sec_title(ofl->ofl_lml));
174 
175 	/*
176 	 * Add the output file name to the first .symtab symbol.
177 	 */
178 	if (symtab) {
179 		(void) st_setstring(strtab, ofl->ofl_name, &stoff);
180 		sym = &symtab[symtab_ndx++];
181 		/* LINTED */
182 		sym->st_name = stoff;
183 		sym->st_value = 0;
184 		sym->st_size = 0;
185 		sym->st_info = ELF_ST_INFO(STB_LOCAL, STT_FILE);
186 		sym->st_other = 0;
187 		sym->st_shndx = SHN_ABS;
188 
189 		if (versym && !dynsym)
190 			versym[1] = 0;
191 	}
192 
193 	/*
194 	 * If we are to display GOT summary information, then allocate
195 	 * the buffer to 'cache' the GOT symbols into now.
196 	 */
197 	if (DBG_ENABLED) {
198 		if ((_gottable = gottable = libld_calloc(ofl->ofl_gotcnt,
199 		    sizeof (Gottable))) == 0)
200 		return ((Addr)S_ERROR);
201 	}
202 
203 	/*
204 	 * Traverse the program headers.  Determine the last executable segment
205 	 * and the last data segment so that we can update etext and edata. If
206 	 * we have empty segments (reservations) record them for setting _end.
207 	 */
208 	for (LIST_TRAVERSE(&ofl->ofl_segs, lnp1, sgp)) {
209 		Phdr	*phd = &(sgp->sg_phdr);
210 		Os_desc	**ospp;
211 		Aliste	off;
212 
213 		if (phd->p_type == PT_LOAD) {
214 			if (sgp->sg_osdescs != NULL) {
215 			    Word	_flags = phd->p_flags & (PF_W | PF_R);
216 
217 			    if (_flags == PF_R) {
218 #if	(defined(__i386) || defined(__amd64)) && defined(_ELF64)
219 				Shdr	*shdr;
220 
221 				osp = (Os_desc *)sgp->sg_osdescs->al_data[0];
222 				shdr = osp->os_shdr;
223 
224 				if (((shdr->sh_flags & SHF_AMD64_LARGE)) == 0)
225 					tsgp = sgp;
226 #else
227 				tsgp = sgp;
228 #endif
229 			    } else if (_flags == (PF_W | PF_R))
230 				dsgp = sgp;
231 			} else if (sgp->sg_flags & FLG_SG_EMPTY)
232 			    esgp = sgp;
233 		}
234 
235 		/*
236 		 * Generate a section symbol for each output section.
237 		 */
238 		for (ALIST_TRAVERSE(sgp->sg_osdescs, off, ospp)) {
239 			Word	sectndx;
240 
241 			osp = *ospp;
242 
243 			sym = &_sym;
244 			sym->st_value = osp->os_shdr->sh_addr;
245 			sym->st_info = ELF_ST_INFO(STB_LOCAL, STT_SECTION);
246 			/* LINTED */
247 			sectndx = elf_ndxscn(osp->os_scn);
248 
249 			if (symtab) {
250 				if (sectndx >= SHN_LORESERVE) {
251 					symshndx[symtab_ndx] = sectndx;
252 					sym->st_shndx = SHN_XINDEX;
253 				} else {
254 					/* LINTED */
255 					sym->st_shndx = (Half)sectndx;
256 				}
257 				symtab[symtab_ndx++] = *sym;
258 			}
259 
260 			if (dynsym && (osp->os_flags & FLG_OS_OUTREL))
261 				dynsym[dynsym_ndx++] = *sym;
262 
263 			if ((dynsym == 0) || (osp->os_flags & FLG_OS_OUTREL)) {
264 				if (versym)
265 					versym[*symndx - 1] = 0;
266 				osp->os_scnsymndx = *symndx - 1;
267 				DBG_CALL(Dbg_syms_sec_entry(ofl->ofl_lml,
268 				    osp->os_scnsymndx, sgp, osp));
269 			}
270 
271 			/*
272 			 * Generate the .shstrtab for this section.
273 			 */
274 			(void) st_setstring(shstrtab, osp->os_name, &stoff);
275 			osp->os_shdr->sh_name = (Word)stoff;
276 
277 			/*
278 			 * Find the section index for our special symbols.
279 			 */
280 			if (sgp == tsgp) {
281 				/* LINTED */
282 				etext_ndx = elf_ndxscn(osp->os_scn);
283 			} else if (dsgp == sgp) {
284 				if (osp->os_shdr->sh_type != SHT_NOBITS) {
285 					/* LINTED */
286 					edata_ndx = elf_ndxscn(osp->os_scn);
287 				}
288 			}
289 
290 			if (start_set == 0) {
291 				start = sgp->sg_phdr.p_vaddr;
292 				/* LINTED */
293 				start_ndx = elf_ndxscn(osp->os_scn);
294 				start_set++;
295 			}
296 		}
297 	}
298 
299 	/*
300 	 * Add local register symbols to the .dynsym.  These are required as
301 	 * DT_REGISTER .dynamic entries must have a symbol to reference.
302 	 */
303 	if (ofl->ofl_regsyms && dynsym) {
304 		int	ndx;
305 
306 		for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) {
307 			Sym_desc *	rsdp;
308 
309 			if ((rsdp = ofl->ofl_regsyms[ndx]) == 0)
310 				continue;
311 
312 			if (((rsdp->sd_flags1 & FLG_SY1_LOCL) == 0) &&
313 			    (ELF_ST_BIND(rsdp->sd_sym->st_info) != STB_LOCAL))
314 				continue;
315 
316 			dynsym[dynsym_ndx] = *(rsdp->sd_sym);
317 			rsdp->sd_symndx = *symndx;
318 
319 			if (dynsym[dynsym_ndx].st_name) {
320 				(void) st_setstring(dynstr, rsdp->sd_name,
321 				    &stoff);
322 				dynsym[dynsym_ndx].st_name = stoff;
323 			}
324 			dynsym_ndx++;
325 		}
326 	}
327 
328 	/*
329 	 * Having traversed all the output segments, warn the user if the
330 	 * traditional text or data segments don't exist.  Otherwise from these
331 	 * segments establish the values for `etext', `edata', `end', `END',
332 	 * and `START'.
333 	 */
334 	if (!(flags & FLG_OF_RELOBJ)) {
335 		Sg_desc *	sgp;
336 
337 		if (tsgp)
338 			etext = tsgp->sg_phdr.p_vaddr + tsgp->sg_phdr.p_filesz;
339 		else {
340 			etext = (Addr)0;
341 			etext_ndx = SHN_ABS;
342 			etext_abs = 1;
343 			if (ofl->ofl_flags & FLG_OF_VERBOSE)
344 				eprintf(ofl->ofl_lml, ERR_WARNING,
345 				    MSG_INTL(MSG_UPD_NOREADSEG));
346 		}
347 		if (dsgp) {
348 			edata = dsgp->sg_phdr.p_vaddr + dsgp->sg_phdr.p_filesz;
349 		} else {
350 			edata = (Addr)0;
351 			edata_ndx = SHN_ABS;
352 			edata_abs = 1;
353 			if (ofl->ofl_flags & FLG_OF_VERBOSE)
354 				eprintf(ofl->ofl_lml, ERR_WARNING,
355 				    MSG_INTL(MSG_UPD_NORDWRSEG));
356 		}
357 
358 		if (dsgp == 0) {
359 			if (tsgp)
360 				sgp = tsgp;
361 			else
362 				sgp = 0;
363 		} else if (tsgp == 0)
364 			sgp = dsgp;
365 		else if (dsgp->sg_phdr.p_vaddr > tsgp->sg_phdr.p_vaddr)
366 			sgp = dsgp;
367 		else if (dsgp->sg_phdr.p_vaddr < tsgp->sg_phdr.p_vaddr)
368 			sgp = tsgp;
369 		else {
370 			/*
371 			 * One of the segments must be of zero size.
372 			 */
373 			if (tsgp->sg_phdr.p_memsz)
374 				sgp = tsgp;
375 			else
376 				sgp = dsgp;
377 		}
378 
379 		if (esgp && (esgp->sg_phdr.p_vaddr > sgp->sg_phdr.p_vaddr))
380 			sgp = esgp;
381 
382 		if (sgp) {
383 			end = sgp->sg_phdr.p_vaddr + sgp->sg_phdr.p_memsz;
384 
385 			/*
386 			 * If we're dealing with a memory reservation there are
387 			 * no sections to establish an index for _end, so assign
388 			 * it as an absolute.
389 			 */
390 			if (sgp->sg_osdescs != NULL) {
391 				Os_desc	**ospp;
392 				Alist	*alp = sgp->sg_osdescs;
393 				Aliste	last = alp->al_next - alp->al_size;
394 
395 				/*
396 				 * Determine the last section for this segment.
397 				 */
398 				/* LINTED */
399 				ospp = (Os_desc **)((char *)alp + last);
400 				/* LINTED */
401 				end_ndx = elf_ndxscn((*ospp)->os_scn);
402 			} else {
403 				end_ndx = SHN_ABS;
404 				end_abs = 1;
405 			}
406 		} else {
407 			end = (Addr) 0;
408 			end_ndx = SHN_ABS;
409 			end_abs = 1;
410 			eprintf(ofl->ofl_lml, ERR_WARNING,
411 			    MSG_INTL(MSG_UPD_NOSEG));
412 		}
413 	}
414 
415 	DBG_CALL(Dbg_syms_up_title(ofl->ofl_lml));
416 
417 	/*
418 	 * Initialize the scoped symbol table entry point.  This is for all
419 	 * the global symbols that have been scoped to locals and will be
420 	 * filled in during global symbol processing so that we don't have
421 	 * to traverse the globals symbol hash array more than once.
422 	 */
423 	if (symtab) {
424 		scopesym_ndx = symtab_ndx;
425 		symtab_ndx += ofl->ofl_scopecnt;
426 	}
427 
428 	/*
429 	 * Assign .sunwdata1 information
430 	 */
431 	if (ofl->ofl_issunwdata1) {
432 		osp = ofl->ofl_issunwdata1->is_osdesc;
433 		sunwdata1addr = (Addr)(osp->os_shdr->sh_addr +
434 			ofl->ofl_issunwdata1->is_indata->d_off);
435 		/* LINTED */
436 		sunwdata1ndx = elf_ndxscn(osp->os_scn);
437 		ofl->ofl_sunwdata1ndx = osp->os_scnsymndx;
438 	}
439 
440 	/*
441 	 * If we are generating a .symtab collect all the local symbols,
442 	 * assigning a new virtual address or displacement (value).
443 	 */
444 	for (LIST_TRAVERSE(&ofl->ofl_objs, lnp1, ifl)) {
445 		Xword		lndx, local;
446 		Is_desc *	isc;
447 
448 		/*
449 		 * Check that we have local symbols to process.  If the user
450 		 * has indicated scoping then scan the global symbols also
451 		 * looking for entries from this file to reduce to locals.
452 		 */
453 		if ((local = ifl->ifl_locscnt) == 0)
454 			continue;
455 
456 		for (lndx = 1; lndx < local; lndx++) {
457 			Listnode	*lnp2;
458 			Gotndx		*gnp;
459 			unsigned char	type;
460 			Word		*_symshndx;
461 
462 			sdp = ifl->ifl_oldndx[lndx];
463 			sym = sdp->sd_sym;
464 
465 #if	defined(sparc) || defined(__sparcv9)
466 			/*
467 			 * Assign a got offset if necessary.
468 			 */
469 			if (ld_assign_got(ofl, sdp) == S_ERROR)
470 				return ((Addr)S_ERROR);
471 #elif defined(i386) || defined(__amd64)
472 /* nothing to do */
473 #else
474 #error Unknown architecture!
475 #endif
476 			if (DBG_ENABLED) {
477 			    for (LIST_TRAVERSE(&sdp->sd_GOTndxs, lnp2, gnp)) {
478 				_gottable->gt_sym = sdp;
479 				_gottable->gt_gndx.gn_gotndx = gnp->gn_gotndx;
480 				_gottable->gt_gndx.gn_addend = gnp->gn_addend;
481 				_gottable++;
482 			    }
483 			}
484 
485 			if ((type = ELF_ST_TYPE(sym->st_info)) == STT_SECTION)
486 				continue;
487 
488 			/*
489 			 * Ignore any symbols that have been marked as invalid
490 			 * during input processing.  Providing these aren't used
491 			 * for relocation they'll just be dropped from the
492 			 * output image.
493 			 */
494 			if (sdp->sd_flags & FLG_SY_INVALID)
495 				continue;
496 
497 			/*
498 			 * If the section that this symbol was associated
499 			 * with has been discarded - then we discard
500 			 * the local symbol along with it.
501 			 */
502 			if (sdp->sd_flags & FLG_SY_ISDISC)
503 				continue;
504 
505 			/*
506 			 * Generate an output symbol to represent this input
507 			 * symbol.  Even if the symbol table is to be stripped
508 			 * we still need to update any local symbols that are
509 			 * used during relocation.
510 			 */
511 			_symshndx = 0;
512 			if (symtab && (!(ofl->ofl_flags1 & FLG_OF1_REDLSYM) ||
513 			    (sdp->sd_psyminfo))) {
514 				if (!dynsym)
515 					sdp->sd_symndx = *symndx;
516 				symtab[symtab_ndx] = *sym;
517 
518 				/*
519 				 * Provided this isn't an unnamed register
520 				 * symbol, update its name.
521 				 */
522 				if (((sdp->sd_flags & FLG_SY_REGSYM) == 0) ||
523 				    symtab[symtab_ndx].st_name) {
524 					(void) st_setstring(strtab,
525 					    sdp->sd_name, &stoff);
526 					symtab[symtab_ndx].st_name = stoff;
527 				}
528 				sdp->sd_flags &= ~FLG_SY_CLEAN;
529 				if (symshndx)
530 					_symshndx = &symshndx[symtab_ndx];
531 				sdp->sd_sym = sym = &symtab[symtab_ndx++];
532 
533 				if ((sdp->sd_flags & FLG_SY_SPECSEC) &&
534 				    (sym->st_shndx == SHN_ABS))
535 					continue;
536 			} else {
537 				/*
538 				 * If this symbol requires modifying to provide
539 				 * for a relocation or move table update, make
540 				 * a copy of it.
541 				 */
542 				if (!(sdp->sd_flags & FLG_SY_UPREQD) &&
543 				    !(sdp->sd_psyminfo))
544 					continue;
545 				if ((sdp->sd_flags & FLG_SY_SPECSEC) &&
546 				    (sym->st_shndx == SHN_ABS))
547 					continue;
548 
549 				if (ld_sym_copy(sdp) == S_ERROR)
550 					return ((Addr)S_ERROR);
551 				sym = sdp->sd_sym;
552 			}
553 
554 			/*
555 			 * Update the symbols contents if necessary.
556 			 */
557 			if (type == STT_FILE) {
558 				sdp->sd_shndx = sym->st_shndx = SHN_ABS;
559 				sdp->sd_flags |= FLG_SY_SPECSEC;
560 				continue;
561 			}
562 
563 			/*
564 			 * If we are expanding the locally bound partially
565 			 * initialized symbols, then update the address here.
566 			 */
567 			if (ofl->ofl_issunwdata1 &&
568 			    (sdp->sd_flags & FLG_SY_PAREXPN)) {
569 				static	Addr	laddr = 0;
570 
571 				sym->st_shndx = sunwdata1ndx;
572 				sdp->sd_isc = ofl->ofl_issunwdata1;
573 				if (ofl->ofl_flags & FLG_OF_RELOBJ)
574 					sym->st_value = sunwdata1addr;
575 				else {
576 					sym->st_value = laddr;
577 					laddr += sym->st_size;
578 				}
579 				sunwdata1addr += sym->st_size;
580 			}
581 
582 			/*
583 			 * If this isn't an UNDEF symbol (ie. an input section
584 			 * is associated), update the symbols value and index.
585 			 */
586 			if ((isc = sdp->sd_isc) != 0) {
587 				Word	sectndx;
588 
589 				osp = isc->is_osdesc;
590 				/* LINTED */
591 				sym->st_value +=
592 				    (Off)_elf_getxoff(isc->is_indata);
593 				if (!(flags & FLG_OF_RELOBJ)) {
594 					sym->st_value += osp->os_shdr->sh_addr;
595 					/*
596 					 * TLS symbols are relative to
597 					 * the TLS segment.
598 					 */
599 					if ((ELF_ST_TYPE(sym->st_info) ==
600 					    STT_TLS) && (ofl->ofl_tlsphdr))
601 						sym->st_value -=
602 						    ofl->ofl_tlsphdr->p_vaddr;
603 				}
604 				/* LINTED */
605 				if ((sdp->sd_shndx = sectndx =
606 				    elf_ndxscn(osp->os_scn)) >= SHN_LORESERVE) {
607 					if (_symshndx) {
608 						*_symshndx = sectndx;
609 					}
610 					sym->st_shndx = SHN_XINDEX;
611 				} else {
612 					/* LINTED */
613 					sym->st_shndx = sectndx;
614 				}
615 			}
616 		}
617 	}
618 
619 	/*
620 	 * Two special symbols are `_init' and `_fini'.  If these are supplied
621 	 * by crti.o then they are used to represent the total concatenation of
622 	 * the `.init' and `.fini' sections.  In this case determine the size of
623 	 * these sections and updated the symbols value accordingly.
624 	 */
625 	if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U), SYM_NOHASH, 0,
626 	    ofl)) != NULL) && (sdp->sd_ref == REF_REL_NEED) && sdp->sd_isc &&
627 	    (strcmp(sdp->sd_isc->is_name, MSG_ORIG(MSG_SCN_INIT)) == 0)) {
628 
629 		if (ld_sym_copy(sdp) == S_ERROR)
630 			return ((Addr)S_ERROR);
631 		sdp->sd_sym->st_size =
632 			sdp->sd_isc->is_osdesc->os_shdr->sh_size;
633 	}
634 	if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U), SYM_NOHASH, 0,
635 	    ofl)) != NULL) && (sdp->sd_ref == REF_REL_NEED) && sdp->sd_isc &&
636 	    (strcmp(sdp->sd_isc->is_name, MSG_ORIG(MSG_SCN_FINI)) == 0)) {
637 		if (ld_sym_copy(sdp) == S_ERROR)
638 			return ((Addr)S_ERROR);
639 		sdp->sd_sym->st_size =
640 			sdp->sd_isc->is_osdesc->os_shdr->sh_size;
641 	}
642 
643 	/*
644 	 * Assign .bss information for use with updating COMMON symbols.
645 	 */
646 	if (ofl->ofl_isbss) {
647 		osp = ofl->ofl_isbss->is_osdesc;
648 
649 		bssaddr = osp->os_shdr->sh_addr +
650 			(Off)_elf_getxoff(ofl->ofl_isbss->is_indata);
651 		/* LINTED */
652 		bssndx = elf_ndxscn(osp->os_scn);
653 	}
654 
655 #if	(defined(__i386) || defined(__amd64)) && defined(_ELF64)
656 	/*
657 	 * Assign .lbss information for use with updating LCOMMON symbols.
658 	 */
659 	if (ofl->ofl_islbss) {
660 		osp = ofl->ofl_islbss->is_osdesc;
661 
662 		lbssaddr = osp->os_shdr->sh_addr +
663 			(Off)_elf_getxoff(ofl->ofl_islbss->is_indata);
664 		/* LINTED */
665 		lbssndx = elf_ndxscn(osp->os_scn);
666 	}
667 #endif
668 
669 	/*
670 	 * Assign .tlsbss information for use with updating COMMON symbols.
671 	 */
672 	if (ofl->ofl_istlsbss) {
673 		osp = ofl->ofl_istlsbss->is_osdesc;
674 		tlsbssaddr = osp->os_shdr->sh_addr +
675 			(Off)_elf_getxoff(ofl->ofl_istlsbss->is_indata);
676 		/* LINTED */
677 		tlsbssndx = elf_ndxscn(osp->os_scn);
678 	}
679 
680 	/*
681 	 * Assign .SUNWbss information for use with updating COMMON symbols.
682 	 */
683 	if (ofl->ofl_issunwbss) {
684 		osp = ofl->ofl_issunwbss->is_osdesc;
685 		sunwbssaddr = (Addr)(osp->os_shdr->sh_addr +
686 			ofl->ofl_issunwbss->is_indata->d_off);
687 		/* LINTED */
688 		sunwbssndx = elf_ndxscn(osp->os_scn);
689 	}
690 
691 
692 	if ((sorted_syms = libld_calloc(ofl->ofl_globcnt +
693 	    ofl->ofl_elimcnt + ofl->ofl_scopecnt, sizeof (*sorted_syms))) == 0)
694 		return ((Addr)S_ERROR);
695 
696 	scndx = 0;
697 	ssndx = ofl->ofl_scopecnt + ofl->ofl_elimcnt;
698 
699 	/*
700 	 * Traverse the internal symbol table updating information and
701 	 * allocating common.
702 	 */
703 	for (sav = avl_first(&ofl->ofl_symavl); sav;
704 	    sav = AVL_NEXT(&ofl->ofl_symavl, sav)) {
705 		Sym *	symptr;
706 		int	local;
707 		int	restore;
708 
709 		sdp = sav->sav_symdesc;
710 
711 		/*
712 		 * Ignore any symbols that have been marked as
713 		 * invalid during input processing.  Providing
714 		 * these aren't used for relocation they'll
715 		 * just be dropped from the output image.
716 		 */
717 		if (sdp->sd_flags & FLG_SY_INVALID) {
718 			DBG_CALL(Dbg_syms_old(ofl, sdp));
719 			DBG_CALL(Dbg_syms_ignore(ofl, sdp));
720 			continue;
721 		}
722 
723 		/*
724 		 * Only needed symbols will be copied to the
725 		 * output symbol table.
726 		 */
727 		if (sdp->sd_ref == REF_DYN_SEEN)
728 			continue;
729 
730 		if ((sdp->sd_flags1 & FLG_SY1_LOCL) &&
731 		    (flags & FLG_OF_PROCRED))
732 			local = 1;
733 		else
734 			local = 0;
735 
736 		if (local || (ofl->ofl_hashbkts == 0)) {
737 			sorted_syms[scndx++].sl_sdp = sdp;
738 		} else {
739 			sorted_syms[ssndx].sl_hval = sdp->sd_aux->sa_hash %
740 			    ofl->ofl_hashbkts;
741 			sorted_syms[ssndx].sl_sdp = sdp;
742 			ssndx++;
743 		}
744 
745 		/*
746 		 * Note - we expand the COMMON symbols here
747 		 * because we *must* assign addresses to them
748 		 * in the same order that we calculated space
749 		 * in sym_validate().  If we don't then
750 		 * differing alignment requirements can
751 		 * throw us all out of whack.
752 		 *
753 		 * The expanded .bss global symbol is handled
754 		 * here as well.
755 		 *
756 		 * The actual adding entries into the symbol
757 		 * table still occurs below in hashbucket order.
758 		 */
759 		symptr = sdp->sd_sym;
760 		restore = 0;
761 		if ((sdp->sd_flags & FLG_SY_PAREXPN) ||
762 		    ((sdp->sd_flags & FLG_SY_SPECSEC) &&
763 		    (sdp->sd_shndx = symptr->st_shndx) == SHN_COMMON)) {
764 
765 			/*
766 			 * If this this is an expanded symbol,
767 			 * 	it goes to sunwdata1.
768 			 *
769 			 * If this is a partial initialized
770 			 * global symbol and the output is a
771 			 * shared object, it goes to sunwbss.
772 			 *
773 			 * If allocating common assign it an
774 			 * address in the .bss section.
775 			 *
776 			 * Otherwise leave it as is.
777 			 */
778 			if (sdp->sd_flags & FLG_SY_PAREXPN) {
779 				restore = 1;
780 				sdp->sd_shndx = sunwdata1ndx;
781 				sdp->sd_flags &= ~FLG_SY_SPECSEC;
782 				symptr->st_value = (Xword) S_ROUND(
783 				    sunwdata1addr, symptr->st_value);
784 				sunwdata1addr = symptr->st_value +
785 					symptr->st_size;
786 				sdp->sd_isc = ofl->ofl_issunwdata1;
787 				sdp->sd_flags |= FLG_SY_COMMEXP;
788 
789 			} else if ((sdp->sd_psyminfo != (Psym_info *)NULL) &&
790 			    (ofl->ofl_flags & FLG_OF_SHAROBJ) &&
791 			    (ELF_ST_BIND(symptr->st_info) != STB_LOCAL)) {
792 				restore = 1;
793 				sdp->sd_shndx = sunwbssndx;
794 				sdp->sd_flags &= ~FLG_SY_SPECSEC;
795 				symptr->st_value = (Xword)
796 					S_ROUND(sunwbssaddr, symptr->st_value);
797 				sunwbssaddr = symptr->st_value +
798 					symptr->st_size;
799 				sdp->sd_isc = ofl->ofl_issunwbss;
800 				sdp->sd_flags |= FLG_SY_COMMEXP;
801 			} else if (ELF_ST_TYPE(symptr->st_info) != STT_TLS &&
802 			    (local || !(flags & FLG_OF_RELOBJ))) {
803 				restore = 1;
804 				sdp->sd_shndx = bssndx;
805 				sdp->sd_flags &= ~FLG_SY_SPECSEC;
806 				symptr->st_value = (Xword) S_ROUND(bssaddr,
807 					symptr->st_value);
808 				bssaddr = symptr->st_value + symptr->st_size;
809 				sdp->sd_isc = ofl->ofl_isbss;
810 				sdp->sd_flags |= FLG_SY_COMMEXP;
811 			} else if (ELF_ST_TYPE(symptr->st_info) == STT_TLS &&
812 			    (local || !(flags & FLG_OF_RELOBJ))) {
813 				restore = 1;
814 				sdp->sd_shndx = tlsbssndx;
815 				sdp->sd_flags &= ~FLG_SY_SPECSEC;
816 				symptr->st_value = (Xword)S_ROUND(tlsbssaddr,
817 					symptr->st_value);
818 				tlsbssaddr = symptr->st_value + symptr->st_size;
819 				sdp->sd_isc = ofl->ofl_istlsbss;
820 				sdp->sd_flags |= FLG_SY_COMMEXP;
821 				/*
822 				 * TLS symbols are relative to the TLS segment.
823 				 */
824 				symptr->st_value -= ofl->ofl_tlsphdr->p_vaddr;
825 			}
826 #if	(defined(__i386) || defined(__amd64)) && defined(_ELF64)
827 		} else if ((sdp->sd_flags & FLG_SY_SPECSEC) &&
828 		    ((sdp->sd_shndx = symptr->st_shndx) ==
829 		    SHN_X86_64_LCOMMON) &&
830 		    ((local || !(flags & FLG_OF_RELOBJ)))) {
831 			restore = 1;
832 			sdp->sd_shndx = lbssndx;
833 			sdp->sd_flags &= ~FLG_SY_SPECSEC;
834 			symptr->st_value = (Xword) S_ROUND(lbssaddr,
835 				symptr->st_value);
836 			lbssaddr = symptr->st_value + symptr->st_size;
837 			sdp->sd_isc = ofl->ofl_islbss;
838 			sdp->sd_flags |= FLG_SY_COMMEXP;
839 #endif
840 		}
841 
842 		if (restore != 0) {
843 			unsigned char type, bind;
844 			/*
845 			 * Make sure this COMMON
846 			 * symbol is returned to the
847 			 * same binding as was defined
848 			 * in the original relocatable
849 			 * object reference.
850 			 */
851 			type = ELF_ST_TYPE(symptr->st_info);
852 			if (sdp->sd_flags & FLG_SY_GLOBREF)
853 				bind = STB_GLOBAL;
854 			else
855 				bind = STB_WEAK;
856 
857 			symptr->st_info = ELF_ST_INFO(bind, type);
858 		}
859 	}
860 
861 	if (ofl->ofl_hashbkts) {
862 		qsort(sorted_syms + ofl->ofl_scopecnt + ofl->ofl_elimcnt,
863 		    ofl->ofl_globcnt, sizeof (Sym_s_list),
864 		    (int (*)(const void *, const void *))sym_hash_compare);
865 	}
866 
867 	for (ssndx = 0; ssndx < (ofl->ofl_elimcnt + ofl->ofl_scopecnt +
868 	    ofl->ofl_globcnt); ssndx++) {
869 		const char	*name;
870 		Sym		*sym;
871 		Sym_aux		*sap;
872 		Half		spec;
873 		int		local = 0, enter_in_symtab;
874 		Listnode	*lnp2;
875 		Gotndx		*gnp;
876 		Word		sectndx;
877 
878 		sdp = sorted_syms[ssndx].sl_sdp;
879 		sectndx = 0;
880 
881 		if (symtab)
882 			enter_in_symtab = 1;
883 		else
884 			enter_in_symtab = 0;
885 
886 		/*
887 		 * Assign a got offset if necessary.
888 		 */
889 #if	defined(sparc) || defined(__sparcv9)
890 		if (ld_assign_got(ofl, sdp) == S_ERROR)
891 			return ((Addr)S_ERROR);
892 #elif	defined(i386) || defined(__amd64)
893 /* nothing to do */
894 #else
895 #error Unknown architecture!
896 #endif
897 		if (DBG_ENABLED) {
898 			for (LIST_TRAVERSE(&sdp->sd_GOTndxs, lnp2, gnp)) {
899 				_gottable->gt_sym = sdp;
900 				_gottable->gt_gndx.gn_gotndx = gnp->gn_gotndx;
901 				_gottable->gt_gndx.gn_addend = gnp->gn_addend;
902 				_gottable++;
903 			}
904 
905 			if (sdp->sd_aux && sdp->sd_aux->sa_PLTGOTndx) {
906 				_gottable->gt_sym = sdp;
907 				_gottable->gt_gndx.gn_gotndx =
908 				    sdp->sd_aux->sa_PLTGOTndx;
909 				_gottable++;
910 			}
911 		}
912 
913 
914 		/*
915 		 * If this symbol has been marked as being reduced to local
916 		 * scope then it will have to be placed in the scoped portion
917 		 * of the .symtab.  Retain the appropriate index for use in
918 		 * version symbol indexing and relocation.
919 		 */
920 		if ((sdp->sd_flags1 & FLG_SY1_LOCL) &&
921 		    (flags & FLG_OF_PROCRED)) {
922 			local = 1;
923 			if (!(sdp->sd_flags1 & FLG_SY1_ELIM) && !dynsym)
924 				sdp->sd_symndx = scopesym_ndx;
925 			else
926 				sdp->sd_symndx = 0;
927 
928 			if (sdp->sd_flags1 & FLG_SY1_ELIM)
929 				enter_in_symtab = 0;
930 		} else
931 			sdp->sd_symndx = *symndx;
932 
933 		/*
934 		 * Copy basic symbol and string information.
935 		 */
936 		name = sdp->sd_name;
937 		sap = sdp->sd_aux;
938 
939 		/*
940 		 * If we require to record version symbol indexes, update the
941 		 * associated version symbol information for all defined
942 		 * symbols.  If a version definition is required any zero value
943 		 * symbol indexes would have been flagged as undefined symbol
944 		 * errors, however if we're just scoping these need to fall into
945 		 * the base of global symbols.
946 		 */
947 		if (sdp->sd_symndx && versym) {
948 			Half	vndx = 0;
949 
950 			if (sdp->sd_flags & FLG_SY_MVTOCOMM)
951 				vndx = VER_NDX_GLOBAL;
952 			else if (sdp->sd_ref == REF_REL_NEED) {
953 				Half	symflags1 = sdp->sd_flags1;
954 
955 				vndx = sap->sa_overndx;
956 				if ((vndx == 0) &&
957 				    (sdp->sd_sym->st_shndx != SHN_UNDEF)) {
958 					if (symflags1 & FLG_SY1_ELIM)
959 						vndx = VER_NDX_ELIMINATE;
960 					else if (symflags1 & FLG_SY1_LOCL)
961 						vndx = VER_NDX_LOCAL;
962 					else
963 						vndx = VER_NDX_GLOBAL;
964 				}
965 			}
966 			versym[sdp->sd_symndx] = vndx;
967 		}
968 
969 		/*
970 		 * If we are creating the .syminfo section then set per symbol
971 		 * flags here.
972 		 */
973 		if (sdp->sd_symndx && syminfo &&
974 		    !(sdp->sd_flags & FLG_SY_NOTAVAIL)) {
975 			int	ndx = sdp->sd_symndx;
976 			List	*sip = &(ofl->ofl_syminfsyms);
977 
978 			if (sdp->sd_flags & FLG_SY_MVTOCOMM)
979 				/*
980 				 * Identify a copy relocation symbol.
981 				 */
982 				syminfo[ndx].si_flags |= SYMINFO_FLG_COPY;
983 
984 			if (sdp->sd_ref == REF_DYN_NEED) {
985 				/*
986 				 * A reference is bound to a needed dependency.
987 				 * Save this symbol descriptor, as its boundto
988 				 * element will need updating after the .dynamic
989 				 * section has been created.  Flag whether this
990 				 * reference is lazy loadable, and if a direct
991 				 * binding is to be established.
992 				 */
993 				if (list_appendc(sip, sdp) == 0)
994 					return (0);
995 
996 				syminfo[ndx].si_flags |= SYMINFO_FLG_DIRECT;
997 				if (sdp->sd_flags & FLG_SY_LAZYLD)
998 					syminfo[ndx].si_flags |=
999 					    SYMINFO_FLG_LAZYLOAD;
1000 
1001 				/*
1002 				 * Enable direct symbol bindings if:
1003 				 *
1004 				 *  .	Symbol was identified with the DIRECT
1005 				 *	keyword in a mapfile.
1006 				 *
1007 				 *  .	Symbol reference has been bound to a
1008 				 * 	dependency which was specified as
1009 				 *	requiring direct bindings with -zdirect.
1010 				 *
1011 				 *  .	All symbol references are required to
1012 				 *	use direct bindings via -Bdirect.
1013 				 */
1014 				if (sdp->sd_flags1 & FLG_SY1_DIR)
1015 					syminfo[ndx].si_flags |=
1016 					    SYMINFO_FLG_DIRECTBIND;
1017 
1018 			} else if ((sdp->sd_flags & FLG_SY_EXTERN) &&
1019 			    (sdp->sd_sym->st_shndx == SHN_UNDEF)) {
1020 				/*
1021 				 * If this symbol has been explicitly defined
1022 				 * as external, and remains unresolved, mark
1023 				 * it as external.
1024 				 */
1025 				syminfo[ndx].si_boundto = SYMINFO_BT_EXTERN;
1026 
1027 			} else if (sdp->sd_flags & FLG_SY_PARENT) {
1028 				/*
1029 				 * A reference to a parent object.  Indicate
1030 				 * whether a direct binding should be
1031 				 * established.
1032 				 */
1033 				syminfo[ndx].si_flags |= SYMINFO_FLG_DIRECT;
1034 				syminfo[ndx].si_boundto = SYMINFO_BT_PARENT;
1035 				if (sdp->sd_flags1 & FLG_SY1_DIR)
1036 					syminfo[ndx].si_flags |=
1037 					    SYMINFO_FLG_DIRECTBIND;
1038 
1039 			} else if (sdp->sd_flags & FLG_SY_STDFLTR) {
1040 				/*
1041 				 * A filter definition.  Although this symbol
1042 				 * can only be a stub, it might be necessary to
1043 				 * prevent external direct bindings.
1044 				 */
1045 				syminfo[ndx].si_flags |= SYMINFO_FLG_FILTER;
1046 				if (sdp->sd_flags1 & FLG_SY1_NDIR)
1047 					syminfo[ndx].si_flags |=
1048 					    SYMINFO_FLG_NOEXTDIRECT;
1049 
1050 			} else if (sdp->sd_flags & FLG_SY_AUXFLTR) {
1051 				/*
1052 				 * An auxiliary filter definition.  By nature,
1053 				 * this definition is direct, in that should the
1054 				 * filtee lookup fail, we'll fall back to this
1055 				 * object.  It may still be necesssary to
1056 				 * prevent external direct bindings.
1057 				 */
1058 				syminfo[ndx].si_flags |= SYMINFO_FLG_AUXILIARY;
1059 				if (sdp->sd_flags1 & FLG_SY1_NDIR)
1060 					syminfo[ndx].si_flags |=
1061 					    SYMINFO_FLG_NOEXTDIRECT;
1062 
1063 			} else if ((sdp->sd_ref == REF_REL_NEED) &&
1064 			    (sdp->sd_sym->st_shndx != SHN_UNDEF)) {
1065 				/*
1066 				 * This definition exists within the object
1067 				 * being created.  Flag whether it is necessary
1068 				 * to prevent external direct bindings.
1069 				 */
1070 				if (sdp->sd_flags1 & FLG_SY1_NDIR) {
1071 					syminfo[ndx].si_boundto =
1072 					    SYMINFO_BT_NONE;
1073 					syminfo[ndx].si_flags |=
1074 					    SYMINFO_FLG_NOEXTDIRECT;
1075 				}
1076 
1077 				/*
1078 				 * If external bindings are allowed, or this is
1079 				 * a translator symbol, indicate the binding,
1080 				 * and a direct binding if necessary.
1081 				 */
1082 				if (((sdp->sd_flags1 & FLG_SY1_NDIR) == 0) ||
1083 				    ((dtflags_1 & DF_1_TRANS) && sdp->sd_aux &&
1084 				    sdp->sd_aux->sa_bindto)) {
1085 
1086 					syminfo[ndx].si_flags |=
1087 					    SYMINFO_FLG_DIRECT;
1088 
1089 					if (sdp->sd_flags1 & FLG_SY1_DIR)
1090 						syminfo[ndx].si_flags |=
1091 						    SYMINFO_FLG_DIRECTBIND;
1092 
1093 					/*
1094 					 * If this is a translator, the symbols
1095 					 * boundto element will indicate the
1096 					 * dependency to which it should resolve
1097 					 * rather than itself.  Save this info
1098 					 * for updating after the .dynamic
1099 					 * section has been created.
1100 					 */
1101 					if ((dtflags_1 & DF_1_TRANS) &&
1102 					    sdp->sd_aux &&
1103 					    sdp->sd_aux->sa_bindto) {
1104 						if (list_appendc(sip, sdp) == 0)
1105 							return (0);
1106 					} else {
1107 						syminfo[ndx].si_boundto =
1108 						    SYMINFO_BT_SELF;
1109 					}
1110 				}
1111 			}
1112 		}
1113 
1114 		/*
1115 		 * Note that the `sym' value is reset to be one of the new
1116 		 * symbol table entries.  This symbol will be updated further
1117 		 * depending on the type of the symbol.  Process the .symtab
1118 		 * first, followed by the .dynsym, thus the `sym' value will
1119 		 * remain as the .dynsym value when the .dynsym is present.
1120 		 * This insures that any versioning symbols st_name value will
1121 		 * be appropriate for the string table used to by version
1122 		 * entries.
1123 		 */
1124 		if (enter_in_symtab) {
1125 			Word	_symndx;
1126 
1127 			if (local)
1128 				_symndx = scopesym_ndx;
1129 			else
1130 				_symndx = symtab_ndx;
1131 			symtab[_symndx] = *sdp->sd_sym;
1132 			sdp->sd_sym = sym = &symtab[_symndx];
1133 			(void) st_setstring(strtab, name, &stoff);
1134 			sym->st_name = stoff;
1135 		}
1136 
1137 		if (dynsym && !local) {
1138 			dynsym[dynsym_ndx] = *sdp->sd_sym;
1139 
1140 			/*
1141 			 * Provided this isn't an unnamed register symbol,
1142 			 * update its name and hash value.
1143 			 */
1144 			if (((sdp->sd_flags & FLG_SY_REGSYM) == 0) ||
1145 			    dynsym[dynsym_ndx].st_name) {
1146 				(void) st_setstring(dynstr, name, &stoff);
1147 				dynsym[dynsym_ndx].st_name = stoff;
1148 				if (stoff) {
1149 					Word	_hashndx;
1150 					hashval =
1151 					    sap->sa_hash % ofl->ofl_hashbkts;
1152 					/* LINTED */
1153 					if (_hashndx = hashbkt[hashval]) {
1154 						while (hashchain[_hashndx])
1155 							_hashndx =
1156 							    hashchain[_hashndx];
1157 						hashchain[_hashndx] =
1158 						    sdp->sd_symndx;
1159 					} else
1160 						hashbkt[hashval] =
1161 						    sdp->sd_symndx;
1162 				}
1163 			}
1164 			sdp->sd_sym = sym = &dynsym[dynsym_ndx];
1165 		}
1166 		if (!enter_in_symtab && (!dynsym || local)) {
1167 			if (!(sdp->sd_flags & FLG_SY_UPREQD))
1168 				continue;
1169 			sym = sdp->sd_sym;
1170 		} else
1171 			sdp->sd_flags &= ~FLG_SY_CLEAN;
1172 
1173 
1174 		/*
1175 		 * If we have a weak data symbol for which we need the real
1176 		 * symbol also, save this processing until later.
1177 		 *
1178 		 * The exception to this is if the weak/strong have PLT's
1179 		 * assigned to them.  In that case we don't do the post-weak
1180 		 * processing because the PLT's must be maintained so that we
1181 		 * can do 'interpositioning' on both of the symbols.
1182 		 */
1183 		if ((sap->sa_linkndx) &&
1184 		    (ELF_ST_BIND(sym->st_info) == STB_WEAK) &&
1185 		    (!sap->sa_PLTndx)) {
1186 			Sym_desc *	_sdp =
1187 			    sdp->sd_file->ifl_oldndx[sap->sa_linkndx];
1188 
1189 			if (_sdp->sd_ref != REF_DYN_SEEN) {
1190 				if ((wkp =
1191 				    libld_calloc(sizeof (Wk_desc), 1)) == 0)
1192 					return ((Addr)S_ERROR);
1193 
1194 				if (enter_in_symtab)
1195 					if (local)
1196 						wkp->wk_symtab =
1197 						    &symtab[scopesym_ndx];
1198 					else
1199 						wkp->wk_symtab =
1200 						    &symtab[symtab_ndx];
1201 				if (dynsym && !local)
1202 					wkp->wk_dynsym = &dynsym[dynsym_ndx];
1203 				wkp->wk_weak = sdp;
1204 				wkp->wk_alias = _sdp;
1205 
1206 				if (!(list_appendc(&weak, wkp)))
1207 					return ((Addr)S_ERROR);
1208 
1209 				if (enter_in_symtab)
1210 					if (local)
1211 						scopesym_ndx++;
1212 					else
1213 						symtab_ndx++;
1214 				if (dynsym && !local)
1215 					dynsym_ndx++;
1216 				continue;
1217 			}
1218 		}
1219 
1220 		DBG_CALL(Dbg_syms_old(ofl, sdp));
1221 
1222 		spec = NULL;
1223 		/*
1224 		 * assign new symbol value.
1225 		 */
1226 		sectndx = sdp->sd_shndx;
1227 		if (sectndx == SHN_UNDEF) {
1228 			if (((sdp->sd_flags & FLG_SY_REGSYM) == 0) &&
1229 			    (sym->st_value != 0)) {
1230 				eprintf(ofl->ofl_lml, ERR_WARNING,
1231 				    MSG_INTL(MSG_SYM_NOTNULL),
1232 				    demangle(name), sdp->sd_file->ifl_name);
1233 			}
1234 
1235 			/*
1236 			 * Undefined weak global, if we are generating a static
1237 			 * executable, output as an absolute zero.  Otherwise
1238 			 * leave it as is, ld.so.1 will skip symbols of this
1239 			 * type (this technique allows applications and
1240 			 * libraries to test for the existence of a symbol as an
1241 			 * indication of the presence or absence of certain
1242 			 * functionality).
1243 			 */
1244 			if (((flags & (FLG_OF_STATIC | FLG_OF_EXEC)) ==
1245 			    (FLG_OF_STATIC | FLG_OF_EXEC)) &&
1246 			    (ELF_ST_BIND(sym->st_info) == STB_WEAK)) {
1247 				sdp->sd_flags |= FLG_SY_SPECSEC;
1248 				sdp->sd_shndx = sectndx = SHN_ABS;
1249 			}
1250 		} else if ((sdp->sd_flags & FLG_SY_SPECSEC) &&
1251 		    (sectndx == SHN_COMMON)) {
1252 			/* COMMONs have already been processed */
1253 			/* EMPTY */
1254 			;
1255 		} else {
1256 			if ((sdp->sd_flags & FLG_SY_SPECSEC) &&
1257 			    (sectndx == SHN_ABS))
1258 				spec = sdp->sd_aux->sa_symspec;
1259 
1260 			/* LINTED */
1261 			if (sdp->sd_flags & FLG_SY_COMMEXP) {
1262 				/*
1263 				 * This is (or was) a COMMON symbol which was
1264 				 * processed above - no processing
1265 				 * required here.
1266 				 */
1267 				;
1268 			} else if (sdp->sd_ref == REF_DYN_NEED) {
1269 				unsigned char	type, bind;
1270 
1271 				sectndx = SHN_UNDEF;
1272 				sym->st_value = 0;
1273 				sym->st_size = 0;
1274 
1275 				/*
1276 				 * Make sure this undefined symbol is returned
1277 				 * to the same binding as was defined in the
1278 				 * original relocatable object reference.
1279 				 */
1280 				type = ELF_ST_TYPE(sym-> st_info);
1281 				if (sdp->sd_flags & FLG_SY_GLOBREF)
1282 					bind = STB_GLOBAL;
1283 				else
1284 					bind = STB_WEAK;
1285 
1286 				sym->st_info = ELF_ST_INFO(bind, type);
1287 
1288 			} else if (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) &&
1289 			    (sdp->sd_ref == REF_REL_NEED)) {
1290 				osp = sdp->sd_isc->is_osdesc;
1291 				/* LINTED */
1292 				sectndx = elf_ndxscn(osp->os_scn);
1293 
1294 				/*
1295 				 * In an executable, the new symbol value is the
1296 				 * old value (offset into defining section) plus
1297 				 * virtual address of defining section.  In a
1298 				 * relocatable, the new value is the old value
1299 				 * plus the displacement of the section within
1300 				 * the file.
1301 				 */
1302 				/* LINTED */
1303 				sym->st_value +=
1304 				    (Off)_elf_getxoff(sdp->sd_isc->is_indata);
1305 
1306 				if (!(flags & FLG_OF_RELOBJ)) {
1307 					sym->st_value += osp->os_shdr->sh_addr;
1308 					/*
1309 					 * TLS symbols are relative to
1310 					 * the TLS segment.
1311 					 */
1312 					if ((ELF_ST_TYPE(sym->st_info) ==
1313 					    STT_TLS) && (ofl->ofl_tlsphdr))
1314 						sym->st_value -=
1315 						    ofl->ofl_tlsphdr->p_vaddr;
1316 				}
1317 			}
1318 		}
1319 
1320 		if (spec) {
1321 			switch (spec) {
1322 			case SDAUX_ID_ETEXT:
1323 				sym->st_value = etext;
1324 				sectndx = etext_ndx;
1325 				if (etext_abs)
1326 					sdp->sd_flags |= FLG_SY_SPECSEC;
1327 				else
1328 					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1329 				break;
1330 			case SDAUX_ID_EDATA:
1331 				sym->st_value = edata;
1332 				sectndx = edata_ndx;
1333 				if (edata_abs)
1334 					sdp->sd_flags |= FLG_SY_SPECSEC;
1335 				else
1336 					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1337 				break;
1338 			case SDAUX_ID_END:
1339 				sym->st_value = end;
1340 				sectndx = end_ndx;
1341 				if (end_abs)
1342 					sdp->sd_flags |= FLG_SY_SPECSEC;
1343 				else
1344 					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1345 				break;
1346 			case SDAUX_ID_START:
1347 				sym->st_value = start;
1348 				sectndx = start_ndx;
1349 				sdp->sd_flags &= ~FLG_SY_SPECSEC;
1350 				break;
1351 			case SDAUX_ID_DYN:
1352 				if (flags & FLG_OF_DYNAMIC) {
1353 					sym->st_value = ofl->
1354 					    ofl_osdynamic->os_shdr->sh_addr;
1355 					/* LINTED */
1356 					sectndx = elf_ndxscn(
1357 					    ofl->ofl_osdynamic->os_scn);
1358 					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1359 				}
1360 				break;
1361 			case SDAUX_ID_PLT:
1362 				if (ofl->ofl_osplt) {
1363 					sym->st_value = ofl->
1364 					    ofl_osplt->os_shdr->sh_addr;
1365 					/* LINTED */
1366 					sectndx = elf_ndxscn(
1367 					    ofl->ofl_osplt->os_scn);
1368 					sdp->sd_flags &= ~FLG_SY_SPECSEC;
1369 				}
1370 				break;
1371 			case SDAUX_ID_GOT:
1372 				/*
1373 				 * Symbol bias for negative growing tables is
1374 				 * stored in symbol's value during
1375 				 * allocate_got().
1376 				 */
1377 				sym->st_value += ofl->
1378 				    ofl_osgot->os_shdr->sh_addr;
1379 				/* LINTED */
1380 				sectndx = elf_ndxscn(ofl->
1381 				    ofl_osgot->os_scn);
1382 				sdp->sd_flags &= ~FLG_SY_SPECSEC;
1383 				break;
1384 			default:
1385 				/* NOTHING */
1386 				;
1387 			}
1388 		}
1389 
1390 		/*
1391 		 * If a plt index has been assigned to an undefined function,
1392 		 * update the symbols value to the appropriate .plt address.
1393 		 */
1394 		if ((flags & FLG_OF_DYNAMIC) && (flags & FLG_OF_EXEC) &&
1395 		    (sdp->sd_file) &&
1396 		    (sdp->sd_file->ifl_ehdr->e_type == ET_DYN) &&
1397 		    (ELF_ST_TYPE(sym->st_info) == STT_FUNC) &&
1398 		    !(flags & FLG_OF_BFLAG)) {
1399 			if (sap->sa_PLTndx)
1400 				sym->st_value = ld_calc_plt_addr(sdp, ofl);
1401 		}
1402 
1403 		/*
1404 		 * Finish updating the symbols.
1405 		 */
1406 
1407 		/*
1408 		 * Sym Update: if scoped local - set local binding
1409 		 */
1410 		if (local)
1411 			sym->st_info = ELF_ST_INFO(STB_LOCAL,
1412 			    ELF_ST_TYPE(sym->st_info));
1413 
1414 		/*
1415 		 * Sym Updated: If both the .symtab and .dynsym
1416 		 * are present then we've actually updated the information in
1417 		 * the .dynsym, therefore copy this same information to the
1418 		 * .symtab entry.
1419 		 */
1420 		sdp->sd_shndx = sectndx;
1421 		if (enter_in_symtab && dynsym && !local) {
1422 			symtab[symtab_ndx].st_value = sym->st_value;
1423 			symtab[symtab_ndx].st_size = sym->st_size;
1424 			symtab[symtab_ndx].st_info = sym->st_info;
1425 			symtab[symtab_ndx].st_other = sym->st_other;
1426 		}
1427 
1428 
1429 		if (enter_in_symtab) {
1430 			Word	_symndx;
1431 
1432 			if (local)
1433 				_symndx = scopesym_ndx++;
1434 			else
1435 				_symndx = symtab_ndx++;
1436 			if (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) &&
1437 			    (sectndx >= SHN_LORESERVE)) {
1438 				assert(symshndx != 0);
1439 				symshndx[_symndx] = sectndx;
1440 				symtab[_symndx].st_shndx = SHN_XINDEX;
1441 			} else {
1442 				/* LINTED */
1443 				symtab[_symndx].st_shndx = (Half)sectndx;
1444 			}
1445 		}
1446 
1447 		if (dynsym && !local) {
1448 			if (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) &&
1449 			    (sectndx >= SHN_LORESERVE)) {
1450 				assert(dynshndx != 0);
1451 				dynshndx[dynsym_ndx] = sectndx;
1452 				dynsym[dynsym_ndx].st_shndx = SHN_XINDEX;
1453 			} else {
1454 				/* LINTED */
1455 				dynsym[dynsym_ndx].st_shndx = (Half)sectndx;
1456 			}
1457 			dynsym_ndx++;
1458 		}
1459 
1460 		DBG_CALL(Dbg_syms_new(ofl, sym, sdp));
1461 	}
1462 
1463 	/*
1464 	 * Now that all the symbols have been processed update any weak symbols
1465 	 * information (ie. copy all information except `st_name').  As both
1466 	 * symbols will be represented in the output, return the weak symbol to
1467 	 * its correct type.
1468 	 */
1469 	for (LIST_TRAVERSE(&weak, lnp1, wkp)) {
1470 		Sym_desc *	sdp, * _sdp;
1471 		Sym *		sym, * _sym, * __sym;
1472 		unsigned char	bind;
1473 
1474 		sdp = wkp->wk_weak;
1475 		_sdp = wkp->wk_alias;
1476 		_sym = _sdp->sd_sym;
1477 
1478 		sdp->sd_flags |= FLG_SY_WEAKDEF;
1479 
1480 		/*
1481 		 * If the symbol definition has been scoped then assign it to
1482 		 * be local, otherwise if it's from a shared object then we need
1483 		 * to maintain the binding of the original reference.
1484 		 */
1485 		if (sdp->sd_flags1 & FLG_SY1_LOCL) {
1486 			if (flags & FLG_OF_PROCRED)
1487 				bind = STB_LOCAL;
1488 			else
1489 				bind = STB_WEAK;
1490 		} else if ((sdp->sd_ref == REF_DYN_NEED) &&
1491 		    (sdp->sd_flags & FLG_SY_GLOBREF))
1492 			bind = STB_GLOBAL;
1493 		else
1494 			bind = STB_WEAK;
1495 
1496 		DBG_CALL(Dbg_syms_old(ofl, sdp));
1497 		if ((sym = wkp->wk_symtab) != 0) {
1498 			sym = wkp->wk_symtab;
1499 			sym->st_value = _sym->st_value;
1500 			sym->st_size = _sym->st_size;
1501 			sym->st_other = _sym->st_other;
1502 			sym->st_shndx = _sym->st_shndx;
1503 			sym->st_info = ELF_ST_INFO(bind,
1504 			    ELF_ST_TYPE(sym->st_info));
1505 			__sym = sym;
1506 		}
1507 		if ((sym = wkp->wk_dynsym) != 0) {
1508 			sym = wkp->wk_dynsym;
1509 			sym->st_value = _sym->st_value;
1510 			sym->st_size = _sym->st_size;
1511 			sym->st_other = _sym->st_other;
1512 			sym->st_shndx = _sym->st_shndx;
1513 			sym->st_info = ELF_ST_INFO(bind,
1514 			    ELF_ST_TYPE(sym->st_info));
1515 			__sym = sym;
1516 		}
1517 		DBG_CALL(Dbg_syms_new(ofl, __sym, sdp));
1518 	}
1519 
1520 	/*
1521 	 * Now display GOT debugging information if required.
1522 	 */
1523 	DBG_CALL(Dbg_got_display(ofl, gottable));
1524 
1525 	/*
1526 	 * Update the section headers information.
1527 	 */
1528 	if (symtab) {
1529 		Shdr *	shdr = ofl->ofl_ossymtab->os_shdr;
1530 
1531 		shdr->sh_info = ofl->ofl_shdrcnt + ofl->ofl_locscnt +
1532 			ofl->ofl_scopecnt + 2;
1533 		/* LINTED */
1534 		shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_osstrtab->os_scn);
1535 		if (symshndx) {
1536 			shdr = ofl->ofl_ossymshndx->os_shdr;
1537 			shdr->sh_link =
1538 				(Word)elf_ndxscn(ofl->ofl_ossymtab->os_scn);
1539 		}
1540 	}
1541 	if (dynsym) {
1542 		Shdr *	shdr = ofl->ofl_osdynsym->os_shdr;
1543 
1544 		shdr->sh_info = ofl->ofl_dynshdrcnt + ofl->ofl_lregsymcnt + 1;
1545 		/* LINTED */
1546 		shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_osdynstr->os_scn);
1547 
1548 		ofl->ofl_oshash->os_shdr->sh_link =
1549 		    /* LINTED */
1550 		    (Word)elf_ndxscn(ofl->ofl_osdynsym->os_scn);
1551 		if (dynshndx) {
1552 			shdr = ofl->ofl_osdynshndx->os_shdr;
1553 			shdr->sh_link =
1554 				(Word)elf_ndxscn(ofl->ofl_osdynsym->os_scn);
1555 		}
1556 	}
1557 
1558 	/*
1559 	 * Used by ld.so.1 only.
1560 	 */
1561 	return (etext);
1562 }
1563 
1564 /*
1565  * Build the dynamic section.
1566  */
1567 static int
1568 update_odynamic(Ofl_desc *ofl)
1569 {
1570 	Listnode	*lnp;
1571 	Ifl_desc	*ifl;
1572 	Sym_desc	*sdp;
1573 	Shdr		*shdr;
1574 	Dyn		*_dyn = (Dyn *)ofl->ofl_osdynamic->os_outdata->d_buf;
1575 	Dyn		*dyn;
1576 	Str_tbl		*dynstr;
1577 	uint_t		stoff;
1578 	Word		flags = ofl->ofl_flags;
1579 
1580 	dynstr = ofl->ofl_dynstrtab;
1581 	ofl->ofl_osdynamic->os_shdr->sh_link =
1582 	    /* LINTED */
1583 	    (Word)elf_ndxscn(ofl->ofl_osdynstr->os_scn);
1584 
1585 	dyn = _dyn;
1586 
1587 	for (LIST_TRAVERSE(&ofl->ofl_sos, lnp, ifl)) {
1588 		if ((ifl->ifl_flags &
1589 		    (FLG_IF_IGNORE | FLG_IF_DEPREQD)) == FLG_IF_IGNORE)
1590 			continue;
1591 
1592 		/*
1593 		 * Create and set up the DT_POSFLAG_1 entry here if required.
1594 		 */
1595 		if ((ifl->ifl_flags & (FLG_IF_LAZYLD|FLG_IF_GRPPRM)) &&
1596 		    (ifl->ifl_flags & (FLG_IF_NEEDED))) {
1597 			dyn->d_tag = DT_POSFLAG_1;
1598 			if (ifl->ifl_flags & FLG_IF_LAZYLD)
1599 				dyn->d_un.d_val = DF_P1_LAZYLOAD;
1600 			if (ifl->ifl_flags & FLG_IF_GRPPRM)
1601 				dyn->d_un.d_val |= DF_P1_GROUPPERM;
1602 			dyn++;
1603 		}
1604 
1605 		if (ifl->ifl_flags & (FLG_IF_NEEDED | FLG_IF_NEEDSTR))
1606 			dyn->d_tag = DT_NEEDED;
1607 		else
1608 			continue;
1609 
1610 		(void) st_setstring(dynstr, ifl->ifl_soname, &stoff);
1611 		dyn->d_un.d_val = stoff;
1612 		/* LINTED */
1613 		ifl->ifl_neededndx = (Half)(((uintptr_t)dyn - (uintptr_t)_dyn) /
1614 		    sizeof (Dyn));
1615 		dyn++;
1616 	}
1617 
1618 	if (ofl->ofl_dtsfltrs) {
1619 		Dfltr_desc *	dftp;
1620 		Aliste		off;
1621 
1622 		for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, off, dftp)) {
1623 			if (dftp->dft_flag == FLG_SY_AUXFLTR)
1624 				dyn->d_tag = DT_SUNW_AUXILIARY;
1625 			else
1626 				dyn->d_tag = DT_SUNW_FILTER;
1627 
1628 			(void) st_setstring(dynstr, dftp->dft_str, &stoff);
1629 			dyn->d_un.d_val = stoff;
1630 			dftp->dft_ndx = (Half)(((uintptr_t)dyn -
1631 			    (uintptr_t)_dyn) / sizeof (Dyn));
1632 			dyn++;
1633 		}
1634 	}
1635 	if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U),
1636 	    SYM_NOHASH, 0, ofl)) != NULL) &&
1637 		sdp->sd_ref == REF_REL_NEED) {
1638 		dyn->d_tag = DT_INIT;
1639 		dyn->d_un.d_ptr = sdp->sd_sym->st_value;
1640 		dyn++;
1641 	}
1642 	if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U),
1643 	    SYM_NOHASH, 0, ofl)) != NULL) &&
1644 		sdp->sd_ref == REF_REL_NEED) {
1645 		dyn->d_tag = DT_FINI;
1646 		dyn->d_un.d_ptr = sdp->sd_sym->st_value;
1647 		dyn++;
1648 	}
1649 	if (ofl->ofl_soname) {
1650 		dyn->d_tag = DT_SONAME;
1651 		(void) st_setstring(dynstr, ofl->ofl_soname, &stoff);
1652 		dyn->d_un.d_val = stoff;
1653 		dyn++;
1654 	}
1655 	if (ofl->ofl_filtees) {
1656 		if (flags & FLG_OF_AUX) {
1657 			dyn->d_tag = DT_AUXILIARY;
1658 		} else {
1659 			dyn->d_tag = DT_FILTER;
1660 		}
1661 		(void) st_setstring(dynstr, ofl->ofl_filtees, &stoff);
1662 		dyn->d_un.d_val = stoff;
1663 		dyn++;
1664 	}
1665 	if (ofl->ofl_rpath) {
1666 		(void) st_setstring(dynstr, ofl->ofl_rpath, &stoff);
1667 		dyn->d_tag = DT_RUNPATH;
1668 		dyn->d_un.d_val = stoff;
1669 		dyn++;
1670 		dyn->d_tag = DT_RPATH;
1671 		dyn->d_un.d_val = stoff;
1672 		dyn++;
1673 	}
1674 	if (ofl->ofl_config) {
1675 		dyn->d_tag = DT_CONFIG;
1676 		(void) st_setstring(dynstr, ofl->ofl_config, &stoff);
1677 		dyn->d_un.d_val = stoff;
1678 		dyn++;
1679 	}
1680 	if (ofl->ofl_depaudit) {
1681 		dyn->d_tag = DT_DEPAUDIT;
1682 		(void) st_setstring(dynstr, ofl->ofl_depaudit, &stoff);
1683 		dyn->d_un.d_val = stoff;
1684 		dyn++;
1685 	}
1686 	if (ofl->ofl_audit) {
1687 		dyn->d_tag = DT_AUDIT;
1688 		(void) st_setstring(dynstr, ofl->ofl_audit, &stoff);
1689 		dyn->d_un.d_val = stoff;
1690 		dyn++;
1691 	}
1692 
1693 	/*
1694 	 * The following DT_* entries do not apply to relocatable objects.
1695 	 */
1696 	if (!(flags & FLG_OF_RELOBJ)) {
1697 
1698 		dyn->d_tag = DT_HASH;
1699 		dyn->d_un.d_ptr = ofl->ofl_oshash->os_shdr->sh_addr;
1700 		dyn++;
1701 
1702 		shdr = ofl->ofl_osdynstr->os_shdr;
1703 		dyn->d_tag = DT_STRTAB;
1704 		dyn->d_un.d_ptr = shdr->sh_addr;
1705 		dyn++;
1706 
1707 		dyn->d_tag = DT_STRSZ;
1708 		dyn->d_un.d_ptr = shdr->sh_size;
1709 		dyn++;
1710 
1711 		shdr = ofl->ofl_osdynsym->os_shdr;
1712 		dyn->d_tag = DT_SYMTAB;
1713 		dyn->d_un.d_ptr = shdr->sh_addr;
1714 		dyn++;
1715 
1716 		dyn->d_tag = DT_SYMENT;
1717 		dyn->d_un.d_ptr = shdr->sh_entsize;
1718 		dyn++;
1719 
1720 		/*
1721 		 * Reserve the DT_CHECKSUM entry.  Its value will be filled in
1722 		 * after the complete image is built.
1723 		 */
1724 		dyn->d_tag = DT_CHECKSUM;
1725 		ofl->ofl_checksum = &dyn->d_un.d_val;
1726 		dyn++;
1727 
1728 		if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) ==
1729 		    FLG_OF_VERDEF) {
1730 			shdr = ofl->ofl_osverdef->os_shdr;
1731 			dyn->d_tag = DT_VERDEF;
1732 			dyn->d_un.d_ptr = shdr->sh_addr;
1733 			dyn++;
1734 			dyn->d_tag = DT_VERDEFNUM;
1735 			dyn->d_un.d_ptr = shdr->sh_info;
1736 			dyn++;
1737 		}
1738 		if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) ==
1739 		    FLG_OF_VERNEED) {
1740 			shdr = ofl->ofl_osverneed->os_shdr;
1741 			dyn->d_tag = DT_VERNEED;
1742 			dyn->d_un.d_ptr = shdr->sh_addr;
1743 			dyn++;
1744 			dyn->d_tag = DT_VERNEEDNUM;
1745 			dyn->d_un.d_ptr = shdr->sh_info;
1746 			dyn++;
1747 		}
1748 		if ((ofl->ofl_flags1 & FLG_OF1_RELCNT) &&
1749 		    ofl->ofl_relocrelcnt) {
1750 			dyn->d_tag = M_REL_DT_COUNT;
1751 			dyn->d_un.d_val = ofl->ofl_relocrelcnt;
1752 			dyn++;
1753 		}
1754 		if (flags & FLG_OF_TEXTREL) {
1755 			/*
1756 			 * Only the presence of this entry is used in this
1757 			 * implementation, not the value stored.
1758 			 */
1759 			dyn->d_tag = DT_TEXTREL;
1760 			dyn->d_un.d_val = 0;
1761 			dyn++;
1762 		}
1763 
1764 		if (ofl->ofl_osfiniarray) {
1765 			shdr = ofl->ofl_osfiniarray->os_shdr;
1766 
1767 			dyn->d_tag = DT_FINI_ARRAY;
1768 			dyn->d_un.d_ptr = shdr->sh_addr;
1769 			dyn++;
1770 
1771 			dyn->d_tag = DT_FINI_ARRAYSZ;
1772 			dyn->d_un.d_val = shdr->sh_size;
1773 			dyn++;
1774 		}
1775 
1776 		if (ofl->ofl_osinitarray) {
1777 			shdr = ofl->ofl_osinitarray->os_shdr;
1778 
1779 			dyn->d_tag = DT_INIT_ARRAY;
1780 			dyn->d_un.d_ptr = shdr->sh_addr;
1781 			dyn++;
1782 
1783 			dyn->d_tag = DT_INIT_ARRAYSZ;
1784 			dyn->d_un.d_val = shdr->sh_size;
1785 			dyn++;
1786 		}
1787 
1788 		if (ofl->ofl_ospreinitarray) {
1789 			shdr = ofl->ofl_ospreinitarray->os_shdr;
1790 
1791 			dyn->d_tag = DT_PREINIT_ARRAY;
1792 			dyn->d_un.d_ptr = shdr->sh_addr;
1793 			dyn++;
1794 
1795 			dyn->d_tag = DT_PREINIT_ARRAYSZ;
1796 			dyn->d_un.d_val = shdr->sh_size;
1797 			dyn++;
1798 		}
1799 
1800 		if (ofl->ofl_pltcnt) {
1801 			shdr =  ofl->ofl_osplt->os_relosdesc->os_shdr;
1802 
1803 			dyn->d_tag = DT_PLTRELSZ;
1804 			dyn->d_un.d_ptr = shdr->sh_size;
1805 			dyn++;
1806 			dyn->d_tag = DT_PLTREL;
1807 			dyn->d_un.d_ptr = M_REL_DT_TYPE;
1808 			dyn++;
1809 			dyn->d_tag = DT_JMPREL;
1810 			dyn->d_un.d_ptr = shdr->sh_addr;
1811 			dyn++;
1812 		}
1813 		if (ofl->ofl_pltpad) {
1814 			shdr =  ofl->ofl_osplt->os_shdr;
1815 
1816 			dyn->d_tag = DT_PLTPAD;
1817 			if (ofl->ofl_pltcnt)
1818 				dyn->d_un.d_ptr = shdr->sh_addr +
1819 					M_PLT_RESERVSZ +
1820 					ofl->ofl_pltcnt * M_PLT_ENTSIZE;
1821 			else
1822 				dyn->d_un.d_ptr = shdr->sh_addr;
1823 			dyn++;
1824 			dyn->d_tag = DT_PLTPADSZ;
1825 			dyn->d_un.d_val = ofl->ofl_pltpad *
1826 				M_PLT_ENTSIZE;
1827 			dyn++;
1828 		}
1829 		if (ofl->ofl_relocsz) {
1830 			dyn->d_tag = M_REL_DT_TYPE;
1831 			dyn->d_un.d_ptr = ofl->ofl_osrelhead->os_shdr->sh_addr;
1832 			dyn++;
1833 			dyn->d_tag = M_REL_DT_SIZE;
1834 			dyn->d_un.d_ptr = ofl->ofl_relocsz;
1835 			dyn++;
1836 			dyn->d_tag = M_REL_DT_ENT;
1837 			if (ofl->ofl_osrelhead->os_shdr->sh_type == SHT_REL)
1838 				dyn->d_un.d_ptr = sizeof (Rel);
1839 			else
1840 				dyn->d_un.d_ptr = sizeof (Rela);
1841 			dyn++;
1842 		}
1843 		if (ofl->ofl_ossyminfo) {
1844 			shdr = ofl->ofl_ossyminfo->os_shdr;
1845 			dyn->d_tag = DT_SYMINFO;
1846 			dyn->d_un.d_ptr = shdr->sh_addr;
1847 			dyn++;
1848 			dyn->d_tag = DT_SYMINSZ;
1849 			dyn->d_un.d_val = shdr->sh_size;
1850 			dyn++;
1851 			dyn->d_tag = DT_SYMINENT;
1852 			dyn->d_un.d_val = sizeof (Syminfo);
1853 			dyn++;
1854 		}
1855 		if (ofl->ofl_osmove) {
1856 			Os_desc *	osp;
1857 
1858 			dyn->d_tag = DT_MOVEENT;
1859 			osp = ofl->ofl_osmove;
1860 			dyn->d_un.d_val = osp->os_shdr->sh_entsize;
1861 			dyn++;
1862 			dyn->d_tag = DT_MOVESZ;
1863 			dyn->d_un.d_val = osp->os_shdr->sh_size;
1864 			dyn++;
1865 			dyn->d_tag = DT_MOVETAB;
1866 			dyn->d_un.d_val = osp->os_shdr->sh_addr;
1867 			dyn++;
1868 		}
1869 		if (ofl->ofl_regsymcnt) {
1870 			int	ndx;
1871 
1872 			for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) {
1873 				if ((sdp = ofl->ofl_regsyms[ndx]) == 0)
1874 					continue;
1875 
1876 				dyn->d_tag = M_DT_REGISTER;
1877 				dyn->d_un.d_val = sdp->sd_symndx;
1878 				dyn++;
1879 			}
1880 		}
1881 
1882 		for (LIST_TRAVERSE(&ofl->ofl_rtldinfo, lnp, sdp)) {
1883 			dyn->d_tag = DT_SUNW_RTLDINF;
1884 			dyn->d_un.d_ptr = sdp->sd_sym->st_value;
1885 			dyn++;
1886 		}
1887 
1888 		if (ofl->ofl_osdynamic->os_sgdesc &&
1889 		    (ofl->ofl_osdynamic->os_sgdesc->sg_phdr.p_flags & PF_W)) {
1890 			if (ofl->ofl_osinterp) {
1891 				dyn->d_tag = DT_DEBUG;
1892 				dyn->d_un.d_ptr = 0;
1893 				dyn++;
1894 			}
1895 
1896 			dyn->d_tag = DT_FEATURE_1;
1897 			if (ofl->ofl_osmove)
1898 				dyn->d_un.d_val = 0;
1899 			else
1900 				dyn->d_un.d_val = DTF_1_PARINIT;
1901 			dyn++;
1902 		}
1903 
1904 		if (ofl->ofl_oscap) {
1905 			dyn->d_tag = DT_SUNW_CAP;
1906 			dyn->d_un.d_val = ofl->ofl_oscap->os_shdr->sh_addr;
1907 			dyn++;
1908 		}
1909 	}
1910 
1911 	if (flags & FLG_OF_SYMBOLIC) {
1912 		dyn->d_tag = DT_SYMBOLIC;
1913 		dyn->d_un.d_val = 0;
1914 		dyn++;
1915 	}
1916 	dyn->d_tag = DT_FLAGS;
1917 	dyn->d_un.d_val = ofl->ofl_dtflags;
1918 	dyn++;
1919 
1920 	/*
1921 	 * If -Bdirect was specified, but some NODIRECT symbols were specified
1922 	 * via a mapfile, or -znodirect was used on the command line, then
1923 	 * clear the DF_1_DIRECT flag.  The resultant object will use per-symbol
1924 	 * direct bindings rather than be enabled for global direct bindings.
1925 	 */
1926 	if (ofl->ofl_flags1 & FLG_OF1_NDIRECT)
1927 		ofl->ofl_dtflags_1 &= ~DF_1_DIRECT;
1928 
1929 	dyn->d_tag = DT_FLAGS_1;
1930 	dyn->d_un.d_val = ofl->ofl_dtflags_1;
1931 	dyn++;
1932 
1933 	ld_mach_update_odynamic(ofl, &dyn);
1934 
1935 	dyn->d_tag = DT_NULL;
1936 	dyn->d_un.d_val = 0;
1937 
1938 	return (1);
1939 }
1940 
1941 /*
1942  * Build the version definition section
1943  */
1944 static int
1945 update_overdef(Ofl_desc *ofl)
1946 {
1947 	Listnode	*lnp1, *lnp2;
1948 	Ver_desc	*vdp, *_vdp;
1949 	Verdef		*vdf, *_vdf;
1950 	int		num = 0;
1951 	Os_desc		*strosp, *symosp;
1952 
1953 	/*
1954 	 * Traverse the version descriptors and update the version structures
1955 	 * to point to the dynstr name in preparation for building the version
1956 	 * section structure.
1957 	 */
1958 	for (LIST_TRAVERSE(&ofl->ofl_verdesc, lnp1, vdp)) {
1959 		Sym_desc *	sdp;
1960 
1961 		if (vdp->vd_flags & VER_FLG_BASE) {
1962 			const char	*name = vdp->vd_name;
1963 			uint_t		stoff;
1964 
1965 			/*
1966 			 * Create a new string table entry to represent the base
1967 			 * version name (there is no corresponding symbol for
1968 			 * this).
1969 			 */
1970 			if (!(ofl->ofl_flags & FLG_OF_DYNAMIC)) {
1971 				(void) st_setstring(ofl->ofl_strtab,
1972 					name, &stoff);
1973 				/* LINTED */
1974 				vdp->vd_name = (const char *)(uintptr_t)stoff;
1975 			} else {
1976 				(void) st_setstring(ofl->ofl_dynstrtab,
1977 					name, &stoff);
1978 				/* LINTED */
1979 				vdp->vd_name = (const char *)(uintptr_t)stoff;
1980 			}
1981 		} else {
1982 			sdp = ld_sym_find(vdp->vd_name, vdp->vd_hash, 0, ofl);
1983 			/* LINTED */
1984 			vdp->vd_name = (const char *)
1985 				(uintptr_t)sdp->sd_sym->st_name;
1986 		}
1987 	}
1988 
1989 	_vdf = vdf = (Verdef *)ofl->ofl_osverdef->os_outdata->d_buf;
1990 
1991 	/*
1992 	 * Traverse the version descriptors and update the version section to
1993 	 * reflect each version and its associated dependencies.
1994 	 */
1995 	for (LIST_TRAVERSE(&ofl->ofl_verdesc, lnp1, vdp)) {
1996 		Half		cnt = 1;
1997 		Verdaux *	vdap, * _vdap;
1998 
1999 		_vdap = vdap = (Verdaux *)(vdf + 1);
2000 
2001 		vdf->vd_version = VER_DEF_CURRENT;
2002 		vdf->vd_flags	= vdp->vd_flags & MSK_VER_USER;
2003 		vdf->vd_ndx	= vdp->vd_ndx;
2004 		vdf->vd_hash	= vdp->vd_hash;
2005 
2006 		/* LINTED */
2007 		vdap->vda_name = (uintptr_t)vdp->vd_name;
2008 		vdap++;
2009 		/* LINTED */
2010 		_vdap->vda_next = (Word)((uintptr_t)vdap - (uintptr_t)_vdap);
2011 
2012 		/*
2013 		 * Traverse this versions dependency list generating the
2014 		 * appropriate version dependency entries.
2015 		 */
2016 		for (LIST_TRAVERSE(&vdp->vd_deps, lnp2, _vdp)) {
2017 			/* LINTED */
2018 			vdap->vda_name = (uintptr_t)_vdp->vd_name;
2019 			_vdap = vdap;
2020 			vdap++, cnt++;
2021 			/* LINTED */
2022 			_vdap->vda_next = (Word)((uintptr_t)vdap -
2023 			    (uintptr_t)_vdap);
2024 		}
2025 		_vdap->vda_next = 0;
2026 
2027 		/*
2028 		 * Record the versions auxiliary array offset and the associated
2029 		 * dependency count.
2030 		 */
2031 		/* LINTED */
2032 		vdf->vd_aux = (Word)((uintptr_t)(vdf + 1) - (uintptr_t)vdf);
2033 		vdf->vd_cnt = cnt;
2034 
2035 		/*
2036 		 * Record the next versions offset and update the version
2037 		 * pointer.  Remember the previous version offset as the very
2038 		 * last structures next pointer should be null.
2039 		 */
2040 		_vdf = vdf;
2041 		vdf = (Verdef *)vdap, num++;
2042 		/* LINTED */
2043 		_vdf->vd_next = (Word)((uintptr_t)vdf - (uintptr_t)_vdf);
2044 	}
2045 	_vdf->vd_next = 0;
2046 
2047 	/*
2048 	 * Record the string table association with the version definition
2049 	 * section, and the symbol table associated with the version symbol
2050 	 * table (the actual contents of the version symbol table are filled
2051 	 * in during symbol update).
2052 	 */
2053 	if ((ofl->ofl_flags & FLG_OF_RELOBJ) ||
2054 	    (ofl->ofl_flags & FLG_OF_STATIC)) {
2055 		strosp = ofl->ofl_osstrtab;
2056 		symosp = ofl->ofl_ossymtab;
2057 	} else {
2058 		strosp = ofl->ofl_osdynstr;
2059 		symosp = ofl->ofl_osdynsym;
2060 	}
2061 	/* LINTED */
2062 	ofl->ofl_osverdef->os_shdr->sh_link = (Word)elf_ndxscn(strosp->os_scn);
2063 	/* LINTED */
2064 	ofl->ofl_osversym->os_shdr->sh_link = (Word)elf_ndxscn(symosp->os_scn);
2065 
2066 	/*
2067 	 * The version definition sections `info' field is used to indicate the
2068 	 * number of entries in this section.
2069 	 */
2070 	ofl->ofl_osverdef->os_shdr->sh_info = num;
2071 
2072 	return (1);
2073 }
2074 
2075 /*
2076  * Build the version needed section
2077  */
2078 static int
2079 update_overneed(Ofl_desc *ofl)
2080 {
2081 	Listnode	*lnp;
2082 	Ifl_desc	*ifl;
2083 	Verneed		*vnd, *_vnd;
2084 	Str_tbl		*dynstr;
2085 	Word		num = 0, cnt = 0;
2086 
2087 	dynstr = ofl->ofl_dynstrtab;
2088 	_vnd = vnd = (Verneed *)ofl->ofl_osverneed->os_outdata->d_buf;
2089 
2090 	/*
2091 	 * Traverse the shared object list looking for dependencies that have
2092 	 * versions defined within them.
2093 	 */
2094 	for (LIST_TRAVERSE(&ofl->ofl_sos, lnp, ifl)) {
2095 		Half		_cnt;
2096 		Vernaux		*_vnap, *vnap;
2097 		Sdf_desc	*sdf = ifl->ifl_sdfdesc;
2098 		uint_t		stoff;
2099 
2100 		if (!(ifl->ifl_flags & FLG_IF_VERNEED))
2101 			continue;
2102 
2103 		vnd->vn_version = VER_NEED_CURRENT;
2104 
2105 		(void) st_setstring(dynstr, ifl->ifl_soname, &stoff);
2106 		vnd->vn_file = stoff;
2107 
2108 		_vnap = vnap = (Vernaux *)(vnd + 1);
2109 
2110 		if (sdf && (sdf->sdf_flags & FLG_SDF_SPECVER)) {
2111 			Sdv_desc *	sdv;
2112 			Listnode *	lnp2;
2113 
2114 			/*
2115 			 * If version needed definitions were specified in
2116 			 * a mapfile ($VERSION=*) then record those
2117 			 * definitions.
2118 			 */
2119 			for (LIST_TRAVERSE(&sdf->sdf_verneed, lnp2, sdv)) {
2120 				(void) st_setstring(dynstr,
2121 					sdv->sdv_name, &stoff);
2122 				vnap->vna_name = stoff;
2123 				/* LINTED */
2124 				vnap->vna_hash = (Word)elf_hash(sdv->sdv_name);
2125 				vnap->vna_flags = 0;
2126 				vnap->vna_other = 0;
2127 				_vnap = vnap;
2128 				vnap++;
2129 				cnt++;
2130 				/* LINTED */
2131 				_vnap->vna_next = (Word)((uintptr_t)vnap -
2132 				    (uintptr_t)_vnap);
2133 			}
2134 		} else {
2135 
2136 			/*
2137 			 * Traverse the version index list recording
2138 			 * each version as a needed dependency.
2139 			 */
2140 			for (cnt = _cnt = 0; _cnt <= ifl->ifl_vercnt;
2141 			    _cnt++) {
2142 				Ver_index *	vip = &ifl->ifl_verndx[_cnt];
2143 
2144 				if (vip->vi_flags & FLG_VER_REFER) {
2145 					(void) st_setstring(dynstr,
2146 						vip->vi_name, &stoff);
2147 					vnap->vna_name = stoff;
2148 					if (vip->vi_desc) {
2149 					    vnap->vna_hash =
2150 						vip->vi_desc->vd_hash;
2151 					    vnap->vna_flags =
2152 						vip->vi_desc->vd_flags;
2153 					} else {
2154 					    vnap->vna_hash = 0;
2155 					    vnap->vna_flags = 0;
2156 					}
2157 					vnap->vna_other = 0;
2158 
2159 					_vnap = vnap;
2160 					vnap++, cnt++;
2161 					_vnap->vna_next =
2162 						/* LINTED */
2163 						(Word)((uintptr_t)vnap -
2164 						    (uintptr_t)_vnap);
2165 				}
2166 			}
2167 		}
2168 		_vnap->vna_next = 0;
2169 
2170 		/*
2171 		 * Record the versions auxiliary array offset and
2172 		 * the associated dependency count.
2173 		 */
2174 		/* LINTED */
2175 		vnd->vn_aux = (Word)((uintptr_t)(vnd + 1) - (uintptr_t)vnd);
2176 		/* LINTED */
2177 		vnd->vn_cnt = (Half)cnt;
2178 
2179 		/*
2180 		 * Record the next versions offset and update the version
2181 		 * pointer.  Remember the previous version offset as the very
2182 		 * last structures next pointer should be null.
2183 		 */
2184 		_vnd = vnd;
2185 		vnd = (Verneed *)vnap, num++;
2186 		/* LINTED */
2187 		_vnd->vn_next = (Word)((uintptr_t)vnd - (uintptr_t)_vnd);
2188 	}
2189 	_vnd->vn_next = 0;
2190 
2191 	/*
2192 	 * Record association on string table section and use the
2193 	 * `info' field to indicate the number of entries in this
2194 	 * section.
2195 	 */
2196 	ofl->ofl_osverneed->os_shdr->sh_link =
2197 	    /* LINTED */
2198 	    (Word)elf_ndxscn(ofl->ofl_osdynstr->os_scn);
2199 	ofl->ofl_osverneed->os_shdr->sh_info = num;
2200 
2201 	return (1);
2202 }
2203 
2204 
2205 /*
2206  * Update syminfo section.
2207  */
2208 static uintptr_t
2209 update_osyminfo(Ofl_desc * ofl)
2210 {
2211 	Os_desc *	symosp, * infosp = ofl->ofl_ossyminfo;
2212 	Syminfo *	sip = infosp->os_outdata->d_buf;
2213 	Shdr *		shdr = infosp->os_shdr;
2214 	char		*strtab;
2215 	Listnode *	lnp;
2216 	Sym_desc *	sdp;
2217 	Aliste		off;
2218 	Sfltr_desc *	sftp;
2219 
2220 	if (ofl->ofl_flags & FLG_OF_RELOBJ) {
2221 		symosp = ofl->ofl_ossymtab;
2222 		strtab = ofl->ofl_osstrtab->os_outdata->d_buf;
2223 	} else {
2224 		symosp = ofl->ofl_osdynsym;
2225 		strtab = ofl->ofl_osdynstr->os_outdata->d_buf;
2226 	}
2227 
2228 	/* LINTED */
2229 	infosp->os_shdr->sh_link = (Word)elf_ndxscn(symosp->os_scn);
2230 	if (ofl->ofl_osdynamic)
2231 		infosp->os_shdr->sh_info =
2232 		    /* LINTED */
2233 		    (Word)elf_ndxscn(ofl->ofl_osdynamic->os_scn);
2234 
2235 	/*
2236 	 * Update any references with the index into the dynamic table.
2237 	 */
2238 	for (LIST_TRAVERSE(&ofl->ofl_syminfsyms, lnp, sdp)) {
2239 		Ifl_desc *	ifl;
2240 		if (sdp->sd_aux && sdp->sd_aux->sa_bindto)
2241 			ifl = sdp->sd_aux->sa_bindto;
2242 		else
2243 			ifl = sdp->sd_file;
2244 		sip[sdp->sd_symndx].si_boundto = ifl->ifl_neededndx;
2245 	}
2246 
2247 	/*
2248 	 * Update any filtee references with the index into the dynamic table.
2249 	 */
2250 	for (ALIST_TRAVERSE(ofl->ofl_symfltrs, off, sftp)) {
2251 		Dfltr_desc *	dftp;
2252 
2253 		/* LINTED */
2254 		dftp = (Dfltr_desc *)((char *)ofl->ofl_dtsfltrs +
2255 		    sftp->sft_off);
2256 		sip[sftp->sft_sdp->sd_symndx].si_boundto = dftp->dft_ndx;
2257 	}
2258 
2259 	/*
2260 	 * Display debugging information about section.
2261 	 */
2262 	DBG_CALL(Dbg_syminfo_title(ofl->ofl_lml));
2263 	if (DBG_ENABLED) {
2264 		Word	_cnt, cnt = shdr->sh_size / shdr->sh_entsize;
2265 		Sym *	symtab = symosp->os_outdata->d_buf;
2266 		Dyn *	dyn;
2267 
2268 		if (ofl->ofl_osdynamic)
2269 			dyn = ofl->ofl_osdynamic->os_outdata->d_buf;
2270 		else
2271 			dyn = 0;
2272 
2273 		for (_cnt = 1; _cnt < cnt; _cnt++) {
2274 			if (sip[_cnt].si_flags || sip[_cnt].si_boundto)
2275 				/* LINTED */
2276 				DBG_CALL(Dbg_syminfo_entry(ofl->ofl_lml, _cnt,
2277 				    &sip[_cnt], &symtab[_cnt], strtab, dyn));
2278 		}
2279 	}
2280 	return (1);
2281 }
2282 
2283 /*
2284  * Build the output elf header.
2285  */
2286 static uintptr_t
2287 update_oehdr(Ofl_desc * ofl)
2288 {
2289 	Ehdr	*ehdr = ofl->ofl_nehdr;
2290 
2291 	/*
2292 	 * If an entry point symbol has already been established (refer
2293 	 * sym_validate()) simply update the elf header entry point with the
2294 	 * symbols value.  If no entry point is defined it will have been filled
2295 	 * with the start address of the first section within the text segment
2296 	 * (refer update_outfile()).
2297 	 */
2298 	if (ofl->ofl_entry)
2299 		ehdr->e_entry =
2300 			((Sym_desc *)(ofl->ofl_entry))->sd_sym->st_value;
2301 
2302 	/*
2303 	 * Note. it may be necessary to update the `e_flags' field in the
2304 	 * machine dependent section.
2305 	 */
2306 	ehdr->e_ident[EI_DATA] = M_DATA;
2307 	ehdr->e_machine = ofl->ofl_dehdr->e_machine;
2308 	ehdr->e_flags = ofl->ofl_dehdr->e_flags;
2309 	ehdr->e_version = ofl->ofl_dehdr->e_version;
2310 
2311 	if (ehdr->e_machine != M_MACH) {
2312 		if (ehdr->e_machine != M_MACHPLUS)
2313 			return (S_ERROR);
2314 		if ((ehdr->e_flags & M_FLAGSPLUS) == 0)
2315 			return (S_ERROR);
2316 	}
2317 
2318 	if (ofl->ofl_flags & FLG_OF_SHAROBJ)
2319 		ehdr->e_type = ET_DYN;
2320 	else if (ofl->ofl_flags & FLG_OF_RELOBJ)
2321 		ehdr->e_type = ET_REL;
2322 	else
2323 		ehdr->e_type = ET_EXEC;
2324 
2325 	return (1);
2326 }
2327 
2328 /*
2329  * Perform move table expansion.
2330  */
2331 static uintptr_t
2332 expand_move(Ofl_desc *ofl, Sym_desc *sdp, Move *u1)
2333 {
2334 	Move		*mv;
2335 	Os_desc		*osp;
2336 	unsigned char	*taddr, *taddr0;
2337 	Sxword		offset;
2338 	int		i;
2339 	Addr		base1;
2340 	unsigned int	stride;
2341 
2342 	osp = ofl->ofl_issunwdata1->is_osdesc;
2343 	base1 = (Addr)(osp->os_shdr->sh_addr +
2344 		ofl->ofl_issunwdata1->is_indata->d_off);
2345 	taddr0 = taddr = osp->os_outdata->d_buf;
2346 	mv = u1;
2347 
2348 	offset = sdp->sd_sym->st_value - base1;
2349 	taddr += offset;
2350 	taddr = taddr + mv->m_poffset;
2351 	for (i = 0; i < mv->m_repeat; i++) {
2352 		/* LINTED */
2353 		DBG_CALL(Dbg_move_expand(ofl->ofl_lml, mv,
2354 		    (Addr)(taddr - taddr0)));
2355 		stride = (unsigned int)mv->m_stride + 1;
2356 		/* LINTED */
2357 		switch (ELF_M_SIZE(mv->m_info)) {
2358 		case 1:
2359 			/* LINTED */
2360 			*taddr = (unsigned char)mv->m_value;
2361 			taddr += stride;
2362 			break;
2363 		case 2:
2364 			/* LINTED */
2365 			*((Half *)taddr) = (Half)mv->m_value;
2366 			taddr += 2*stride;
2367 			break;
2368 		case 4:
2369 			/* LINTED */
2370 			*((Word *)taddr) = (Word)mv->m_value;
2371 			taddr += 4*stride;
2372 			break;
2373 		case 8:
2374 			/* LINTED */
2375 			*((unsigned long long *)taddr) =
2376 				mv->m_value;
2377 			taddr += 8*stride;
2378 			break;
2379 		default:
2380 			/*
2381 			 * Should never come here since this is already
2382 			 * checked at sunwmove_preprocess().
2383 			 */
2384 			return (S_ERROR);
2385 		}
2386 	}
2387 	return (1);
2388 }
2389 
2390 /*
2391  * Update Move sections.
2392  */
2393 static uintptr_t
2394 update_move(Ofl_desc *ofl)
2395 {
2396 	Word		ndx = 0;
2397 	Is_desc *	isp;
2398 	Word		flags = ofl->ofl_flags;
2399 	Move *		mv1, * mv2;
2400 	Listnode *	lnp1;
2401 	Psym_info *	psym;
2402 
2403 	/*
2404 	 * Determine the index of the symbol table that will be referenced by
2405 	 * the relocation entries.
2406 	 */
2407 	if ((flags & (FLG_OF_DYNAMIC|FLG_OF_RELOBJ)) == FLG_OF_DYNAMIC)
2408 		/* LINTED */
2409 		ndx = (Word) elf_ndxscn(ofl->ofl_osdynsym->os_scn);
2410 	else if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ))
2411 		/* LINTED */
2412 		ndx = (Word) elf_ndxscn(ofl->ofl_ossymtab->os_scn);
2413 
2414 	/*
2415 	 * update sh_link and mv pointer for updating move table.
2416 	 */
2417 	if (ofl->ofl_osmove) {
2418 		ofl->ofl_osmove->os_shdr->sh_link = ndx;
2419 		mv1 = (Move *) ofl->ofl_osmove->os_outdata->d_buf;
2420 	}
2421 
2422 	/*
2423 	 * Update symbol entry index
2424 	 */
2425 	for (LIST_TRAVERSE(&ofl->ofl_parsym, lnp1, psym)) {
2426 		Listnode *	lnp2;
2427 		Mv_itm *	mvp;
2428 		Sym_desc 	*sdp;
2429 
2430 		/*
2431 		 * Expand move table
2432 		 */
2433 		if (psym->psym_symd->sd_flags & FLG_SY_PAREXPN) {
2434 			const char	*s;
2435 
2436 			if (ofl->ofl_flags & FLG_OF_STATIC)
2437 				s = MSG_INTL(MSG_PSYM_EXPREASON1);
2438 			else if (ofl->ofl_flags1 & FLG_OF1_NOPARTI)
2439 				s = MSG_INTL(MSG_PSYM_EXPREASON2);
2440 			else
2441 				s = MSG_INTL(MSG_PSYM_EXPREASON3);
2442 			DBG_CALL(Dbg_move_parexpn(ofl->ofl_lml,
2443 			    psym->psym_symd->sd_name, s));
2444 			for (LIST_TRAVERSE(&(psym->psym_mvs), lnp2, mvp)) {
2445 				if ((mvp->mv_flag & FLG_MV_OUTSECT) == 0)
2446 					continue;
2447 				mv2 = mvp->mv_ientry;
2448 				sdp = psym->psym_symd;
2449 				DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 0,
2450 				    mv2, sdp));
2451 				(void) expand_move(ofl, sdp, mv2);
2452 			}
2453 			continue;
2454 		}
2455 
2456 		/*
2457 		 * Process move table
2458 		 */
2459 		DBG_CALL(Dbg_move_outmove(ofl->ofl_lml,
2460 		    psym->psym_symd->sd_name));
2461 		for (LIST_TRAVERSE(&(psym->psym_mvs), lnp2, mvp)) {
2462 			int	idx = 1;
2463 			if ((mvp->mv_flag & FLG_MV_OUTSECT) == 0)
2464 				continue;
2465 			isp = mvp->mv_isp;
2466 			mv2 = mvp->mv_ientry;
2467 			sdp = isp->is_file->ifl_oldndx[
2468 				ELF_M_SYM(mv2->m_info)];
2469 
2470 			DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 0, mv2, sdp));
2471 			*mv1 = *mv2;
2472 			if ((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) {
2473 				if (ELF_ST_BIND(sdp->sd_sym->st_info) ==
2474 				    STB_LOCAL) {
2475 				    Half	symbssndx =
2476 					ofl->ofl_isbss->is_osdesc->os_scnsymndx;
2477 				    mv1->m_info =
2478 					/* LINTED */
2479 					ELF_M_INFO(symbssndx, mv2->m_info);
2480 				    if (ELF_ST_TYPE(sdp->sd_sym->st_info) !=
2481 				    STT_SECTION) {
2482 					mv1->m_poffset = sdp->sd_sym->st_value -
2483 					ofl->ofl_isbss->
2484 						is_osdesc->os_shdr->sh_addr +
2485 					mv2->m_poffset;
2486 				    }
2487 				} else {
2488 				    mv1->m_info =
2489 					/* LINTED */
2490 					ELF_M_INFO(sdp->sd_symndx, mv2->m_info);
2491 				}
2492 			} else {
2493 				Boolean 	isredloc = FALSE;
2494 
2495 				if ((ELF_ST_BIND(sdp->sd_sym->st_info) ==
2496 				    STB_LOCAL) &&
2497 				    (ofl->ofl_flags1 & FLG_OF1_REDLSYM))
2498 					isredloc = TRUE;
2499 
2500 				if (isredloc && !(sdp->sd_psyminfo)) {
2501 					Word symndx =
2502 					sdp->sd_isc->is_osdesc->os_scnsymndx;
2503 					mv1->m_info =
2504 					/* LINTED */
2505 					ELF_M_INFO(symndx, mv2->m_info);
2506 					mv1->m_poffset += sdp->sd_sym->st_value;
2507 				} else {
2508 					if (isredloc)
2509 					    DBG_CALL(Dbg_syms_reduce(ofl,
2510 						DBG_SYM_REDUCE_RETAIN, sdp,
2511 						idx, ofl->ofl_osmove->os_name));
2512 
2513 					mv1->m_info =
2514 					/* LINTED */
2515 					ELF_M_INFO(sdp->sd_symndx, mv2->m_info);
2516 				}
2517 			}
2518 			DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 1, mv1, sdp));
2519 			mv1++;
2520 			idx++;
2521 		}
2522 	}
2523 	return (1);
2524 }
2525 
2526 
2527 /*
2528  * Scan through the SHT_GROUP output sections.  Update their
2529  * sh_link/sh_info fields as well as the section contents.
2530  */
2531 static uintptr_t
2532 update_ogroup(Ofl_desc * ofl)
2533 {
2534 	Listnode	*lnp;
2535 	Os_desc		*osp;
2536 	uintptr_t	error = 0;
2537 
2538 	for (LIST_TRAVERSE(&ofl->ofl_osgroups, lnp, osp)) {
2539 		Is_desc		*isp;
2540 		Ifl_desc	*ifl;
2541 		Shdr		*shdr = osp->os_shdr;
2542 		Sym_desc	*sdp;
2543 		Xword		i, grpcnt;
2544 		Word		*gdata;
2545 
2546 		/*
2547 		 * Since input GROUP sections always create unique
2548 		 * output GROUP sections - we know there is only one
2549 		 * item on the list.
2550 		 */
2551 		isp = (Is_desc *)osp->os_isdescs.head->data;
2552 
2553 		ifl = isp->is_file;
2554 		sdp = ifl->ifl_oldndx[isp->is_shdr->sh_info];
2555 		shdr->sh_link = (Word)elf_ndxscn(ofl->ofl_ossymtab->os_scn);
2556 		shdr->sh_info = sdp->sd_symndx;
2557 
2558 		/*
2559 		 * Scan through the group data section and update
2560 		 * all of the links to new values.
2561 		 */
2562 		grpcnt = shdr->sh_size / shdr->sh_entsize;
2563 		gdata = (Word *)osp->os_outdata->d_buf;
2564 		for (i = 1; i < grpcnt; i++) {
2565 			Is_desc	*	_isp;
2566 			Os_desc	*	_osp;
2567 
2568 			/*
2569 			 * Perform a sanity check that the section index
2570 			 * stored in the SHT_GROUP section is valid
2571 			 * for the file it came from.
2572 			 */
2573 			if (gdata[i] >= ifl->ifl_shnum) {
2574 				eprintf(ofl->ofl_lml, ERR_FATAL,
2575 				    MSG_INTL(MSG_GRP_INVALNDX), isp->is_name,
2576 				    ifl->ifl_name, i, gdata[i]);
2577 				error = S_ERROR;
2578 				gdata[i] = 0;
2579 				continue;
2580 			}
2581 
2582 			_isp = ifl->ifl_isdesc[gdata[i]];
2583 
2584 			/*
2585 			 * If the referenced section didn't make it to the
2586 			 * output file - just zero out the entry.
2587 			 */
2588 			if ((_osp = _isp->is_osdesc) == 0)
2589 				gdata[i] = 0;
2590 			else
2591 				gdata[i] = (Word)elf_ndxscn(_osp->os_scn);
2592 		}
2593 	}
2594 	return (error);
2595 }
2596 
2597 static void
2598 update_ostrtab(Os_desc *osp, Str_tbl *stp)
2599 {
2600 	Elf_Data	*data;
2601 	if (osp == 0)
2602 		return;
2603 
2604 	data = osp->os_outdata;
2605 	assert(data->d_size == st_getstrtab_sz(stp));
2606 	(void) st_setstrbuf(stp, data->d_buf, (uint_t)data->d_size);
2607 }
2608 
2609 /*
2610  * Translate the shdr->sh_{link, info} from its input section value to that
2611  * of the corresponding shdr->sh_{link, info} output section value.
2612  */
2613 static Word
2614 translate_link(Ofl_desc *ofl, Os_desc *osp, Word link, const char *msg)
2615 {
2616 	Is_desc *	isp;
2617 	Ifl_desc *	ifl;
2618 
2619 	/*
2620 	 * Don't translate the special section numbers.
2621 	 */
2622 	if (link >= SHN_LORESERVE)
2623 		return (link);
2624 
2625 	/*
2626 	 * Does this output section translate back to an input file.  If not
2627 	 * then there is no translation to do.  In this case we will assume that
2628 	 * if sh_link has a value, it's the right value.
2629 	 */
2630 	isp = (Is_desc *)osp->os_isdescs.head->data;
2631 	if ((ifl = isp->is_file) == NULL)
2632 		return (link);
2633 
2634 	/*
2635 	 * Sanity check to make sure that the sh_{link, info} value
2636 	 * is within range for the input file.
2637 	 */
2638 	if (link >= ifl->ifl_shnum) {
2639 		eprintf(ofl->ofl_lml, ERR_WARNING, msg, ifl->ifl_name,
2640 		    isp->is_name, EC_XWORD(link));
2641 		return (link);
2642 	}
2643 
2644 	/*
2645 	 * Follow the link to the input section.
2646 	 */
2647 	if ((isp = ifl->ifl_isdesc[link]) == 0)
2648 		return (0);
2649 	if ((osp = isp->is_osdesc) == 0)
2650 		return (0);
2651 
2652 	/* LINTED */
2653 	return ((Word)elf_ndxscn(osp->os_scn));
2654 }
2655 
2656 /*
2657  * Having created all of the necessary sections, segments, and associated
2658  * headers, fill in the program headers and update any other data in the
2659  * output image.  Some general rules:
2660  *
2661  *  o	If an interpretor is required always generate a PT_PHDR entry as
2662  *	well.  It is this entry that triggers the kernel into passing the
2663  *	interpretor an aux vector instead of just a file descriptor.
2664  *
2665  *  o	When generating an image that will be interpreted (ie. a dynamic
2666  *	executable, a shared object, or a static executable that has been
2667  *	provided with an interpretor - weird, but possible), make the initial
2668  *	loadable segment include both the ehdr and phdr[].  Both of these
2669  *	tables are used by the interpretor therefore it seems more intuitive
2670  *	to explicitly defined them as part of the mapped image rather than
2671  *	relying on page rounding by the interpretor to allow their access.
2672  *
2673  *  o	When generating a static image that does not require an interpretor
2674  *	have the first loadable segment indicate the address of the first
2675  *	.section as the start address (things like /kernel/unix and ufsboot
2676  *	expect this behavior).
2677  */
2678 uintptr_t
2679 ld_update_outfile(Ofl_desc *ofl)
2680 {
2681 	Addr		size, etext, vaddr = ofl->ofl_segorigin;
2682 	Listnode	*lnp1, *lnp2;
2683 	Sg_desc		*sgp;
2684 	Os_desc		**ospp, *osp;
2685 	int		phdrndx = 0, capndx = 0, segndx = -1, secndx;
2686 	Ehdr		*ehdr = ofl->ofl_nehdr;
2687 	Shdr		*hshdr;
2688 	Phdr		*_phdr = 0, *dtracephdr = 0;
2689 	Word		phdrsz = ehdr->e_phnum *ehdr->e_phentsize, shscnndx;
2690 	Word		flags = ofl->ofl_flags, ehdrsz = ehdr->e_ehsize;
2691 	Boolean		nobits;
2692 	Off		offset;
2693 	Aliste		off;
2694 
2695 	/*
2696 	 * Loop through the segment descriptors and pick out what we need.
2697 	 */
2698 	DBG_CALL(Dbg_seg_title(ofl->ofl_lml));
2699 	for (LIST_TRAVERSE(&ofl->ofl_segs, lnp1, sgp)) {
2700 		Phdr *	phdr = &(sgp->sg_phdr);
2701 		Xword 	p_align;
2702 
2703 		segndx++;
2704 
2705 		/*
2706 		 * If an interpreter is required generate a PT_INTERP and
2707 		 * PT_PHDR program header entry.  The PT_PHDR entry describes
2708 		 * the program header table itself.  This information will be
2709 		 * passed via the aux vector to the interpreter (ld.so.1).
2710 		 * The program header array is actually part of the first
2711 		 * loadable segment (and the PT_PHDR entry is the first entry),
2712 		 * therefore its virtual address isn't known until the first
2713 		 * loadable segment is processed.
2714 		 */
2715 		if (phdr->p_type == PT_PHDR) {
2716 			if (ofl->ofl_osinterp) {
2717 				phdr->p_offset = ehdr->e_phoff;
2718 				phdr->p_filesz = phdr->p_memsz = phdrsz;
2719 				DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
2720 				ofl->ofl_phdr[phdrndx++] = *phdr;
2721 			}
2722 			continue;
2723 		}
2724 		if (phdr->p_type == PT_INTERP) {
2725 			if (ofl->ofl_osinterp) {
2726 				Shdr *	shdr = ofl->ofl_osinterp->os_shdr;
2727 
2728 				phdr->p_vaddr = phdr->p_memsz = 0;
2729 				phdr->p_offset = shdr->sh_offset;
2730 				phdr->p_filesz = shdr->sh_size;
2731 				DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
2732 				ofl->ofl_phdr[phdrndx++] = *phdr;
2733 			}
2734 			continue;
2735 		}
2736 
2737 		/*
2738 		 * If we are creating a PT_SUNWDTRACE segment,
2739 		 * just remember where the program header is.
2740 		 *
2741 		 * It's actual values will be assigned after
2742 		 * update_osym() has completed and the symbol
2743 		 * table addresses have been udpated.
2744 		 */
2745 		if (phdr->p_type == PT_SUNWDTRACE) {
2746 			if ((ofl->ofl_dtracesym) &&
2747 			    ((flags & FLG_OF_RELOBJ) == 0)) {
2748 				dtracephdr = &ofl->ofl_phdr[phdrndx];
2749 				ofl->ofl_phdr[phdrndx++] = *phdr;
2750 			}
2751 			continue;
2752 		}
2753 
2754 		/*
2755 		 * If a hardware/software capabilities section is required,
2756 		 * generate the PT_SUNWCAP header.  Note, as this comes before
2757 		 * the first loadable segment, we don't yet know its real
2758 		 * virtual address.  This is updated later.
2759 		 */
2760 		if (phdr->p_type == PT_SUNWCAP) {
2761 			if (ofl->ofl_oscap) {
2762 				Shdr *	shdr = ofl->ofl_oscap->os_shdr;
2763 
2764 				phdr->p_vaddr = shdr->sh_addr;
2765 				phdr->p_offset = shdr->sh_offset;
2766 				phdr->p_filesz = shdr->sh_size;
2767 				phdr->p_flags = PF_R;
2768 				DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
2769 				capndx = phdrndx;
2770 				ofl->ofl_phdr[phdrndx++] = *phdr;
2771 			}
2772 			continue;
2773 		}
2774 
2775 		/*
2776 		 * As the dynamic program header occurs after the loadable
2777 		 * headers in the segment descriptor table, all the address
2778 		 * information for the .dynamic output section will have been
2779 		 * figured out by now.
2780 		 */
2781 		if (phdr->p_type == PT_DYNAMIC) {
2782 			if ((flags & (FLG_OF_DYNAMIC | FLG_OF_RELOBJ)) ==
2783 			    FLG_OF_DYNAMIC) {
2784 				Shdr *	shdr = ofl->ofl_osdynamic->os_shdr;
2785 
2786 				phdr->p_vaddr = shdr->sh_addr;
2787 				phdr->p_offset = shdr->sh_offset;
2788 				phdr->p_filesz = shdr->sh_size;
2789 				phdr->p_flags = M_DATASEG_PERM;
2790 				DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
2791 				ofl->ofl_phdr[phdrndx++] = *phdr;
2792 			}
2793 			continue;
2794 		}
2795 #if	defined(__x86) && defined(_ELF64)
2796 		if (phdr->p_type == PT_SUNW_UNWIND) {
2797 			Shdr	    *shdr;
2798 			if (ofl->ofl_unwindhdr == 0)
2799 				continue;
2800 			shdr = ofl->ofl_unwindhdr->os_shdr;
2801 
2802 			phdr->p_flags = PF_R;
2803 			phdr->p_vaddr = shdr->sh_addr;
2804 			phdr->p_memsz = shdr->sh_size;
2805 			phdr->p_filesz = shdr->sh_size;
2806 			phdr->p_offset = shdr->sh_offset;
2807 			phdr->p_align = shdr->sh_addralign;
2808 			phdr->p_paddr = 0;
2809 			ofl->ofl_phdr[phdrndx++] = *phdr;
2810 			continue;
2811 		}
2812 #endif
2813 		if (phdr->p_type == PT_TLS) {
2814 			Os_desc	*tlsosp;
2815 			Shdr	*firstshdr = 0, *lastfilshdr, *lastmemshdr;
2816 
2817 			if (ofl->ofl_ostlsseg.head == NULL)
2818 				continue;
2819 
2820 			for (LIST_TRAVERSE(&ofl->ofl_ostlsseg, lnp2, tlsosp)) {
2821 				Shdr	*tlsshdr = tlsosp->os_shdr;
2822 
2823 				if (firstshdr == 0) {
2824 					firstshdr = lastfilshdr = lastmemshdr =
2825 					    tlsosp->os_shdr;
2826 					continue;
2827 				}
2828 
2829 				if (tlsshdr->sh_type == SHT_NOBITS)
2830 					lastmemshdr = tlsshdr;
2831 				else
2832 					lastfilshdr = tlsshdr;
2833 			}
2834 
2835 			phdr->p_flags = PF_R | PF_W;
2836 			phdr->p_vaddr = firstshdr->sh_addr;
2837 			phdr->p_offset = firstshdr->sh_offset;
2838 			phdr->p_align = firstshdr->sh_addralign;
2839 			phdr->p_filesz = lastfilshdr->sh_offset +
2840 			    lastfilshdr->sh_size - phdr->p_offset;
2841 			phdr->p_memsz = lastmemshdr->sh_offset +
2842 			    lastmemshdr->sh_size - phdr->p_offset;
2843 
2844 			DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
2845 
2846 			ofl->ofl_tlsphdr = phdr;
2847 			ofl->ofl_phdr[phdrndx++] = *phdr;
2848 			continue;
2849 		}
2850 
2851 		/*
2852 		 * If this is an empty segment declaration, it will occur after
2853 		 * all other loadable segments, make sure the previous segment
2854 		 * doesn't overlap. We do not do the check if we are generating
2855 		 * a relocatable file.
2856 		 */
2857 		if (!(ofl->ofl_flags & FLG_OF_RELOBJ) &&
2858 		    (sgp->sg_flags & FLG_SG_EMPTY)) {
2859 			int i;
2860 			Addr	v_e;
2861 
2862 			vaddr = phdr->p_vaddr;
2863 			phdr->p_memsz = sgp->sg_length;
2864 			DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
2865 			ofl->ofl_phdr[phdrndx++] = *phdr;
2866 
2867 			if (phdr->p_type != PT_LOAD)
2868 				continue;
2869 
2870 			v_e = vaddr + phdr->p_memsz;
2871 			/*
2872 			 * Check overlaps
2873 			 */
2874 			for (i = 0; i < phdrndx - 1; i++) {
2875 				Addr 	p_s = (ofl->ofl_phdr[i]).p_vaddr;
2876 				Addr 	p_e;
2877 
2878 				if ((ofl->ofl_phdr[i]).p_type != PT_LOAD)
2879 					continue;
2880 
2881 				p_e = p_s + (ofl->ofl_phdr[i]).p_memsz;
2882 				if (((p_s <= vaddr) && (p_e > vaddr)) ||
2883 				    ((vaddr <= p_s) && (v_e > p_s)))
2884 					eprintf(ofl->ofl_lml, ERR_WARNING,
2885 					    MSG_INTL(MSG_UPD_SEGOVERLAP),
2886 					    ofl->ofl_name, EC_ADDR(p_e),
2887 					    sgp->sg_name, EC_ADDR(vaddr));
2888 			}
2889 			continue;
2890 		}
2891 
2892 		/*
2893 		 * Having processed any of the special program headers any
2894 		 * remaining headers will be built to express individual
2895 		 * segments.  Segments are only built if they have output
2896 		 * section descriptors associated with them (ie. some form of
2897 		 * input section has been matched to this segment).
2898 		 */
2899 		if (sgp->sg_osdescs == NULL)
2900 			continue;
2901 
2902 		/*
2903 		 * Determine the segments offset and size from the section
2904 		 * information provided from elf_update().
2905 		 * Allow for multiple NOBITS sections.
2906 		 */
2907 		osp = (Os_desc *)sgp->sg_osdescs->al_data[0];
2908 		hshdr = osp->os_shdr;
2909 
2910 		phdr->p_filesz = 0;
2911 		phdr->p_memsz = 0;
2912 		phdr->p_offset = offset = hshdr->sh_offset;
2913 
2914 		nobits = ((hshdr->sh_type == SHT_NOBITS) &&
2915 		    ((sgp->sg_flags & FLG_SG_PHREQ) == 0));
2916 
2917 		for (ALIST_TRAVERSE(sgp->sg_osdescs, off, ospp)) {
2918 			Shdr	*shdr;
2919 
2920 			osp = *ospp;
2921 			shdr = osp->os_shdr;
2922 
2923 			p_align = 0;
2924 			if (shdr->sh_addralign > p_align)
2925 				p_align = shdr->sh_addralign;
2926 
2927 			offset = (Off)S_ROUND(offset, shdr->sh_addralign);
2928 			offset += shdr->sh_size;
2929 
2930 			if (shdr->sh_type != SHT_NOBITS) {
2931 				if (nobits) {
2932 					eprintf(ofl->ofl_lml, ERR_FATAL,
2933 					    MSG_INTL(MSG_UPD_NOBITS));
2934 					return (S_ERROR);
2935 				}
2936 				phdr->p_filesz = offset - phdr->p_offset;
2937 			} else if ((sgp->sg_flags & FLG_SG_PHREQ) == 0)
2938 				nobits = TRUE;
2939 		}
2940 		phdr->p_memsz = offset - hshdr->sh_offset;
2941 
2942 		/*
2943 		 * If this is PT_SUNWBSS, set alignment
2944 		 */
2945 		if (phdr->p_type == PT_SUNWBSS)
2946 			phdr->p_align = p_align;
2947 
2948 		/*
2949 		 * If this is the first loadable segment of a dynamic object,
2950 		 * or an interpretor has been specified (a static object built
2951 		 * with an interpretor will still be given a PT_HDR entry), then
2952 		 * compensate for the elf header and program header array.  Both
2953 		 * of these are actually part of the loadable segment as they
2954 		 * may be inspected by the interpretor.  Adjust the segments
2955 		 * size and offset accordingly.
2956 		 */
2957 		if ((_phdr == 0) && (phdr->p_type == PT_LOAD) &&
2958 		    ((ofl->ofl_osinterp) || (flags & FLG_OF_DYNAMIC)) &&
2959 		    (!(ofl->ofl_dtflags_1 & DF_1_NOHDR))) {
2960 			size = (Addr)S_ROUND((phdrsz + ehdrsz),
2961 			    hshdr->sh_addralign);
2962 			phdr->p_offset -= size;
2963 			phdr->p_filesz += size;
2964 			phdr->p_memsz += size;
2965 		}
2966 
2967 		/*
2968 		 * If a segment size symbol is required (specified via a
2969 		 * mapfile) update its value.
2970 		 */
2971 		if (sgp->sg_sizesym != NULL)
2972 			sgp->sg_sizesym->sd_sym->st_value = phdr->p_memsz;
2973 
2974 		/*
2975 		 * If no file content has been assigned to this segment (it
2976 		 * only contains no-bits sections), then reset the offset for
2977 		 * consistency.
2978 		 */
2979 		if (phdr->p_filesz == 0)
2980 			phdr->p_offset = 0;
2981 
2982 		/*
2983 		 * If a virtual address has been specified for this segment
2984 		 * (presumably from a map file) use it and make sure the
2985 		 * previous segment does not run into this segment.
2986 		 */
2987 		if ((phdr->p_type == PT_LOAD) ||
2988 		    (phdr->p_type == PT_SUNWBSS)) {
2989 			if ((sgp->sg_flags & FLG_SG_VADDR)) {
2990 				if (_phdr && (vaddr > phdr->p_vaddr) &&
2991 				    (phdr->p_type == PT_LOAD))
2992 					eprintf(ofl->ofl_lml, ERR_WARNING,
2993 					    MSG_INTL(MSG_UPD_SEGOVERLAP),
2994 					    ofl->ofl_name, EC_ADDR(vaddr),
2995 					    sgp->sg_name,
2996 					    EC_ADDR(phdr->p_vaddr));
2997 				vaddr = phdr->p_vaddr;
2998 				phdr->p_align = 0;
2999 			} else {
3000 				vaddr = phdr->p_vaddr =
3001 				    (Addr)S_ROUND(vaddr, phdr->p_align);
3002 			}
3003 		}
3004 
3005 		/*
3006 		 * Adjust the address offset and p_align if needed.
3007 		 */
3008 		if (!((ofl->ofl_flags1 & FLG_OF1_VADDR) ||
3009 			(ofl->ofl_dtflags_1 & DF_1_NOHDR))) {
3010 			if (phdr->p_align != 0)
3011 				vaddr += phdr->p_offset % phdr->p_align;
3012 			else
3013 				vaddr += phdr->p_offset;
3014 			phdr->p_vaddr = vaddr;
3015 		}
3016 
3017 		/*
3018 		 * If an interpreter is required set the virtual address of the
3019 		 * PT_PHDR program header now that we know the virtual address
3020 		 * of the loadable segment that contains it.  Update the
3021 		 * PT_SUNWCAP header similarly.
3022 		 */
3023 		if ((_phdr == 0) && (phdr->p_type == PT_LOAD)) {
3024 			_phdr = phdr;
3025 
3026 			if (!(ofl->ofl_dtflags_1 & DF_1_NOHDR)) {
3027 				if (ofl->ofl_osinterp)
3028 					ofl->ofl_phdr[0].p_vaddr =
3029 					    vaddr + ehdrsz;
3030 
3031 				if (ofl->ofl_oscap)
3032 				    ofl->ofl_phdr[capndx].p_vaddr = vaddr +
3033 					ofl->ofl_phdr[capndx].p_offset;
3034 
3035 				/*
3036 				 * Finally, if we're creating a dynamic object
3037 				 * (or a static object in which an interpretor
3038 				 * is specified) update the vaddr to reflect
3039 				 * the address of the first section within this
3040 				 * segment.
3041 				 */
3042 				if ((ofl->ofl_osinterp) ||
3043 				    (flags & FLG_OF_DYNAMIC))
3044 					vaddr += size;
3045 			} else {
3046 				/*
3047 				 * If the DF_1_NOHDR flag was set, PT_PHDR
3048 				 * will not be part of any loadable segment.
3049 				 */
3050 				ofl->ofl_phdr[0].p_vaddr = 0;
3051 				ofl->ofl_phdr[0].p_memsz = 0;
3052 				ofl->ofl_phdr[0].p_flags = 0;
3053 			}
3054 		}
3055 
3056 		/*
3057 		 * Save the address of the first executable section for default
3058 		 * use as the execution entry point.  This may get overridden in
3059 		 * update_oehdr().
3060 		 */
3061 		if (!(flags & FLG_OF_RELOBJ) && !(ehdr->e_entry) &&
3062 		    (phdr->p_flags & PF_X))
3063 			ehdr->e_entry = vaddr;
3064 
3065 		DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
3066 
3067 		/*
3068 		 * Traverse the output section descriptors for this segment so
3069 		 * that we can update the section headers addresses.  We've
3070 		 * calculated the virtual address of the initial section within
3071 		 * this segment, so each successive section can be calculated
3072 		 * based on their offsets from each other.
3073 		 */
3074 		secndx = 0;
3075 		hshdr = 0;
3076 		for (ALIST_TRAVERSE(sgp->sg_osdescs, off, ospp)) {
3077 			Shdr	*shdr;
3078 
3079 			osp = *ospp;
3080 			shdr = osp->os_shdr;
3081 
3082 			if (shdr->sh_link)
3083 			    shdr->sh_link =
3084 				translate_link(ofl, osp, shdr->sh_link,
3085 				MSG_INTL(MSG_FIL_INVSHLINK));
3086 
3087 			if (shdr->sh_info && (shdr->sh_flags & SHF_INFO_LINK))
3088 			    shdr->sh_info =
3089 				translate_link(ofl, osp, shdr->sh_info,
3090 				MSG_INTL(MSG_FIL_INVSHINFO));
3091 
3092 			if (!(flags & FLG_OF_RELOBJ) &&
3093 			    (phdr->p_type == PT_LOAD) ||
3094 			    (phdr->p_type == PT_SUNWBSS)) {
3095 				if (hshdr)
3096 					vaddr += (shdr->sh_offset -
3097 					    hshdr->sh_offset);
3098 
3099 				shdr->sh_addr = vaddr;
3100 				hshdr = shdr;
3101 			}
3102 
3103 			DBG_CALL(Dbg_seg_os(ofl, osp, secndx));
3104 			secndx++;
3105 		}
3106 
3107 		/*
3108 		 * Establish the virtual address of the end of the last section
3109 		 * in this segment so that the next segments offset can be
3110 		 * calculated from this.
3111 		 */
3112 		if (hshdr)
3113 			vaddr += hshdr->sh_size;
3114 
3115 		/*
3116 		 * Output sections for this segment complete.  Adjust the
3117 		 * virtual offset for the last sections size, and make sure we
3118 		 * haven't exceeded any maximum segment length specification.
3119 		 */
3120 		if ((sgp->sg_length != 0) && (sgp->sg_length < phdr->p_memsz)) {
3121 			eprintf(ofl->ofl_lml, ERR_FATAL,
3122 			    MSG_INTL(MSG_UPD_LARGSIZE), ofl->ofl_name,
3123 			    sgp->sg_name, EC_XWORD(phdr->p_memsz),
3124 			    EC_XWORD(sgp->sg_length));
3125 			return (S_ERROR);
3126 		}
3127 
3128 		if (phdr->p_type == PT_NOTE) {
3129 			phdr->p_vaddr = 0;
3130 			phdr->p_paddr = 0;
3131 			phdr->p_align = 0;
3132 			phdr->p_memsz = 0;
3133 		}
3134 		if ((phdr->p_type != PT_NULL) && !(flags & FLG_OF_RELOBJ))
3135 			ofl->ofl_phdr[phdrndx++] = *phdr;
3136 	}
3137 
3138 	/*
3139 	 * Update any new output sections.  When building the initial output
3140 	 * image, a number of sections were created but left uninitialized (eg.
3141 	 * .dynsym, .dynstr, .symtab, .symtab, etc.).  Here we update these
3142 	 * sections with the appropriate data.  Other sections may still be
3143 	 * modified via reloc_process().
3144 	 *
3145 	 * Copy the interpretor name into the .interp section.
3146 	 */
3147 	if (ofl->ofl_interp)
3148 		(void) strcpy((char *)ofl->ofl_osinterp->os_outdata->d_buf,
3149 		    ofl->ofl_interp);
3150 
3151 	/*
3152 	 * Update the .shstrtab, .strtab and .dynstr sections.
3153 	 */
3154 	update_ostrtab(ofl->ofl_osshstrtab, ofl->ofl_shdrsttab);
3155 	update_ostrtab(ofl->ofl_osstrtab, ofl->ofl_strtab);
3156 	update_ostrtab(ofl->ofl_osdynstr, ofl->ofl_dynstrtab);
3157 
3158 	/*
3159 	 * Build any output symbol tables, the symbols information is copied
3160 	 * and updated into the new output image.
3161 	 */
3162 	if ((etext = update_osym(ofl)) == (Addr)S_ERROR)
3163 		return (S_ERROR);
3164 
3165 	/*
3166 	 * If we have a PT_SUNWDTRACE phdr, update it now with the address of
3167 	 * the symbol.  It's only now been updated via update_sym().
3168 	 */
3169 	if (dtracephdr && ofl->ofl_dtracesym) {
3170 		Phdr		*pphdr;
3171 		Sym_desc	*sdp = ofl->ofl_dtracesym;
3172 
3173 		dtracephdr->p_vaddr = sdp->sd_sym->st_value;
3174 		dtracephdr->p_memsz = sdp->sd_sym->st_size;
3175 
3176 		/*
3177 		 * Take permisions of the segment the symbol is associated with.
3178 		 */
3179 		pphdr = &sdp->sd_isc->is_osdesc->os_sgdesc->sg_phdr;
3180 		assert(pphdr);
3181 		dtracephdr->p_flags = pphdr->p_flags;
3182 	}
3183 
3184 	/*
3185 	 * Update the GROUP sections.
3186 	 */
3187 	if (update_ogroup(ofl) == S_ERROR)
3188 		return (S_ERROR);
3189 
3190 	/*
3191 	 * Update Move Table.
3192 	 */
3193 	if (ofl->ofl_osmove || ofl->ofl_issunwdata1) {
3194 		if (update_move(ofl) == S_ERROR)
3195 			return (S_ERROR);
3196 	}
3197 
3198 	/*
3199 	 * Build any output headers, version information, dynamic structure and
3200 	 * syminfo structure.
3201 	 */
3202 	if (update_oehdr(ofl) == S_ERROR)
3203 		return (S_ERROR);
3204 	if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) == FLG_OF_VERDEF)
3205 		if (update_overdef(ofl) == S_ERROR)
3206 			return (S_ERROR);
3207 	if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) == FLG_OF_VERNEED)
3208 		if (update_overneed(ofl) == S_ERROR)
3209 			return (S_ERROR);
3210 	if (flags & FLG_OF_DYNAMIC) {
3211 		if (update_odynamic(ofl) == S_ERROR)
3212 			return (S_ERROR);
3213 		if (ofl->ofl_ossyminfo)
3214 			if (update_osyminfo(ofl) == S_ERROR)
3215 				return (S_ERROR);
3216 	}
3217 
3218 	/*
3219 	 * Emit Strtab diagnostics.
3220 	 */
3221 	DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osshstrtab,
3222 	    ofl->ofl_shdrsttab));
3223 	DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osstrtab,
3224 	    ofl->ofl_strtab));
3225 	DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osdynstr,
3226 	    ofl->ofl_dynstrtab));
3227 
3228 	/*
3229 	 * Initialize the section headers string table index within the elf
3230 	 * header.
3231 	 */
3232 	/* LINTED */
3233 	if ((shscnndx = elf_ndxscn(ofl->ofl_osshstrtab->os_scn)) <
3234 	    SHN_LORESERVE) {
3235 		ofl->ofl_nehdr->e_shstrndx =
3236 		    /* LINTED */
3237 		    (Half)shscnndx;
3238 	} else {
3239 		/*
3240 		 * If the STRTAB section index doesn't fit into
3241 		 * e_shstrndx, then we store it in 'shdr[0].st_link'.
3242 		 */
3243 		Elf_Scn	*scn;
3244 		Shdr	*shdr0;
3245 
3246 		if ((scn = elf_getscn(ofl->ofl_elf, 0)) == NULL) {
3247 			eprintf(ofl->ofl_lml, ERR_ELF,
3248 			    MSG_INTL(MSG_ELF_GETSCN), ofl->ofl_name);
3249 			return (S_ERROR);
3250 		}
3251 		if ((shdr0 = elf_getshdr(scn)) == NULL) {
3252 			eprintf(ofl->ofl_lml, ERR_ELF,
3253 			    MSG_INTL(MSG_ELF_GETSHDR), ofl->ofl_name);
3254 			return (S_ERROR);
3255 		}
3256 		ofl->ofl_nehdr->e_shstrndx = SHN_XINDEX;
3257 		shdr0->sh_link = shscnndx;
3258 	}
3259 
3260 	return ((uintptr_t)etext);
3261 }
3262