update.c revision 1682:79d68fa5aedd
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 */
46static int
47sym_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 */
59static Addr
60update_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 */
1567static int
1568update_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 */
1944static int
1945update_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 */
2078static int
2079update_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 */
2208static uintptr_t
2209update_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 */
2286static uintptr_t
2287update_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 */
2331static uintptr_t
2332expand_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 */
2393static uintptr_t
2394update_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 */
2531static uintptr_t
2532update_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
2597static void
2598update_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 */
2613static Word
2614translate_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 */
2678uintptr_t
2679ld_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_flags1 & FLG_OF1_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_NOHDR | FLG_OF1_VADDR))) {
3009			if (phdr->p_align != 0)
3010				vaddr += phdr->p_offset % phdr->p_align;
3011			else
3012				vaddr += phdr->p_offset;
3013			phdr->p_vaddr = vaddr;
3014		}
3015
3016		/*
3017		 * If an interpreter is required set the virtual address of the
3018		 * PT_PHDR program header now that we know the virtual address
3019		 * of the loadable segment that contains it.  Update the
3020		 * PT_SUNWCAP header similarly.
3021		 */
3022		if ((_phdr == 0) && (phdr->p_type == PT_LOAD)) {
3023			_phdr = phdr;
3024
3025			if (!(ofl->ofl_flags1 & FLG_OF1_NOHDR)) {
3026				if (ofl->ofl_osinterp)
3027					ofl->ofl_phdr[0].p_vaddr =
3028					    vaddr + ehdrsz;
3029
3030				if (ofl->ofl_oscap)
3031				    ofl->ofl_phdr[capndx].p_vaddr = vaddr +
3032					ofl->ofl_phdr[capndx].p_offset;
3033
3034				/*
3035				 * Finally, if we're creating a dynamic object
3036				 * (or a static object in which an interpretor
3037				 * is specified) update the vaddr to reflect
3038				 * the address of the first section within this
3039				 * segment.
3040				 */
3041				if ((ofl->ofl_osinterp) ||
3042				    (flags & FLG_OF_DYNAMIC))
3043					vaddr += size;
3044			} else {
3045				/*
3046				 * If the FLG_OF1_NOHDR flag was set, PT_PHDR
3047				 * will not be part of any loadable segment.
3048				 */
3049				ofl->ofl_phdr[0].p_vaddr = 0;
3050				ofl->ofl_phdr[0].p_memsz = 0;
3051				ofl->ofl_phdr[0].p_flags = 0;
3052			}
3053		}
3054
3055		/*
3056		 * Save the address of the first executable section for default
3057		 * use as the execution entry point.  This may get overridden in
3058		 * update_oehdr().
3059		 */
3060		if (!(flags & FLG_OF_RELOBJ) && !(ehdr->e_entry) &&
3061		    (phdr->p_flags & PF_X))
3062			ehdr->e_entry = vaddr;
3063
3064		DBG_CALL(Dbg_seg_entry(ofl, segndx, sgp));
3065
3066		/*
3067		 * Traverse the output section descriptors for this segment so
3068		 * that we can update the section headers addresses.  We've
3069		 * calculated the virtual address of the initial section within
3070		 * this segment, so each successive section can be calculated
3071		 * based on their offsets from each other.
3072		 */
3073		secndx = 0;
3074		hshdr = 0;
3075		for (ALIST_TRAVERSE(sgp->sg_osdescs, off, ospp)) {
3076			Shdr	*shdr;
3077
3078			osp = *ospp;
3079			shdr = osp->os_shdr;
3080
3081			if (shdr->sh_link)
3082			    shdr->sh_link =
3083				translate_link(ofl, osp, shdr->sh_link,
3084				MSG_INTL(MSG_FIL_INVSHLINK));
3085
3086			if (shdr->sh_info && (shdr->sh_flags & SHF_INFO_LINK))
3087			    shdr->sh_info =
3088				translate_link(ofl, osp, shdr->sh_info,
3089				MSG_INTL(MSG_FIL_INVSHINFO));
3090
3091			if (!(flags & FLG_OF_RELOBJ) &&
3092			    (phdr->p_type == PT_LOAD) ||
3093			    (phdr->p_type == PT_SUNWBSS)) {
3094				if (hshdr)
3095					vaddr += (shdr->sh_offset -
3096					    hshdr->sh_offset);
3097
3098				shdr->sh_addr = vaddr;
3099				hshdr = shdr;
3100			}
3101
3102			DBG_CALL(Dbg_seg_os(ofl, osp, secndx));
3103			secndx++;
3104		}
3105
3106		/*
3107		 * Establish the virtual address of the end of the last section
3108		 * in this segment so that the next segments offset can be
3109		 * calculated from this.
3110		 */
3111		if (hshdr)
3112			vaddr += hshdr->sh_size;
3113
3114		/*
3115		 * Output sections for this segment complete.  Adjust the
3116		 * virtual offset for the last sections size, and make sure we
3117		 * haven't exceeded any maximum segment length specification.
3118		 */
3119		if ((sgp->sg_length != 0) && (sgp->sg_length < phdr->p_memsz)) {
3120			eprintf(ofl->ofl_lml, ERR_FATAL,
3121			    MSG_INTL(MSG_UPD_LARGSIZE), ofl->ofl_name,
3122			    sgp->sg_name, EC_XWORD(phdr->p_memsz),
3123			    EC_XWORD(sgp->sg_length));
3124			return (S_ERROR);
3125		}
3126
3127		if (phdr->p_type == PT_NOTE) {
3128			phdr->p_vaddr = 0;
3129			phdr->p_paddr = 0;
3130			phdr->p_align = 0;
3131			phdr->p_memsz = 0;
3132		}
3133		if ((phdr->p_type != PT_NULL) && !(flags & FLG_OF_RELOBJ))
3134			ofl->ofl_phdr[phdrndx++] = *phdr;
3135	}
3136
3137	/*
3138	 * Update any new output sections.  When building the initial output
3139	 * image, a number of sections were created but left uninitialized (eg.
3140	 * .dynsym, .dynstr, .symtab, .symtab, etc.).  Here we update these
3141	 * sections with the appropriate data.  Other sections may still be
3142	 * modified via reloc_process().
3143	 *
3144	 * Copy the interpretor name into the .interp section.
3145	 */
3146	if (ofl->ofl_interp)
3147		(void) strcpy((char *)ofl->ofl_osinterp->os_outdata->d_buf,
3148		    ofl->ofl_interp);
3149
3150	/*
3151	 * Update the .shstrtab, .strtab and .dynstr sections.
3152	 */
3153	update_ostrtab(ofl->ofl_osshstrtab, ofl->ofl_shdrsttab);
3154	update_ostrtab(ofl->ofl_osstrtab, ofl->ofl_strtab);
3155	update_ostrtab(ofl->ofl_osdynstr, ofl->ofl_dynstrtab);
3156
3157	/*
3158	 * Build any output symbol tables, the symbols information is copied
3159	 * and updated into the new output image.
3160	 */
3161	if ((etext = update_osym(ofl)) == (Addr)S_ERROR)
3162		return (S_ERROR);
3163
3164	/*
3165	 * If we have a PT_SUNWDTRACE phdr, update it now with the address of
3166	 * the symbol.  It's only now been updated via update_sym().
3167	 */
3168	if (dtracephdr && ofl->ofl_dtracesym) {
3169		Phdr		*pphdr;
3170		Sym_desc	*sdp = ofl->ofl_dtracesym;
3171
3172		dtracephdr->p_vaddr = sdp->sd_sym->st_value;
3173		dtracephdr->p_memsz = sdp->sd_sym->st_size;
3174
3175		/*
3176		 * Take permisions of the segment the symbol is associated with.
3177		 */
3178		pphdr = &sdp->sd_isc->is_osdesc->os_sgdesc->sg_phdr;
3179		assert(pphdr);
3180		dtracephdr->p_flags = pphdr->p_flags;
3181	}
3182
3183	/*
3184	 * Update the GROUP sections.
3185	 */
3186	if (update_ogroup(ofl) == S_ERROR)
3187		return (S_ERROR);
3188
3189	/*
3190	 * Update Move Table.
3191	 */
3192	if (ofl->ofl_osmove || ofl->ofl_issunwdata1) {
3193		if (update_move(ofl) == S_ERROR)
3194			return (S_ERROR);
3195	}
3196
3197	/*
3198	 * Build any output headers, version information, dynamic structure and
3199	 * syminfo structure.
3200	 */
3201	if (update_oehdr(ofl) == S_ERROR)
3202		return (S_ERROR);
3203	if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) == FLG_OF_VERDEF)
3204		if (update_overdef(ofl) == S_ERROR)
3205			return (S_ERROR);
3206	if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) == FLG_OF_VERNEED)
3207		if (update_overneed(ofl) == S_ERROR)
3208			return (S_ERROR);
3209	if (flags & FLG_OF_DYNAMIC) {
3210		if (update_odynamic(ofl) == S_ERROR)
3211			return (S_ERROR);
3212		if (ofl->ofl_ossyminfo)
3213			if (update_osyminfo(ofl) == S_ERROR)
3214				return (S_ERROR);
3215	}
3216
3217	/*
3218	 * Emit Strtab diagnostics.
3219	 */
3220	DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osshstrtab,
3221	    ofl->ofl_shdrsttab));
3222	DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osstrtab,
3223	    ofl->ofl_strtab));
3224	DBG_CALL(Dbg_sec_strtab(ofl->ofl_lml, ofl->ofl_osdynstr,
3225	    ofl->ofl_dynstrtab));
3226
3227	/*
3228	 * Initialize the section headers string table index within the elf
3229	 * header.
3230	 */
3231	/* LINTED */
3232	if ((shscnndx = elf_ndxscn(ofl->ofl_osshstrtab->os_scn)) <
3233	    SHN_LORESERVE) {
3234		ofl->ofl_nehdr->e_shstrndx =
3235		    /* LINTED */
3236		    (Half)shscnndx;
3237	} else {
3238		/*
3239		 * If the STRTAB section index doesn't fit into
3240		 * e_shstrndx, then we store it in 'shdr[0].st_link'.
3241		 */
3242		Elf_Scn	*scn;
3243		Shdr	*shdr0;
3244
3245		if ((scn = elf_getscn(ofl->ofl_elf, 0)) == NULL) {
3246			eprintf(ofl->ofl_lml, ERR_ELF,
3247			    MSG_INTL(MSG_ELF_GETSCN), ofl->ofl_name);
3248			return (S_ERROR);
3249		}
3250		if ((shdr0 = elf_getshdr(scn)) == NULL) {
3251			eprintf(ofl->ofl_lml, ERR_ELF,
3252			    MSG_INTL(MSG_ELF_GETSHDR), ofl->ofl_name);
3253			return (S_ERROR);
3254		}
3255		ofl->ofl_nehdr->e_shstrndx = SHN_XINDEX;
3256		shdr0->sh_link = shscnndx;
3257	}
3258
3259	return ((uintptr_t)etext);
3260}
3261