xref: /illumos-gate/usr/src/cmd/sgs/libld/common/relocate.c (revision bea83d026ee1bd1b2a2419e1d0232f107a5d7d9b)
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 2008 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  * set-up for relocations
33  */
34 #include	<string.h>
35 #include	<stdio.h>
36 #include	<alloca.h>
37 #include	<reloc.h>
38 #include	<debug.h>
39 #include	"msg.h"
40 #include	"_libld.h"
41 
42 /*
43  * Structure to hold copy relocation items.
44  */
45 typedef struct copy_rel {
46 	Sym_desc *	copyrel_symd;	/* symbol descriptor to be copied */
47 	Addr 		copyrel_stval;	/* Original symbol value */
48 } Copy_rel;
49 
50 /*
51  * For each copy relocation symbol, determine if the symbol is:
52  * 	1) to be *disp* relocated at runtime
53  *	2) a reference symbol for *disp* relocation
54  *	3) possibly *disp* relocated at ld time.
55  *
56  * The first and the second are serious errors.
57  */
58 static void
59 is_disp_copied(Ofl_desc *ofl, Copy_rel *cpy)
60 {
61 	Ifl_desc	*ifl = cpy->copyrel_symd->sd_file;
62 	Sym_desc	*sdp = cpy->copyrel_symd;
63 	Is_desc		*irel;
64 	Addr		symaddr = cpy->copyrel_stval;
65 	Listnode	*lnp1;
66 	Conv_inv_buf_t	inv_buf;
67 
68 	/*
69 	 * This symbol may not be *disp* relocated at run time, but could
70 	 * already have been *disp* relocated when the shared object was
71 	 * created.  Warn the user.
72 	 */
73 	if ((ifl->ifl_flags & FLG_IF_DISPDONE) &&
74 	    (ofl->ofl_flags & FLG_OF_VERBOSE))
75 		eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_REL_DISPREL2),
76 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, M_R_COPY,
77 		    0, &inv_buf), ifl->ifl_name, demangle(sdp->sd_name));
78 
79 	if ((ifl->ifl_flags & FLG_IF_DISPPEND) == 0)
80 		return;
81 
82 	/*
83 	 * Traverse the input relocation sections.
84 	 */
85 	for (LIST_TRAVERSE(&ifl->ifl_relsect, lnp1, irel)) {
86 		Sym_desc	*rsdp;
87 		Is_desc		*trel;
88 		Rel		*rend, *reloc;
89 		Xword		rsize, entsize;
90 
91 		trel = ifl->ifl_isdesc[irel->is_shdr->sh_info];
92 		rsize = irel->is_shdr->sh_size;
93 		entsize = irel->is_shdr->sh_entsize;
94 		reloc = (Rel *)irel->is_indata->d_buf;
95 
96 		/*
97 		 * Decide entry size
98 		 */
99 		if ((entsize == 0) || (entsize > rsize)) {
100 			if (irel->is_shdr->sh_type == SHT_RELA)
101 				entsize = sizeof (Rela);
102 			else
103 				entsize = sizeof (Rel);
104 		}
105 
106 		/*
107 		 * Traverse the relocation entries.
108 		 */
109 		for (rend = (Rel *)((uintptr_t)reloc + (uintptr_t)rsize);
110 		    reloc < rend;
111 		    reloc = (Rel *)((uintptr_t)reloc + (uintptr_t)entsize)) {
112 			const char	*str;
113 			Word		rstndx;
114 
115 			if (IS_PC_RELATIVE(ELF_R_TYPE(reloc->r_info)) == 0)
116 				continue;
117 
118 			/*
119 			 * First, check if this symbol is reference symbol
120 			 * for this relocation entry.
121 			 */
122 			rstndx = (Word) ELF_R_SYM(reloc->r_info);
123 			rsdp = ifl->ifl_oldndx[rstndx];
124 			if (rsdp == sdp) {
125 				if ((str = demangle(rsdp->sd_name)) !=
126 				    rsdp->sd_name) {
127 					char	*_str = alloca(strlen(str) + 1);
128 					(void) strcpy(_str, str);
129 					str = (const char *)_str;
130 				}
131 				eprintf(ofl->ofl_lml,
132 				    ERR_WARNING, MSG_INTL(MSG_REL_DISPREL1),
133 				    conv_reloc_type(ifl->ifl_ehdr->e_machine,
134 				    (uint_t)ELF_R_TYPE(reloc->r_info),
135 				    0, &inv_buf), ifl->ifl_name, str,
136 				    MSG_INTL(MSG_STR_UNKNOWN),
137 				    EC_XWORD(reloc->r_offset),
138 				    demangle(sdp->sd_name));
139 			}
140 
141 			/*
142 			 * Then check if this relocation entry is relocating
143 			 * this symbol.
144 			 */
145 			if ((sdp->sd_isc != trel) ||
146 			    (reloc->r_offset < symaddr) ||
147 			    (reloc->r_offset >=
148 			    (symaddr + sdp->sd_sym->st_size)))
149 				continue;
150 
151 			/*
152 			 * This symbol is truely *disp* relocated, so should
153 			 * really be fixed by user.
154 			 */
155 			if ((str = demangle(sdp->sd_name)) != sdp->sd_name) {
156 				char	*_str = alloca(strlen(str) + 1);
157 				(void) strcpy(_str, str);
158 				str = (const char *)_str;
159 			}
160 			eprintf(ofl->ofl_lml, ERR_WARNING,
161 			    MSG_INTL(MSG_REL_DISPREL1),
162 			    conv_reloc_type(ifl->ifl_ehdr->e_machine,
163 			    (uint_t)ELF_R_TYPE(reloc->r_info), 0, &inv_buf),
164 			    ifl->ifl_name, demangle(rsdp->sd_name), str,
165 			    EC_XWORD(reloc->r_offset), str);
166 		}
167 	}
168 }
169 
170 /*
171  * The number of symbols provided by some objects can be very large.  Use a
172  * binary search to match the associated value to a symbol table entry.
173  */
174 static int
175 disp_bsearch(const void *key, const void *array)
176 {
177 	Addr		kvalue, avalue;
178 	Ssv_desc	*ssvp = (Ssv_desc *)array;
179 
180 	kvalue = *((Addr *)key);
181 	avalue = ssvp->ssv_value;
182 
183 	if (avalue > kvalue)
184 		return (-1);
185 	if ((avalue < kvalue) &&
186 	    ((avalue + ssvp->ssv_sdp->sd_sym->st_size) <= kvalue))
187 		return (1);
188 	return (0);
189 }
190 
191 /*
192  * Given a sorted list of symbols, look for a symbol in which the relocation
193  * offset falls between the [sym.st_value - sym.st_value + sym.st_size].  Since
194  * the symbol list is maintained in sorted order,  we can bail once the
195  * relocation offset becomes less than the symbol values.  The symbol is
196  * returned for use in error diagnostics.
197  */
198 static Sym_desc *
199 disp_scansyms(Ifl_desc * ifl, Rel_desc *rld, Boolean rlocal, int inspect,
200     Ofl_desc *ofl)
201 {
202 	Sym_desc	*tsdp, *rsdp;
203 	Sym		*rsym, *tsym;
204 	Ssv_desc	*ssvp;
205 	uchar_t		rtype, ttype;
206 	Addr		value;
207 
208 	/*
209 	 * Sorted symbol values have been uniquified by adding their associated
210 	 * section offset.  Uniquify the relocation offset by adding its
211 	 * associated section offset, and search for the symbol.
212 	 */
213 	value = rld->rel_roffset;
214 	if (rld->rel_isdesc->is_shdr)
215 		value += rld->rel_isdesc->is_shdr->sh_offset;
216 
217 	if ((ssvp = bsearch((void *)&value, (void *)ifl->ifl_sortsyms,
218 	    ifl->ifl_sortcnt, sizeof (Ssv_desc), &disp_bsearch)) != 0)
219 		tsdp = ssvp->ssv_sdp;
220 	else
221 		tsdp = 0;
222 
223 	if (inspect)
224 		return (tsdp);
225 
226 	/*
227 	 * Determine the relocation reference symbol and its type.
228 	 */
229 	rsdp = rld->rel_sym;
230 	rsym = rsdp->sd_sym;
231 	rtype = ELF_ST_TYPE(rsym->st_info);
232 
233 	/*
234 	 * If there is no target symbol to match the relocation offset, then the
235 	 * offset is effectively local data.  If the relocation symbol is global
236 	 * data we have a potential for this displacement relocation to be
237 	 * invalidated should the global symbol be copied.
238 	 */
239 	if (tsdp == 0) {
240 		if ((rlocal == TRUE) ||
241 		    ((rtype != STT_OBJECT) && (rtype != STT_SECTION)))
242 		return (tsdp);
243 	} else {
244 		/*
245 		 * If both symbols are local, no copy relocations can occur to
246 		 * either symbol.  Note, this test is very similar to the test
247 		 * used in ld_sym_adjust_vis().
248 		 */
249 		if ((rlocal == TRUE) &&
250 		    ((tsdp->sd_flags1 & FLG_SY1_HIDDEN) ||
251 		    (ELF_ST_BIND(tsdp->sd_sym->st_info) != STB_GLOBAL) ||
252 		    (((ofl->ofl_flags & FLG_OF_AUTOLCL) ||
253 		    (ofl->ofl_flags1 & FLG_OF1_AUTOELM)) &&
254 		    ((tsdp->sd_flags1 & MSK_SY1_NOAUTO) == 0))))
255 			return (tsdp);
256 
257 		/*
258 		 * Determine the relocation target symbols type.
259 		 */
260 		tsym = tsdp->sd_sym;
261 		ttype = ELF_ST_TYPE(tsym->st_info);
262 
263 		/*
264 		 * If the reference symbol is local, and the target isn't a
265 		 * data element, then no copy relocations can occur to either
266 		 * symbol.  Note, this catches pc-relative relocations against
267 		 * the _GLOBAL_OFFSET_TABLE_, which is effectively treated as
268 		 * a local symbol.
269 		 */
270 		if ((rlocal == TRUE) && (ttype != STT_OBJECT) &&
271 		    (ttype != STT_SECTION))
272 			return (tsdp);
273 
274 		/*
275 		 * Finally, one of the symbols must reference a data element.
276 		 */
277 		if ((rtype != STT_OBJECT) && (rtype != STT_SECTION) &&
278 		    (ttype != STT_OBJECT) && (ttype != STT_SECTION))
279 			return (tsdp);
280 	}
281 
282 	/*
283 	 * We have two global symbols, at least one of which is a data item.
284 	 * The last case where a displacement relocation can be ignored, is
285 	 * if the reference symbol is included in the target symbol.
286 	 */
287 	value = rsym->st_value;
288 	if ((rld->rel_flags & FLG_REL_RELA) == FLG_REL_RELA)
289 		value += rld->rel_raddend;
290 
291 	if ((rld->rel_roffset >= value) &&
292 	    (rld->rel_roffset < (value + rsym->st_size)))
293 		return (tsdp);
294 
295 	/*
296 	 * We have a displacement relocation that could be compromised by a
297 	 * copy relocation of one of the associated data items.
298 	 */
299 	rld->rel_flags |= FLG_REL_DISP;
300 	return (tsdp);
301 }
302 
303 void
304 ld_disp_errmsg(const char *msg, Rel_desc *rsp, Ofl_desc *ofl)
305 {
306 	Sym_desc	*sdp;
307 	const char	*str;
308 	Ifl_desc	*ifl = rsp->rel_isdesc->is_file;
309 	Conv_inv_buf_t	inv_buf;
310 
311 	if ((sdp = disp_scansyms(ifl, rsp, 0, 1, ofl)) != 0)
312 		str = demangle(sdp->sd_name);
313 	else
314 		str = MSG_INTL(MSG_STR_UNKNOWN);
315 
316 	eprintf(ofl->ofl_lml, ERR_WARNING, msg,
317 	    conv_reloc_type(ifl->ifl_ehdr->e_machine, rsp->rel_rtype,
318 	    0, &inv_buf), ifl->ifl_name, rsp->rel_sname, str,
319 	    EC_OFF(rsp->rel_roffset));
320 }
321 
322 /*
323  * qsort(3C) comparison routine used for the disp_sortsyms().
324  */
325 static int
326 disp_qsort(const void * s1, const void * s2)
327 {
328 	Ssv_desc	*ssvp1 = ((Ssv_desc *)s1);
329 	Ssv_desc	*ssvp2 = ((Ssv_desc *)s2);
330 	Addr		val1 = ssvp1->ssv_value;
331 	Addr		val2 = ssvp2->ssv_value;
332 
333 	if (val1 > val2)
334 		return (1);
335 	if (val1 < val2)
336 		return (-1);
337 	return (0);
338 }
339 
340 /*
341  * Determine whether a displacement relocation is between a local and global
342  * symbol pair.  One symbol is used to perform the relocation, and the other
343  * is the destination offset of the relocation.
344  */
345 static uintptr_t
346 disp_inspect(Ofl_desc *ofl, Rel_desc *rld, Boolean rlocal)
347 {
348 	Is_desc		*isp = rld->rel_isdesc;
349 	Ifl_desc	*ifl = rld->rel_isdesc->is_file;
350 
351 	/*
352 	 * If the input files symbols haven't been sorted yet, do so.
353 	 */
354 	if (ifl->ifl_sortsyms == 0) {
355 		Word	ondx, nndx;
356 
357 		if ((ifl->ifl_sortsyms = libld_malloc((ifl->ifl_symscnt + 1) *
358 		    sizeof (Ssv_desc))) == 0)
359 			return (S_ERROR);
360 
361 		for (ondx = 0, nndx = 0; ondx < ifl->ifl_symscnt; ondx++) {
362 			Sym_desc	*sdp;
363 			Addr		value;
364 
365 			/*
366 			 * As symbol resolution has already occurred, various
367 			 * symbols from this object may have been satisfied
368 			 * from other objects.  Only select symbols from this
369 			 * object.  For the displacement test, we only really
370 			 * need to observe data definitions, however, later as
371 			 * part of providing warning disgnostics, relating the
372 			 * relocation offset to a symbol is desirable.  Thus,
373 			 * collect all symbols that define a memory area.
374 			 */
375 			if (((sdp = ifl->ifl_oldndx[ondx]) == 0) ||
376 			    (sdp->sd_sym->st_shndx == SHN_UNDEF) ||
377 			    (sdp->sd_sym->st_shndx >= SHN_LORESERVE) ||
378 			    (sdp->sd_ref != REF_REL_NEED) ||
379 			    (sdp->sd_file != ifl) ||
380 			    (sdp->sd_sym->st_size == 0))
381 				continue;
382 
383 			/*
384 			 * As a further optimization for later checking, mark
385 			 * this section if this a global data definition.
386 			 */
387 			if (sdp->sd_isc && (ondx >= ifl->ifl_locscnt))
388 				sdp->sd_isc->is_flags |= FLG_IS_GDATADEF;
389 
390 			/*
391 			 * Capture the symbol.  Within relocatable objects, a
392 			 * symbols value is its offset within its associated
393 			 * section.  Add the section offset to this value to
394 			 * uniquify the symbol.
395 			 */
396 			value = sdp->sd_sym->st_value;
397 			if (sdp->sd_isc && sdp->sd_isc->is_shdr)
398 				value += sdp->sd_isc->is_shdr->sh_offset;
399 
400 			ifl->ifl_sortsyms[nndx].ssv_value = value;
401 			ifl->ifl_sortsyms[nndx].ssv_sdp = sdp;
402 			nndx++;
403 		}
404 
405 		/*
406 		 * Sort the list based on the symbols value (address).
407 		 */
408 		if ((ifl->ifl_sortcnt = nndx) != 0)
409 			qsort(ifl->ifl_sortsyms, nndx, sizeof (Ssv_desc),
410 			    &disp_qsort);
411 	}
412 
413 	/*
414 	 * If the reference symbol is local, and the section being relocated
415 	 * contains no global definitions, neither can be the target of a copy
416 	 * relocation.
417 	 */
418 	if ((rlocal == FALSE) && ((isp->is_flags & FLG_IS_GDATADEF) == 0))
419 		return (1);
420 
421 	/*
422 	 * Otherwise determine whether this relocation symbol and its offset
423 	 * could be candidates for a copy relocation.
424 	 */
425 	if (ifl->ifl_sortcnt)
426 		(void) disp_scansyms(ifl, rld, rlocal, 0, ofl);
427 	return (1);
428 }
429 
430 /*
431  * Add an active relocation record.
432  */
433 uintptr_t
434 ld_add_actrel(Word flags, Rel_desc *rsp, Ofl_desc *ofl)
435 {
436 	Rel_desc	*arsp;
437 	Rel_cache	*rcp;
438 
439 	/*
440 	 * If no relocation cache structures are available, allocate a new
441 	 * one and link it into the bucket list.
442 	 */
443 	if ((ofl->ofl_actrels.tail == 0) ||
444 	    ((rcp = (Rel_cache *)ofl->ofl_actrels.tail->data) == 0) ||
445 	    ((arsp = rcp->rc_free) == rcp->rc_end)) {
446 		static size_t	nextsize = 0;
447 		size_t		size;
448 
449 		/*
450 		 * Typically, when generating an executable or shared object
451 		 * there will be an active relocation for every input
452 		 * relocation.
453 		 */
454 		if (nextsize == 0) {
455 			if ((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) {
456 				if ((size = ofl->ofl_relocincnt) == 0)
457 					size = REL_LAIDESCNO;
458 				if (size > REL_HAIDESCNO)
459 					nextsize = REL_HAIDESCNO;
460 				else
461 					nextsize = REL_LAIDESCNO;
462 			} else
463 				nextsize = size = REL_HAIDESCNO;
464 		} else
465 			size = nextsize;
466 
467 		size = size * sizeof (Rel_desc);
468 
469 		if (((rcp = libld_malloc(sizeof (Rel_cache) + size)) == 0) ||
470 		    (list_appendc(&ofl->ofl_actrels, rcp) == 0))
471 			return (S_ERROR);
472 
473 		/* LINTED */
474 		rcp->rc_free = arsp = (Rel_desc *)(rcp + 1);
475 		/* LINTED */
476 		rcp->rc_end = (Rel_desc *)((char *)rcp->rc_free + size);
477 	}
478 
479 	*arsp = *rsp;
480 	arsp->rel_flags |= flags;
481 
482 	rcp->rc_free++;
483 	ofl->ofl_actrelscnt++;
484 
485 	/*
486 	 * Any GOT relocation reference requires the creation of a .got table.
487 	 * Most references to a .got require a .got entry,  which is accounted
488 	 * for with the ofl_gotcnt counter.  However, some references are
489 	 * relative to the .got table, but require no .got entry.  This test
490 	 * insures a .got is created regardless of the type of reference.
491 	 */
492 	if (IS_GOT_REQUIRED(arsp->rel_rtype))
493 		ofl->ofl_flags |= FLG_OF_BLDGOT;
494 
495 	/*
496 	 * If this is a displacement relocation generate a warning.
497 	 */
498 	if (arsp->rel_flags & FLG_REL_DISP) {
499 		ofl->ofl_dtflags_1 |= DF_1_DISPRELDNE;
500 
501 		if (ofl->ofl_flags & FLG_OF_VERBOSE)
502 			ld_disp_errmsg(MSG_INTL(MSG_REL_DISPREL3), arsp, ofl);
503 	}
504 
505 	DBG_CALL(Dbg_reloc_ars_entry(ofl->ofl_lml, ELF_DBG_LD,
506 	    arsp->rel_isdesc->is_shdr->sh_type, M_MACH, arsp));
507 	return (1);
508 }
509 
510 /*
511  * In the platform specific machrel.XXX.c files, we sometimes write
512  * a value directly into the GOT. This function can be used when
513  * the running linker has the opposite byte order of the object being
514  * produced.
515  */
516 Xword
517 ld_byteswap_Xword(Xword v)
518 {
519 #ifdef _ELF64
520 	return ((v << 56) |
521 	    ((v & 0x0000ff00) << 40) |
522 	    ((v & 0x00ff0000) << 24) |
523 	    ((v & 0xff000000) << 8) |
524 	    ((v >> 8)  & 0xff000000) |
525 	    ((v >> 24) & 0x00ff0000) |
526 	    ((v >> 40) & 0x0000ff00) |
527 	    (v >> 56));		/* Xword is unsigned - 0 bits enter from left */
528 #else
529 	return (((v << 24) | ((v & 0xff00) << 8) |
530 	    ((v >> 8) & 0xff00) | (v >> 24)));
531 #endif
532 }
533 
534 
535 uintptr_t
536 ld_reloc_GOT_relative(Boolean local, Rel_desc *rsp, Ofl_desc *ofl)
537 {
538 	Sym_desc	*sdp;
539 	Word		flags = ofl->ofl_flags;
540 	Gotndx		*gnp;
541 
542 	sdp = rsp->rel_sym;
543 
544 	/*
545 	 * If this is the first time we've seen this symbol in a GOT
546 	 * relocation we need to assign it a GOT token.  Once we've got
547 	 * all of the GOT's assigned we can assign the actual indexes.
548 	 */
549 	if ((gnp = ld_find_gotndx(&(sdp->sd_GOTndxs), GOT_REF_GENERIC,
550 	    ofl, rsp)) == 0) {
551 		Word	rtype = rsp->rel_rtype;
552 
553 		if (ld_assign_got_ndx(&(sdp->sd_GOTndxs), 0, GOT_REF_GENERIC,
554 		    ofl, rsp, sdp) == S_ERROR)
555 			return (S_ERROR);
556 
557 		/*
558 		 * Now we initialize the GOT table entry.
559 		 *
560 		 * Pseudo code to describe the the decisions below:
561 		 *
562 		 * If (local)
563 		 * then
564 		 *	enter symbol value in GOT table entry
565 		 *	if (Shared Object)
566 		 *	then
567 		 *		create Relative relocation against symbol
568 		 *	fi
569 		 * else
570 		 *	clear GOT table entry
571 		 *	create a GLOB_DAT relocation against symbol
572 		 * fi
573 		 */
574 		if (local == TRUE) {
575 			if (flags & FLG_OF_SHAROBJ) {
576 				if (ld_add_actrel((FLG_REL_GOT | FLG_REL_GOTCL),
577 				    rsp, ofl) == S_ERROR)
578 					return (S_ERROR);
579 
580 				/*
581 				 * Add a RELATIVE relocation if this is
582 				 * anything but a ABS symbol.
583 				 */
584 				if ((((sdp->sd_flags & FLG_SY_SPECSEC) == 0) ||
585 				    (sdp->sd_sym->st_shndx != SHN_ABS)) ||
586 				    (sdp->sd_aux && sdp->sd_aux->sa_symspec)) {
587 					rsp->rel_rtype = M_R_RELATIVE;
588 					if (ld_add_outrel((FLG_REL_GOT |
589 					    FLG_REL_ADVAL), rsp,
590 					    ofl) == S_ERROR)
591 						return (S_ERROR);
592 					rsp->rel_rtype = rtype;
593 				}
594 			} else {
595 				if (ld_add_actrel(FLG_REL_GOT, rsp,
596 				    ofl) == S_ERROR)
597 					return (S_ERROR);
598 			}
599 		} else {
600 			rsp->rel_rtype = M_R_GLOB_DAT;
601 			if (ld_add_outrel(FLG_REL_GOT, rsp, ofl) == S_ERROR)
602 				return (S_ERROR);
603 			rsp->rel_rtype = rtype;
604 		}
605 	} else {
606 		if (ld_assign_got_ndx(&(sdp->sd_GOTndxs), gnp, GOT_REF_GENERIC,
607 		    ofl, rsp, sdp) == S_ERROR)
608 			return (S_ERROR);
609 	}
610 
611 	/*
612 	 * Perform relocation to GOT table entry.
613 	 */
614 	return (ld_add_actrel(NULL, rsp, ofl));
615 }
616 
617 
618 /*
619  * Perform relocations for PLT's
620  */
621 uintptr_t
622 ld_reloc_plt(Rel_desc *rsp, Ofl_desc *ofl)
623 {
624 	Sym_desc	*sdp = rsp->rel_sym;
625 
626 #if	defined(__x86)
627 #if	defined(_ELF64)
628 	/*
629 	 * AMD64 TLS code sequences do not use a unique TLS relocation to
630 	 * reference the __tls_get_addr() function call.
631 	 */
632 	if ((ofl->ofl_flags & FLG_OF_EXEC) &&
633 	    (strcmp(sdp->sd_name, MSG_ORIG(MSG_SYM_TLSGETADDR_U)) == 0)) {
634 		return (ld_add_actrel(FLG_REL_TLSFIX, rsp, ofl));
635 	}
636 #else
637 	/*
638 	 * GNUC IA32 TLS code sequences do not use a unique TLS relocation to
639 	 * reference the ___tls_get_addr() function call.
640 	 */
641 	if ((ofl->ofl_flags & FLG_OF_EXEC) &&
642 	    (strcmp(sdp->sd_name, MSG_ORIG(MSG_SYM_TLSGETADDR_UU)) == 0)) {
643 		return (ld_add_actrel(FLG_REL_TLSFIX, rsp, ofl));
644 	}
645 #endif
646 #endif	/* __x86 */
647 
648 	/*
649 	 * if (not PLT yet assigned)
650 	 * then
651 	 *	assign PLT index to symbol
652 	 *	build output JMP_SLOT relocation
653 	 * fi
654 	 */
655 	if (sdp->sd_aux->sa_PLTndx == 0) {
656 		Word	ortype = rsp->rel_rtype;
657 
658 		ld_assign_plt_ndx(sdp, ofl);
659 
660 		/*
661 		 * If this symbol is binding to a LAZYLOADED object then
662 		 * set the LAZYLD symbol flag.
663 		 */
664 		if ((sdp->sd_aux->sa_bindto &&
665 		    (sdp->sd_aux->sa_bindto->ifl_flags & FLG_IF_LAZYLD)) ||
666 		    (sdp->sd_file &&
667 		    (sdp->sd_file->ifl_flags & FLG_IF_LAZYLD)))
668 			sdp->sd_flags |= FLG_SY_LAZYLD;
669 
670 		rsp->rel_rtype = M_R_JMP_SLOT;
671 		if (ld_add_outrel(FLG_REL_PLT, rsp, ofl) == S_ERROR)
672 			return (S_ERROR);
673 		rsp->rel_rtype = ortype;
674 	}
675 
676 	/*
677 	 * Perform relocation to PLT table entry.
678 	 */
679 	if ((ofl->ofl_flags & FLG_OF_SHAROBJ) &&
680 	    IS_ADD_RELATIVE(rsp->rel_rtype)) {
681 		Word	ortype	= rsp->rel_rtype;
682 
683 		rsp->rel_rtype = M_R_RELATIVE;
684 		if (ld_add_outrel(FLG_REL_ADVAL, rsp, ofl) == S_ERROR)
685 			return (S_ERROR);
686 		rsp->rel_rtype = ortype;
687 		return (1);
688 	} else
689 		return (ld_add_actrel(NULL, rsp, ofl));
690 }
691 
692 /*
693  * process GLOBAL undefined and ref_dyn_need symbols.
694  */
695 static uintptr_t
696 reloc_exec(Rel_desc *rsp, Ofl_desc *ofl)
697 {
698 	Sym_desc	*_sdp, *sdp = rsp->rel_sym;
699 	Sym_aux		*sap = sdp->sd_aux;
700 	Sym		*sym = sdp->sd_sym;
701 	Addr		stval;
702 
703 	/*
704 	 * Reference is to a function so simply create a plt entry for it.
705 	 */
706 	if (ELF_ST_TYPE(sym->st_info) == STT_FUNC)
707 		return (ld_reloc_plt(rsp, ofl));
708 
709 	/*
710 	 * Catch absolutes - these may cause a text relocation.
711 	 */
712 	if ((sdp->sd_flags & FLG_SY_SPECSEC) && (sym->st_shndx == SHN_ABS)) {
713 		if ((ofl->ofl_flags1 & FLG_OF1_ABSEXEC) == 0)
714 			return (ld_add_outrel(NULL, rsp, ofl));
715 
716 		/*
717 		 * If -zabsexec is set then promote the ABSOLUTE symbol to
718 		 * current the current object and perform the relocation now.
719 		 */
720 		sdp->sd_ref = REF_REL_NEED;
721 		return (ld_add_actrel(NULL, rsp, ofl));
722 	}
723 
724 	/*
725 	 * If the relocation is against a writable section simply compute the
726 	 * necessary output relocation.  As an optimization, if the symbol has
727 	 * already been transformed into a copy relocation then we can perform
728 	 * the relocation directly (copy relocations should only be generated
729 	 * for references from the text segment and these relocations are
730 	 * normally carried out before we get to the data segment relocations).
731 	 */
732 	if ((ELF_ST_TYPE(sym->st_info) == STT_OBJECT) &&
733 	    (rsp->rel_osdesc->os_shdr->sh_flags & SHF_WRITE)) {
734 		if (sdp->sd_flags & FLG_SY_MVTOCOMM)
735 			return (ld_add_actrel(NULL, rsp, ofl));
736 		else
737 			return (ld_add_outrel(NULL, rsp, ofl));
738 	}
739 
740 	/*
741 	 * If the reference isn't to an object (normally because a .type
742 	 * directive hasn't defined in some assembler source), then simply apply
743 	 * a generic relocation (this has a tendency to result in text
744 	 * relocations).
745 	 */
746 	if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT) {
747 		Conv_inv_buf_t inv_buf;
748 
749 		eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_REL_UNEXPSYM),
750 		    conv_sym_info_type(sdp->sd_file->ifl_ehdr->e_machine,
751 		    ELF_ST_TYPE(sym->st_info), 0, &inv_buf),
752 		    rsp->rel_isdesc->is_file->ifl_name,
753 		    demangle(rsp->rel_sname), sdp->sd_file->ifl_name);
754 		return (ld_add_outrel(NULL, rsp, ofl));
755 	}
756 
757 	/*
758 	 * Prepare for generating a copy relocation.
759 	 *
760 	 * If this symbol is one of an alias pair, we need to insure both
761 	 * symbols become part of the output (the strong symbol will be used to
762 	 * maintain the symbols state).  And, if we did raise the precedence of
763 	 * a symbol we need to check and see if this is a weak symbol.  If it is
764 	 * we want to use it's strong counter part.
765 	 *
766 	 * The results of this logic should be:
767 	 *	rel_usym: assigned to strong
768 	 *	 rel_sym: assigned to symbol to perform
769 	 *		  copy_reloc against (weak or strong).
770 	 */
771 	if (sap->sa_linkndx) {
772 		_sdp = sdp->sd_file->ifl_oldndx[sap->sa_linkndx];
773 
774 		if (_sdp->sd_ref < sdp->sd_ref) {
775 			_sdp->sd_ref = sdp->sd_ref;
776 			_sdp->sd_flags |= FLG_SY_REFRSD;
777 
778 			/*
779 			 * As we're going to replicate a symbol from a shared
780 			 * object, retain its correct binding status.
781 			 */
782 			if (ELF_ST_BIND(_sdp->sd_sym->st_info) == STB_GLOBAL)
783 				_sdp->sd_flags |= FLG_SY_GLOBREF;
784 
785 		} else if (_sdp->sd_ref > sdp->sd_ref) {
786 			sdp->sd_ref = _sdp->sd_ref;
787 			sdp->sd_flags |= FLG_SY_REFRSD;
788 
789 			/*
790 			 * As we're going to replicate a symbol from a shared
791 			 * object, retain its correct binding status.
792 			 */
793 			if (ELF_ST_BIND(sym->st_info) == STB_GLOBAL)
794 				sdp->sd_flags |= FLG_SY_GLOBREF;
795 		}
796 
797 		/*
798 		 * If this is a weak symbol then we want to move the strong
799 		 * symbol into local .bss.  If there is a copy_reloc to be
800 		 * performed, that should still occur against the WEAK symbol.
801 		 */
802 		if ((ELF_ST_BIND(sdp->sd_sym->st_info) == STB_WEAK) ||
803 		    (sdp->sd_flags & FLG_SY_WEAKDEF))
804 			rsp->rel_usym = _sdp;
805 	} else
806 		_sdp = 0;
807 
808 	/*
809 	 * If the reference is to an object then allocate space for the object
810 	 * within the executables .bss.  Relocations will now be performed from
811 	 * this new location.  If the original shared objects data is
812 	 * initialized, then generate a copy relocation that will copy the data
813 	 * to the executables .bss at runtime.
814 	 */
815 	if (!(rsp->rel_usym->sd_flags & FLG_SY_MVTOCOMM)) {
816 		Word	rtype = rsp->rel_rtype;
817 		Copy_rel *cpy_rel;
818 
819 		/*
820 		 * Indicate that the symbol(s) against which we're relocating
821 		 * have been moved to the executables common.  Also, insure that
822 		 * the symbol(s) remain marked as global, as the shared object
823 		 * from which they are copied must be able to relocate to the
824 		 * new common location within the executable.
825 		 *
826 		 * Note that even though a new symbol has been generated in the
827 		 * output files' .bss, the symbol must remain REF_DYN_NEED and
828 		 * not be promoted to REF_REL_NEED.  sym_validate() still needs
829 		 * to carry out a number of checks against the symbols binding
830 		 * that are triggered by the REF_DYN_NEED state.
831 		 */
832 		sdp->sd_flags |= FLG_SY_MVTOCOMM;
833 		sdp->sd_flags1 |= (FLG_SY1_DEFAULT | FLG_SY1_EXPDEF);
834 		sdp->sd_flags1 &= ~MSK_SY1_LOCAL;
835 		sdp->sd_sym->st_other &= ~MSK_SYM_VISIBILITY;
836 		if (_sdp) {
837 			_sdp->sd_flags |= FLG_SY_MVTOCOMM;
838 			_sdp->sd_flags1 |= (FLG_SY1_DEFAULT | FLG_SY1_EXPDEF);
839 			_sdp->sd_flags1 &= ~MSK_SY1_LOCAL;
840 			_sdp->sd_sym->st_other &= ~MSK_SYM_VISIBILITY;
841 
842 			/*
843 			 * Make sure the symbol has a reference in case of any
844 			 * error diagnostics against it (perhaps this belongs
845 			 * to a version that isn't allowable for this build).
846 			 * The resulting diagnostic (see sym_undef_entry())
847 			 * might seem a little bogus, as the symbol hasn't
848 			 * really been referenced by this file, but has been
849 			 * promoted as a consequence of its alias reference.
850 			 */
851 			if (!(_sdp->sd_aux->sa_rfile))
852 				_sdp->sd_aux->sa_rfile = sdp->sd_aux->sa_rfile;
853 		}
854 
855 		/*
856 		 * Assign the symbol to the bss and insure sufficient alignment
857 		 * (we don't know the real alignment so we have to make the
858 		 * worst case guess).
859 		 */
860 		_sdp = rsp->rel_usym;
861 		stval = _sdp->sd_sym->st_value;
862 		if (ld_sym_copy(_sdp) == S_ERROR)
863 			return (S_ERROR);
864 		_sdp->sd_shndx = _sdp->sd_sym->st_shndx = SHN_COMMON;
865 		_sdp->sd_flags |= FLG_SY_SPECSEC;
866 		_sdp->sd_sym->st_value =
867 		    (_sdp->sd_sym->st_size < (M_WORD_ALIGN * 2)) ?
868 		    M_WORD_ALIGN : M_WORD_ALIGN * 2;
869 
870 		/*
871 		 * Whether or not the symbol references initialized
872 		 * data we generate a copy relocation - this differs
873 		 * from the past where we would not create the COPY_RELOC
874 		 * if we were binding against .bss.  This is done
875 		 * for *two* reasons.
876 		 *
877 		 *  o If the symbol in the shared object changes to
878 		 *    a initialized data - we need the COPY to pick it
879 		 *    up.
880 		 *  o without the COPY RELOC we can't tell that the
881 		 *    symbol from the COPY'd object has been moved
882 		 *    and all bindings to it should bind here.
883 		 */
884 
885 		/*
886 		 * Keep this symbol in the copy relocation list
887 		 * to check the validity later.
888 		 */
889 		if ((cpy_rel = libld_malloc(sizeof (Copy_rel))) == 0)
890 			return (S_ERROR);
891 		cpy_rel->copyrel_symd = _sdp;
892 		cpy_rel->copyrel_stval = stval;
893 		if (list_appendc(&ofl->ofl_copyrels, cpy_rel) == 0)
894 			return (S_ERROR);
895 
896 		rsp->rel_rtype = M_R_COPY;
897 		if (ld_add_outrel(FLG_REL_BSS, rsp, ofl) == S_ERROR)
898 			return (S_ERROR);
899 		rsp->rel_rtype = rtype;
900 
901 		/*
902 		 * If this symbol is a protected symbol, warn it.
903 		 */
904 		if (_sdp->sd_flags & FLG_SY_PROT) {
905 			Conv_inv_buf_t inv_buf;
906 
907 			eprintf(ofl->ofl_lml, ERR_WARNING,
908 			    MSG_INTL(MSG_REL_COPY),
909 			    conv_reloc_type(_sdp->sd_file->ifl_ehdr->e_machine,
910 			    M_R_COPY, 0, &inv_buf), _sdp->sd_file->ifl_name,
911 			    _sdp->sd_name);
912 		}
913 		DBG_CALL(Dbg_syms_reloc(ofl, sdp));
914 	}
915 	return (ld_add_actrel(NULL, rsp, ofl));
916 }
917 
918 /*
919  * All relocations should have been handled by the other routines.  This
920  * routine is here as a catch all, if we do enter it we've goofed - but
921  * we'll try and to the best we can.
922  */
923 static uintptr_t
924 reloc_generic(Rel_desc *rsp, Ofl_desc *ofl)
925 {
926 	Ifl_desc	*ifl = rsp->rel_isdesc->is_file;
927 	Conv_inv_buf_t	inv_buf;
928 
929 	eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_REL_UNEXPREL),
930 	    conv_reloc_type(ifl->ifl_ehdr->e_machine, rsp->rel_rtype,
931 	    0, &inv_buf), ifl->ifl_name, demangle(rsp->rel_sname));
932 
933 	/*
934 	 * If building a shared object then put the relocation off
935 	 * until runtime.
936 	 */
937 	if (ofl->ofl_flags & FLG_OF_SHAROBJ)
938 		return (ld_add_outrel(NULL, rsp, ofl));
939 
940 	/*
941 	 * Otherwise process relocation now.
942 	 */
943 	return (ld_add_actrel(NULL, rsp, ofl));
944 }
945 
946 /*
947  * Process relocations when building a relocatable object.  Typically, there
948  * aren't many relocations that can be caught at this point, most are simply
949  * passed through to the output relocatable object.
950  */
951 static uintptr_t
952 reloc_relobj(Boolean local, Rel_desc *rsp, Ofl_desc *ofl)
953 {
954 	Word		rtype = rsp->rel_rtype;
955 	Sym_desc	*sdp = rsp->rel_sym;
956 	Is_desc		*isp = rsp->rel_isdesc;
957 	Word		oflags = NULL;
958 
959 	/*
960 	 * Determine if we can do any relocations at this point.  We can if:
961 	 *
962 	 *	this is local_symbol and a non-GOT relocation, and
963 	 *	the relocation is pc-relative, and
964 	 *	the relocation is against a symbol in same section
965 	 */
966 	if (local && !IS_GOT_RELATIVE(rtype) && !IS_GOT_BASED(rtype) &&
967 	    !IS_GOT_PC(rtype) && IS_PC_RELATIVE(rtype) &&
968 	    ((sdp->sd_isc) && (sdp->sd_isc->is_osdesc == isp->is_osdesc)))
969 		return (ld_add_actrel(NULL, rsp, ofl));
970 
971 	/*
972 	 * If -zredlocsym is in effect, translate all local symbol relocations
973 	 * to be against section symbols, since section symbols are the only
974 	 * local symbols which will be added to the .symtab.
975 	 */
976 	if (local && (((ofl->ofl_flags1 & FLG_OF1_REDLSYM) &&
977 	    (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL)) ||
978 	    ((sdp->sd_flags1 & FLG_SY1_ELIM) &&
979 	    (ofl->ofl_flags & FLG_OF_PROCRED)))) {
980 		/*
981 		 * But if this is PIC code, don't allow it for now.
982 		 */
983 		if (IS_GOT_RELATIVE(rsp->rel_rtype)) {
984 			Ifl_desc	*ifl = rsp->rel_isdesc->is_file;
985 			Conv_inv_buf_t inv_buf;
986 
987 			eprintf(ofl->ofl_lml, ERR_FATAL,
988 			    MSG_INTL(MSG_REL_PICREDLOC),
989 			    demangle(rsp->rel_sname), ifl->ifl_name,
990 			    conv_reloc_type(ifl->ifl_ehdr->e_machine,
991 			    rsp->rel_rtype, 0, &inv_buf));
992 			return (S_ERROR);
993 		}
994 
995 		/*
996 		 * Indicate that this relocation should be processed the same
997 		 * as a section symbol.  For SPARC and AMD64 (Rela), indicate
998 		 * that the addend also needs to be applied to this relocation.
999 		 */
1000 #if	(defined(__i386) || defined(__amd64)) && !defined(_ELF64)
1001 		oflags = FLG_REL_SCNNDX;
1002 #else
1003 		oflags = FLG_REL_SCNNDX | FLG_REL_ADVAL;
1004 #endif
1005 	}
1006 
1007 #if	(defined(__i386) || defined(__amd64)) && !defined(_ELF64)
1008 	/*
1009 	 * Intel (Rel) relocations do not contain an addend.  Any addend is
1010 	 * contained within the file at the location identified by the
1011 	 * relocation offset.  Therefore, if we're processing a section symbol,
1012 	 * or a -zredlocsym relocation (that basically transforms a local symbol
1013 	 * reference into a section reference), perform an active relocation to
1014 	 * propagate any addend.
1015 	 */
1016 	if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) ||
1017 	    (oflags == FLG_REL_SCNNDX))
1018 		if (ld_add_actrel(NULL, rsp, ofl) == S_ERROR)
1019 			return (S_ERROR);
1020 #endif
1021 	return (ld_add_outrel(oflags, rsp, ofl));
1022 }
1023 
1024 /*
1025  * Perform any generic TLS validations before passing control to machine
1026  * specific routines.  At this point we know we are dealing with an executable
1027  * or shared object - relocatable objects have already been processed.
1028  */
1029 static uintptr_t
1030 reloc_TLS(Boolean local, Rel_desc *rsp, Ofl_desc *ofl)
1031 {
1032 	Word		rtype = rsp->rel_rtype, flags = ofl->ofl_flags;
1033 	Ifl_desc	*ifl = rsp->rel_isdesc->is_file;
1034 	Half		mach = ifl->ifl_ehdr->e_machine;
1035 	Sym_desc	*sdp = rsp->rel_sym;
1036 	unsigned char	type;
1037 	Conv_inv_buf_t	inv_buf1, inv_buf2;
1038 
1039 	/*
1040 	 * All TLS relocations are illegal in a static executable.
1041 	 */
1042 	if ((flags & (FLG_OF_STATIC | FLG_OF_EXEC)) ==
1043 	    (FLG_OF_STATIC | FLG_OF_EXEC)) {
1044 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_TLSSTAT),
1045 		    conv_reloc_type(mach, rtype, 0, &inv_buf1), ifl->ifl_name,
1046 		    demangle(rsp->rel_sname));
1047 		return (S_ERROR);
1048 	}
1049 
1050 	/*
1051 	 * Any TLS relocation must be against a STT_TLS symbol, all others
1052 	 * are illegal.
1053 	 */
1054 	if ((type = ELF_ST_TYPE(sdp->sd_sym->st_info)) != STT_TLS) {
1055 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_TLSBADSYM),
1056 		    conv_reloc_type(mach, rtype, 0, &inv_buf1), ifl->ifl_name,
1057 		    demangle(rsp->rel_sname),
1058 		    conv_sym_info_type(mach, type, 0, &inv_buf2));
1059 		return (S_ERROR);
1060 	}
1061 
1062 	/*
1063 	 * A dynamic executable can not use the LD or LE reference models to
1064 	 * reference an external symbol.  A shared object can not use the LD
1065 	 * reference model to reference an external symbol.
1066 	 */
1067 	if (!local && (IS_TLS_LD(rtype) ||
1068 	    ((flags & FLG_OF_EXEC) && IS_TLS_LE(rtype)))) {
1069 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_TLSBND),
1070 		    conv_reloc_type(mach, rtype, 0, &inv_buf1), ifl->ifl_name,
1071 		    demangle(rsp->rel_sname), sdp->sd_file->ifl_name);
1072 		return (S_ERROR);
1073 	}
1074 
1075 	/*
1076 	 * The TLS LE model is only allowed for dynamic executables.  The TLS IE
1077 	 * model is allowed for shared objects, but this model has restrictions.
1078 	 * This model can only be used freely in dependencies that are loaded
1079 	 * immediately as part of process initialization.  However, during the
1080 	 * initial runtime handshake with libc that establishes the thread
1081 	 * pointer, a small backup TLS reservation is created.  This area can
1082 	 * be used by objects that are loaded after threads are initialized.
1083 	 * However, this area is limited in size and may have already been
1084 	 * used.  This area is intended for specialized applications, and does
1085 	 * not provide the degree of flexibility dynamic TLS can offer.  Under
1086 	 * -z verbose indicate this restriction to the user.
1087 	 */
1088 	if ((flags & FLG_OF_EXEC) == 0) {
1089 		if (IS_TLS_LE(rtype)) {
1090 			eprintf(ofl->ofl_lml, ERR_FATAL,
1091 			    MSG_INTL(MSG_REL_TLSLE),
1092 			    conv_reloc_type(mach, rtype, 0, &inv_buf1),
1093 			    ifl->ifl_name, demangle(rsp->rel_sname));
1094 			return (S_ERROR);
1095 
1096 		} else if ((IS_TLS_IE(rtype)) && (flags & FLG_OF_VERBOSE)) {
1097 			eprintf(ofl->ofl_lml, ERR_WARNING,
1098 			    MSG_INTL(MSG_REL_TLSIE),
1099 			    conv_reloc_type(mach, rtype, 0, &inv_buf1),
1100 			    ifl->ifl_name, demangle(rsp->rel_sname));
1101 		}
1102 	}
1103 
1104 	return (ld_reloc_TLS(local, rsp, ofl));
1105 }
1106 
1107 uintptr_t
1108 ld_process_sym_reloc(Ofl_desc *ofl, Rel_desc *reld, Rel *reloc, Is_desc *isp,
1109     const char *isname)
1110 {
1111 	Word		rtype = reld->rel_rtype;
1112 	Word		flags = ofl->ofl_flags;
1113 	Sym_desc	*sdp = reld->rel_sym;
1114 	Sym_aux		*sap;
1115 	Boolean		local;
1116 	Conv_inv_buf_t	inv_buf;
1117 
1118 	DBG_CALL(Dbg_reloc_in(ofl->ofl_lml, ELF_DBG_LD, M_MACH, M_REL_SHT_TYPE,
1119 	    (void *)reloc, isname, reld->rel_sname));
1120 
1121 	/*
1122 	 * Indicate this symbol is being used for relocation and therefore must
1123 	 * have its output address updated accordingly (refer to update_osym()).
1124 	 */
1125 	sdp->sd_flags |= FLG_SY_UPREQD;
1126 
1127 	/*
1128 	 * Indicate the section this symbol is defined in has been referenced,
1129 	 * therefor it *is not* a candidate for elimination.
1130 	 */
1131 	if (sdp->sd_isc) {
1132 		sdp->sd_isc->is_flags |= FLG_IS_SECTREF;
1133 		sdp->sd_isc->is_file->ifl_flags |= FLG_IF_FILEREF;
1134 	}
1135 
1136 	reld->rel_usym = sdp;
1137 
1138 	/*
1139 	 * Determine if this symbol is actually an alias to another symbol.  If
1140 	 * so, and the alias is not REF_DYN_SEEN, set rel_usym to point to the
1141 	 * weak symbols strong counter-part.  The one exception is if the
1142 	 * FLG_SY_MVTOCOMM flag is set on the weak symbol.  If this is the case,
1143 	 * the strong is only here because of its promotion, and the weak symbol
1144 	 * should still be used for the relocation reference (see reloc_exec()).
1145 	 */
1146 	sap = sdp->sd_aux;
1147 	if (sap && sap->sa_linkndx &&
1148 	    ((ELF_ST_BIND(sdp->sd_sym->st_info) == STB_WEAK) ||
1149 	    (sdp->sd_flags & FLG_SY_WEAKDEF)) &&
1150 	    (!(sdp->sd_flags & FLG_SY_MVTOCOMM))) {
1151 		Sym_desc *	_sdp;
1152 
1153 		_sdp = sdp->sd_file->ifl_oldndx[sap->sa_linkndx];
1154 		if (_sdp->sd_ref != REF_DYN_SEEN)
1155 			reld->rel_usym = _sdp;
1156 	}
1157 
1158 	/*
1159 	 * Determine whether this symbol should be bound locally or not.
1160 	 * Symbols are bound locally if one of the following is true:
1161 	 *
1162 	 *  o	the symbol is of type STB_LOCAL.
1163 	 *
1164 	 *  o	the output image is not a relocatable object and the relocation
1165 	 *	is relative to the .got.
1166 	 *
1167 	 *  o	the section being relocated is of type SHT_SUNW_dof.  These
1168 	 *	sections must be bound to the functions in the containing
1169 	 *	object and can not be interposed upon.
1170 	 *
1171 	 *  o	the symbol has been reduced (scoped to a local or symbolic) and
1172 	 *	reductions are being processed.
1173 	 *
1174 	 *  o	the -Bsymbolic flag is in use when building a shared object,
1175 	 *	and the symbol hasn't explicitly been defined as nodirect.
1176 	 *
1177 	 *  o	an executable (fixed address) is being created, and the symbol
1178 	 *	is defined in the executable.
1179 	 *
1180 	 *  o	the relocation is against a segment which will not be loaded
1181 	 *	into memory.  In this case, the relocation must be resolved
1182 	 *	now, as ld.so.1 can not process relocations against unmapped
1183 	 *	segments.
1184 	 */
1185 	local = FALSE;
1186 	if (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL) {
1187 		local = TRUE;
1188 	} else if (!(reld->rel_flags & FLG_REL_LOAD)) {
1189 		local = TRUE;
1190 	} else if (sdp->sd_sym->st_shndx != SHN_UNDEF) {
1191 		if (reld->rel_isdesc &&
1192 		    reld->rel_isdesc->is_shdr->sh_type == SHT_SUNW_dof) {
1193 			local = TRUE;
1194 		} else if (!(flags & FLG_OF_RELOBJ) &&
1195 		    (IS_LOCALBND(rtype) || IS_SEG_RELATIVE(rtype))) {
1196 			local = TRUE;
1197 		} else if (sdp->sd_ref == REF_REL_NEED) {
1198 			/*
1199 			 * Global symbols may have been individually reduced in
1200 			 * scope.  If the whole object is to be self contained,
1201 			 * such as when generating an executable or a symbolic
1202 			 * shared object, make sure all relocation symbol
1203 			 * references (sections too) are treated locally.  Note,
1204 			 * explicit no-direct symbols should not be bound to
1205 			 * locally.
1206 			 */
1207 			if ((sdp->sd_flags1 &
1208 			    (FLG_SY1_HIDDEN | FLG_SY1_PROTECT)))
1209 				local = TRUE;
1210 			else if ((flags & FLG_OF_EXEC) ||
1211 			    ((flags & FLG_OF_SYMBOLIC) &&
1212 			    ((sdp->sd_flags1 & FLG_SY1_NDIR) == 0)))
1213 				local = TRUE;
1214 		}
1215 	}
1216 
1217 	/*
1218 	 * If this is a PC_RELATIVE relocation, the relocation could be
1219 	 * compromised if the relocated address is later used as a copy
1220 	 * relocated symbol (PSARC 1999/636, bugid 4187211).  Scan the input
1221 	 * files symbol table to cross reference this relocation offset.
1222 	 */
1223 	if ((ofl->ofl_flags & FLG_OF_SHAROBJ) && IS_PC_RELATIVE(rtype) &&
1224 	    (IS_GOT_PC(rtype) == 0) && (IS_PLT(rtype) == 0)) {
1225 		if (disp_inspect(ofl, reld, local) == S_ERROR)
1226 			return (S_ERROR);
1227 	}
1228 
1229 	/*
1230 	 * GOT based relocations must bind to the object being built - since
1231 	 * they are relevant to the current GOT.  If not building a relocatable
1232 	 * object - give a appropriate error message.
1233 	 */
1234 	if (!local && !(flags & FLG_OF_RELOBJ) && IS_GOT_BASED(rtype)) {
1235 		Ifl_desc	*ifl = reld->rel_isdesc->is_file;
1236 
1237 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_BADGOTBASED),
1238 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
1239 		    0, &inv_buf), ifl->ifl_name, demangle(sdp->sd_name));
1240 		return (S_ERROR);
1241 	}
1242 
1243 	/*
1244 	 * TLS symbols can only have TLS relocations.
1245 	 */
1246 	if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_TLS) &&
1247 	    (IS_TLS_INS(rtype) == 0)) {
1248 		/*
1249 		 * The above test is relaxed if the target section is
1250 		 * non-allocable.
1251 		 */
1252 		if (reld->rel_osdesc->os_shdr->sh_flags & SHF_ALLOC) {
1253 			Ifl_desc	*ifl = reld->rel_isdesc->is_file;
1254 
1255 			eprintf(ofl->ofl_lml, ERR_FATAL,
1256 			    MSG_INTL(MSG_REL_BADTLS),
1257 			    conv_reloc_type(ifl->ifl_ehdr->e_machine,
1258 			    rtype, 0, &inv_buf), ifl->ifl_name,
1259 			    demangle(sdp->sd_name));
1260 			return (S_ERROR);
1261 		}
1262 	}
1263 
1264 	/*
1265 	 * Select the relocation to perform.
1266 	 */
1267 	if (IS_REGISTER(rtype))
1268 		return (ld_reloc_register(reld, isp, ofl));
1269 
1270 	if (flags & FLG_OF_RELOBJ)
1271 		return (reloc_relobj(local, reld, ofl));
1272 
1273 	if (IS_TLS_INS(rtype))
1274 		return (reloc_TLS(local, reld, ofl));
1275 
1276 	if (IS_GOT_OPINS(rtype))
1277 		return (ld_reloc_GOTOP(local, reld, ofl));
1278 
1279 	if (IS_GOT_RELATIVE(rtype))
1280 		return (ld_reloc_GOT_relative(local, reld, ofl));
1281 
1282 	if (local)
1283 		return (ld_reloc_local(reld, ofl));
1284 
1285 	if ((IS_PLT(rtype)) && ((flags & FLG_OF_BFLAG) == 0))
1286 		return (ld_reloc_plt(reld, ofl));
1287 
1288 	if ((sdp->sd_ref == REF_REL_NEED) ||
1289 	    (flags & FLG_OF_BFLAG) || (flags & FLG_OF_SHAROBJ) ||
1290 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_NOTYPE))
1291 		return (ld_add_outrel(NULL, reld, ofl));
1292 
1293 	if (sdp->sd_ref == REF_DYN_NEED)
1294 		return (reloc_exec(reld, ofl));
1295 
1296 	/*
1297 	 * IS_NOT_REL(rtype)
1298 	 */
1299 	return (reloc_generic(reld, ofl));
1300 }
1301 
1302 /*
1303  * Given a relocation that references a local symbol from a discarded
1304  * COMDAT (or SHF_GROUP) section, replace the symbol with the
1305  * corresponding symbol from the section that was kept.
1306  *
1307  * entry:
1308  *	reld - Relocation
1309  *	orig_sdp - Symbol to be replaced. Must be a local symbol (STB_LOCAL).
1310  *
1311  * exit:
1312  *	Returns address of replacement symbol descriptor if one was
1313  *	found, and NULL otherwise.
1314  *
1315  * note:
1316  *	[Note that I'm using the word "COMDAT" here loosely, to refer
1317  *	to actual COMDAT sections as well as to groups tied together
1318  *	with an SHF_GROUP section. SHF_GROUP is simply a more advanced
1319  *	version of the same idea: That multiple versions of the same thing
1320  *	can come in, but only one of them is used for the output.]
1321  *
1322  *	In principle, this sort of sloppy relocation remapping is
1323  *	a questionable practice. All self-referential sections should
1324  *	be in a common SHF_GROUP so that they are all kept or removed
1325  *	together. The problem is that there is no way to ensure that the
1326  *	two sections are similar enough that the replacement section will
1327  *	really supply the correct information. However, we see a couple of
1328  *	situations where it is useful to do this: (1) Older Sun C compilers
1329  *	generated DWARF sections that would refer to one of the COMDAT
1330  *	sections, and (2) gcc, when its COMDAT feature is enabled.
1331  *	It turns out that the GNU ld does these sloppy remappings.
1332  *
1333  *	The GNU ld takes an approach that hard wires special section
1334  *	names and treats them specially. We avoid that practice and
1335  *	try to get the necessary work done relying only on the ELF
1336  *	attributes of the sections and symbols involved. This means
1337  *	that our heuristic is somewhat different than theirs, but the
1338  *	end result is close enough to solve the same problem.
1339  *
1340  *	It is our hope that gcc will eventually phase out the need
1341  *	for sloppy relocations, and this won't be needed. In the
1342  *	meantime, the option allows us to interoperate.
1343  *
1344  *	Here is how we do it: The symbol points at the input section,
1345  *	and the input section points at the output section to which it
1346  *	is assigned. The output section contains a list of all of the
1347  *	input sections that have been mapped to it, including the
1348  *	corresponding COMDAT section that was kept. The kept COMDAT
1349  *	section contains a reference to its input file, where we can find
1350  *	the array of all the symbols in that file. From the input file,
1351  *	we then locate the corresponding symbol that references the kept
1352  *	COMDAT section.
1353  *
1354  */
1355 static Sym_desc *
1356 sloppy_comdat_reloc(Ofl_desc *ofl, Rel_desc *reld, Sym_desc *sdp)
1357 {
1358 	Listnode	*lnp;
1359 	Is_desc		*rep_isp;
1360 	const char	*is_name;
1361 	Sym		*sym = sdp->sd_sym;
1362 	Is_desc		*isp = sdp->sd_isc;
1363 	Conv_inv_buf_t	inv_buf;
1364 
1365 	/*
1366 	 * ld_place_section() can alter the section name if it contains
1367 	 * a '%' character. We need to use the original name in this
1368 	 * case.
1369 	 */
1370 	is_name = isp->is_basename ? isp->is_basename : isp->is_name;
1371 
1372 	/*
1373 	 * 1) The caller is required to ensure that the input symbol is
1374 	 *	local. We don't check for that here.
1375 	 * 2) If the discarded section has not been assigned to an
1376 	 *	output section, we won't be able to continue.
1377 	 * 3) This operation only applies to SHT_SUNW_COMDAT sections
1378 	 *	or sections contained within a COMDAT group (SHF_GROUP).
1379 	 */
1380 	if ((isp->is_osdesc == NULL) ||
1381 	    ((isp->is_shdr->sh_type != SHT_SUNW_COMDAT) &&
1382 	    ((isp->is_shdr->sh_flags & SHF_GROUP) == 0)))
1383 		return (NULL);
1384 
1385 	/*
1386 	 * Examine each input section assigned to this output section.
1387 	 * The replacement section must:
1388 	 *	- Have the same name as the original
1389 	 *	- Not have been discarded
1390 	 *	- Have the same size
1391 	 *	- Have the same section type (and note that this type may
1392 	 *		be SHT_SUNW_COMDAT).
1393 	 *	- Have the same SHF_GROUP flag setting (either on or off)
1394 	 *	- Must be a COMDAT section of one form or the other.
1395 	 */
1396 	/* BEGIN CSTYLED */
1397 	for (LIST_TRAVERSE(&isp->is_osdesc->os_isdescs, lnp, rep_isp)) {
1398 	    const char *rep_is_name = rep_isp->is_basename ?
1399 		rep_isp->is_basename : rep_isp->is_name;
1400 
1401 	    if (!(rep_isp->is_flags & FLG_IS_DISCARD) &&
1402 		(isp->is_indata->d_size == rep_isp->is_indata->d_size) &&
1403 		(isp->is_shdr->sh_type == rep_isp->is_shdr->sh_type) &&
1404 		((isp->is_shdr->sh_flags & SHF_GROUP) ==
1405 		(rep_isp->is_shdr->sh_flags & SHF_GROUP)) &&
1406 		(strcmp(rep_is_name, is_name) == 0)) {
1407 		/*
1408 		 * We found the kept COMDAT section. Now, look at all of the
1409 		 * symbols from the input file that contains it to find the
1410 		 * symbol that corresponds to the one we started with:
1411 		 *	- Hasn't been discarded
1412 		 *	- Has section index of kept section
1413 		 *	- If one symbol has a name, the other must have
1414 		 *		the same name. The st_name field of a symbol
1415 		 *		is 0 if there is no name, and is a string
1416 		 *		table offset otherwise. The string table
1417 		 *		offsets may well not agree --- it is the
1418 		 *		actual string that matters.
1419 		 *	- Type and binding attributes match (st_info)
1420 		 *	- Values match (st_value)
1421 		 *	- Sizes match (st_size)
1422 		 *	- Visibility matches (st_other)
1423 		 */
1424 		Word scnndx = rep_isp->is_scnndx;
1425 		Sym_desc **oldndx = rep_isp->is_file->ifl_oldndx;
1426 		Word symscnt = rep_isp->is_file->ifl_symscnt;
1427 		Sym_desc *rep_sdp;
1428 		Sym *rep_sym;
1429 
1430 		while (symscnt--) {
1431 		    rep_sdp = *oldndx++;
1432 		    if (rep_sdp && !(rep_sdp->sd_flags & FLG_SY_ISDISC) &&
1433 			((rep_sym = rep_sdp->sd_sym)->st_shndx == scnndx) &&
1434 			((sym->st_name == 0) == (rep_sym->st_name == 0)) &&
1435 			!((sym->st_name != 0) &&
1436 			    (strcmp(sdp->sd_name, rep_sdp->sd_name) != 0)) &&
1437 			(sym->st_info == rep_sym->st_info) &&
1438 			(sym->st_value == rep_sym->st_value) &&
1439 			(sym->st_size == rep_sym->st_size) &&
1440 			(sym->st_other == rep_sym->st_other)) {
1441 
1442 			if (ofl->ofl_flags & FLG_OF_VERBOSE) {
1443 			    Ifl_desc *ifl = sdp->sd_file;
1444 
1445 			    if (sym->st_name != 0) {
1446 				eprintf(ofl->ofl_lml, ERR_WARNING,
1447 				    MSG_INTL(MSG_REL_SLOPCDATNAM),
1448 				    conv_reloc_type(ifl->ifl_ehdr->e_machine,
1449 					reld->rel_rtype, 0, &inv_buf),
1450 				    ifl->ifl_name, reld->rel_isdesc->is_name,
1451 				    rep_sdp->sd_name, is_name,
1452 				    rep_sdp->sd_file->ifl_name);
1453 			    } else {
1454 				eprintf(ofl->ofl_lml, ERR_WARNING,
1455 				    MSG_INTL(MSG_REL_SLOPCDATNONAM),
1456 				    conv_reloc_type(
1457 					ifl->ifl_ehdr->e_machine,
1458 					reld->rel_rtype, 0, &inv_buf),
1459 				    ifl->ifl_name, reld->rel_isdesc->is_name,
1460 				    is_name, rep_sdp->sd_file->ifl_name);
1461 			    }
1462 			}
1463 			DBG_CALL(Dbg_reloc_sloppycomdat(ofl->ofl_lml,
1464 			    is_name, rep_sdp));
1465 			return (rep_sdp);
1466 		    }
1467 		}
1468 	    }
1469 	}
1470 	/* END CSTYLED */
1471 
1472 	/* If didn't return above, we didn't find it */
1473 	return (NULL);
1474 }
1475 
1476 
1477 /*
1478  * Generate a name for a relocation descriptor that has an STT_SECTION
1479  * symbol associated with it. If it is a regular input section, it will
1480  * look like:
1481  *
1482  *	"XXX (section)"
1483  *
1484  * If it is a generated section created to receive the strings from
1485  * input SHF_MERGE|SHF_STRINGS sections, then it will look like:
1486  *
1487  *	"XXX (merged string section)"
1488  *
1489  * STT_SECTION relocations to the same section tend to come in clusters,
1490  * so we use a static variable to retain the last string we generate. If
1491  * another one comes along for the same section before some other section
1492  * intervenes, we will reuse the string.
1493  *
1494  * entry:
1495  *	sdp - STT_SECTION symbol for which a relocation descriptor name
1496  *		should be generated.
1497  *	sd_isc - NULL, or input section that should be used instead of
1498  *		the input section already assocated with the symbol
1499  *		(sdp->sd_isc). This value is set to a non-NULL value when
1500  *		a transition from the old input section to a new one is
1501  *		being made, but the symbol has not yet been updated.
1502  */
1503 const const char *
1504 ld_section_reld_name(Sym_desc *sdp, Is_desc *sd_isc)
1505 {
1506 	static Is_desc	*last_sd_isc = NULL;
1507 	static char	*namestr;
1508 
1509 	const char	*fmt;
1510 	size_t		len;
1511 
1512 	/*
1513 	 * If caller didn't supply a replacement input section,
1514 	 * use the one referenced by the symbol.
1515 	 */
1516 	if (sd_isc == NULL)
1517 		sd_isc = sdp->sd_isc;
1518 
1519 	if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) &&
1520 	    (sd_isc != NULL) && (sd_isc->is_name != NULL)) {
1521 		if (last_sd_isc != sd_isc) {
1522 			fmt = (sd_isc->is_flags & FLG_IS_GNSTRMRG) ?
1523 			    MSG_INTL(MSG_STR_SECTION_MSTR) :
1524 			    MSG_INTL(MSG_STR_SECTION);
1525 			len = strlen(fmt) +
1526 			    strlen(sd_isc->is_name) + 1;
1527 
1528 			if ((namestr = libld_malloc(len)) == 0)
1529 				return (NULL);
1530 			(void) snprintf(namestr, len, fmt,
1531 			    sd_isc->is_name);
1532 			last_sd_isc = sd_isc;	/* Remember for next time */
1533 		}
1534 		return (namestr);
1535 	}
1536 
1537 	return (NULL);
1538 }
1539 
1540 
1541 /*
1542  * Generate relocation descriptor and dispatch
1543  */
1544 static uintptr_t
1545 process_reld(Ofl_desc *ofl, Is_desc *isp, Rel_desc *reld, Word rsndx,
1546     Rel *reloc)
1547 {
1548 	Ifl_desc	*ifl = isp->is_file;
1549 	Word		rtype = reld->rel_rtype;
1550 	Sym_desc	*sdp;
1551 	Conv_inv_buf_t	inv_buf;
1552 
1553 	/*
1554 	 * Make sure the relocation is in the valid range.
1555 	 */
1556 	if (rtype >= M_R_NUM) {
1557 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_INVALRELT),
1558 		    ifl->ifl_name, isp->is_name, rtype);
1559 		return (S_ERROR);
1560 	}
1561 
1562 	ofl->ofl_entrelscnt++;
1563 
1564 	/*
1565 	 * Special case: a register symbol associated with symbol index 0 is
1566 	 * initialized (i.e., relocated) to a constant from the r_addend field
1567 	 * rather than from a symbol value.
1568 	 */
1569 	if (IS_REGISTER(rtype) && (rsndx == 0)) {
1570 		reld->rel_sym = 0;
1571 		reld->rel_sname = MSG_ORIG(MSG_STR_EMPTY);
1572 
1573 		DBG_CALL(Dbg_reloc_in(ofl->ofl_lml, ELF_DBG_LD, M_MACH,
1574 		    isp->is_shdr->sh_type, (void *)reloc, isp->is_name,
1575 		    reld->rel_sname));
1576 		return (ld_reloc_register(reld, isp, ofl));
1577 	}
1578 
1579 	/*
1580 	 * Come up with a descriptive name for the symbol:
1581 	 *	- If it is a named symbol, use the name as is
1582 	 *	- If it is an STT_SECTION symbol, generate a descriptive
1583 	 *		string that incorporates the section name.
1584 	 *	- Otherwise, supply an "unknown" string.
1585 	 * Note that bogus relocations can result in a null symbol descriptor
1586 	 * (sdp), the error condition should be caught below after determining
1587 	 * whether a valid symbol name exists.
1588 	 */
1589 	sdp = ifl->ifl_oldndx[rsndx];
1590 	if ((sdp != NULL) && sdp->sd_name && *sdp->sd_name) {
1591 		reld->rel_sname = sdp->sd_name;
1592 	} else if ((sdp != NULL) &&
1593 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) &&
1594 	    (sdp->sd_isc != NULL) && (sdp->sd_isc->is_name != NULL)) {
1595 		if ((reld->rel_sname = ld_section_reld_name(sdp, NULL)) == NULL)
1596 			return (S_ERROR);
1597 	} else {
1598 		static char *strunknown;
1599 
1600 		if (strunknown == 0)
1601 			strunknown = (char *)MSG_INTL(MSG_STR_UNKNOWN);
1602 		reld->rel_sname = strunknown;
1603 	}
1604 
1605 	/*
1606 	 * If for some reason we have a null relocation record issue a
1607 	 * warning and continue (the compiler folks can get into this
1608 	 * state some time).  Normal users should never see this error.
1609 	 */
1610 	if (rtype == M_R_NONE) {
1611 		DBG_CALL(Dbg_reloc_in(ofl->ofl_lml, ELF_DBG_LD, M_MACH,
1612 		    M_REL_SHT_TYPE, (void *)reloc, isp->is_name,
1613 		    reld->rel_sname));
1614 		eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_REL_NULL),
1615 		    ifl->ifl_name, isp->is_name);
1616 		return (1);
1617 	}
1618 
1619 	if (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) && IS_NOTSUP(rtype)) {
1620 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_NOTSUP),
1621 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
1622 		    0, &inv_buf), ifl->ifl_name, isp->is_name);
1623 		return (S_ERROR);
1624 	}
1625 
1626 	/*
1627 	 * If we are here, we know that the relocation requires reference
1628 	 * symbol. If no symbol is assigned, this is a fatal error.
1629 	 */
1630 	if (sdp == NULL) {
1631 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_NOSYMBOL),
1632 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
1633 		    0, &inv_buf), isp->is_name, ifl->ifl_name,
1634 		    EC_XWORD(reloc->r_offset));
1635 		return (S_ERROR);
1636 	}
1637 
1638 	if (sdp->sd_flags1 & FLG_SY1_IGNORE)
1639 		return (1);
1640 
1641 	/*
1642 	 * If this symbol is part of a DISCARDED section attempt to find another
1643 	 * definition.
1644 	 */
1645 	if (sdp->sd_flags & FLG_SY_ISDISC) {
1646 		Sym_desc *nsdp = NULL;
1647 
1648 		if (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL) {
1649 			/*
1650 			 * If "-z relaxreloc", then check to see if
1651 			 * this is a reference to a discarded COMDAT
1652 			 * section that can be replaced with the
1653 			 * one that was kept.
1654 			 */
1655 			if (ofl->ofl_flags1 & FLG_OF1_RLXREL)
1656 				nsdp = sloppy_comdat_reloc(ofl, reld, sdp);
1657 		} else if (reld->rel_sname == sdp->sd_name) {
1658 			nsdp = ld_sym_find(sdp->sd_name, SYM_NOHASH, 0, ofl);
1659 		}
1660 		if (nsdp == 0) {
1661 			eprintf(ofl->ofl_lml, ERR_FATAL,
1662 			    MSG_INTL(MSG_REL_SYMDISC),
1663 			    ifl->ifl_name, isp->is_name,
1664 			    demangle(sdp->sd_name), sdp->sd_isc->is_name);
1665 			return (S_ERROR);
1666 		}
1667 		ifl->ifl_oldndx[rsndx] = sdp = nsdp;
1668 	}
1669 
1670 	/*
1671 	 * If this is a global symbol, determine whether its visibility needs
1672 	 * adjusting.
1673 	 */
1674 	if (sdp->sd_aux && ((sdp->sd_flags & FLG_SY_VISIBLE) == 0))
1675 		ld_sym_adjust_vis(sdp, ofl);
1676 
1677 	/*
1678 	 * Ignore any relocation against a section that will not be in the
1679 	 * output file (has been stripped).
1680 	 */
1681 	if ((sdp->sd_isc == 0) &&
1682 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION))
1683 		return (1);
1684 
1685 	/*
1686 	 * If the input section exists, but the section has not been associated
1687 	 * to an output section, then this is a little suspicious.
1688 	 */
1689 	if (sdp->sd_isc && (sdp->sd_isc->is_osdesc == 0) &&
1690 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION)) {
1691 		eprintf(ofl->ofl_lml, ERR_WARNING, MSG_INTL(MSG_RELINVSEC),
1692 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
1693 		    0, &inv_buf), ifl->ifl_name, isp->is_name,
1694 		    sdp->sd_isc->is_name);
1695 		return (1);
1696 	}
1697 
1698 	/*
1699 	 * If the symbol for this relocation is invalid (which should have
1700 	 * generated a message during symbol processing), or the relocation
1701 	 * record's symbol reference is in any other way invalid, then it's
1702 	 * about time we gave up.
1703 	 */
1704 	if ((sdp->sd_flags & FLG_SY_INVALID) || (rsndx == 0) ||
1705 	    (rsndx >= ifl->ifl_symscnt)) {
1706 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_UNKNWSYM),
1707 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
1708 		    0, &inv_buf), ifl->ifl_name, isp->is_name,
1709 		    demangle(reld->rel_sname), EC_XWORD(reloc->r_offset),
1710 		    EC_WORD(rsndx));
1711 		return (S_ERROR);
1712 	}
1713 
1714 	/*
1715 	 * Size relocations against section symbols are presently unsupported.
1716 	 * There is a question as to whether the input section size, or output
1717 	 * section size would be used.  Until an explicit requirement is
1718 	 * established for either case, we'll punt.
1719 	 */
1720 	if (IS_SIZE(rtype) &&
1721 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION)) {
1722 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_UNSUPSIZE),
1723 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
1724 		    0, &inv_buf), ifl->ifl_name, isp->is_name);
1725 		return (S_ERROR);
1726 	}
1727 
1728 	reld->rel_sym = sdp;
1729 	return (ld_process_sym_reloc(ofl, reld, reloc, isp, isp->is_name));
1730 }
1731 
1732 static uintptr_t
1733 reloc_section(Ofl_desc *ofl, Is_desc *isect, Is_desc *rsect, Os_desc *osect)
1734 {
1735 	Rel		*rend;		/* end of relocation section data */
1736 	Rel		*reloc;		/* current relocation entry */
1737 	Xword		rsize;		/* size of relocation section data */
1738 	Xword		entsize;	/* size of relocation entry */
1739 	Rel_desc	reld;		/* relocation descriptor */
1740 	Shdr *		shdr;
1741 	Word		flags = 0;
1742 	uintptr_t	ret = 1;
1743 
1744 	shdr = rsect->is_shdr;
1745 	rsize = shdr->sh_size;
1746 	reloc = (Rel *)rsect->is_indata->d_buf;
1747 
1748 	/*
1749 	 * Decide entry size.
1750 	 */
1751 	if (((entsize = shdr->sh_entsize) == 0) || (entsize > rsize)) {
1752 		if (shdr->sh_type == SHT_RELA)
1753 			entsize = sizeof (Rela);
1754 		else
1755 			entsize = sizeof (Rel);
1756 	}
1757 
1758 	/*
1759 	 * Build up the basic information in for the Rel_desc structure.
1760 	 */
1761 	reld.rel_osdesc = osect;
1762 	reld.rel_isdesc = isect;
1763 	reld.rel_move = 0;
1764 
1765 	if ((ofl->ofl_flags & FLG_OF_RELOBJ) ||
1766 	    (osect && (osect->os_sgdesc->sg_phdr.p_type == PT_LOAD)))
1767 		flags |= FLG_REL_LOAD;
1768 
1769 	if (shdr->sh_info == 0)
1770 		flags |= FLG_REL_NOINFO;
1771 
1772 	DBG_CALL(Dbg_reloc_proc(ofl->ofl_lml, osect, isect, rsect));
1773 
1774 	for (rend = (Rel *)((uintptr_t)reloc + (uintptr_t)rsize);
1775 	    reloc < rend;
1776 	    reloc = (Rel *)((uintptr_t)reloc + (uintptr_t)entsize)) {
1777 		Word	rsndx;
1778 
1779 		/*
1780 		 * Initialize the relocation record information and process
1781 		 * the individual relocation.  Reinitialize the flags to
1782 		 * insure we don't carry any state over from the previous
1783 		 * relocation records processing.
1784 		 */
1785 		reld.rel_flags = flags;
1786 		rsndx = ld_init_rel(&reld, (void *)reloc);
1787 
1788 		if (process_reld(ofl, rsect, &reld, rsndx, reloc) == S_ERROR)
1789 			ret = S_ERROR;
1790 	}
1791 	return (ret);
1792 }
1793 
1794 static uintptr_t
1795 reloc_segments(int wr_flag, Ofl_desc *ofl)
1796 {
1797 	Listnode	*lnp1;
1798 	Sg_desc		*sgp;
1799 	Is_desc		*isp;
1800 
1801 	for (LIST_TRAVERSE(&ofl->ofl_segs, lnp1, sgp)) {
1802 		Os_desc	*osp;
1803 		Aliste	idx;
1804 
1805 		if ((sgp->sg_phdr.p_flags & PF_W) != wr_flag)
1806 			continue;
1807 
1808 		for (APLIST_TRAVERSE(sgp->sg_osdescs, idx, osp)) {
1809 			Is_desc		*risp;
1810 			Listnode	*lnp3;
1811 
1812 			osp->os_szoutrels = 0;
1813 			for (LIST_TRAVERSE(&(osp->os_relisdescs), lnp3, risp)) {
1814 				Word	indx;
1815 
1816 				/*
1817 				 * Determine the input section that this
1818 				 * relocation information refers to.
1819 				 */
1820 				indx = risp->is_shdr->sh_info;
1821 				isp = risp->is_file->ifl_isdesc[indx];
1822 
1823 				/*
1824 				 * Do not process relocations against sections
1825 				 * which are being discarded (COMDAT)
1826 				 */
1827 				if (isp->is_flags & FLG_IS_DISCARD)
1828 					continue;
1829 
1830 				if (reloc_section(ofl, isp, risp, osp) ==
1831 				    S_ERROR)
1832 					return (S_ERROR);
1833 			}
1834 
1835 			/*
1836 			 * Check for relocations against non-writable
1837 			 * allocatable sections.
1838 			 */
1839 			if ((osp->os_szoutrels) &&
1840 			    (sgp->sg_phdr.p_type == PT_LOAD) &&
1841 			    ((sgp->sg_phdr.p_flags & PF_W) == 0)) {
1842 				ofl->ofl_flags |= FLG_OF_TEXTREL;
1843 				ofl->ofl_dtflags |= DF_TEXTREL;
1844 			}
1845 		}
1846 	}
1847 
1848 	return (1);
1849 }
1850 
1851 /*
1852  * Move Section related function
1853  * Get move entry
1854  */
1855 static Move *
1856 get_move_entry(Is_desc *rsect, Xword roffset)
1857 {
1858 	Ifl_desc	*ifile = rsect->is_file;
1859 	Shdr		*rshdr = rsect->is_shdr;
1860 	Is_desc		*misp;
1861 	Shdr		*mshdr;
1862 	Xword 		midx;
1863 	Move		*ret;
1864 
1865 	/*
1866 	 * Set info for the target move section
1867 	 */
1868 	misp = ifile->ifl_isdesc[rshdr->sh_info];
1869 	mshdr = (ifile->ifl_isdesc[rshdr->sh_info])->is_shdr;
1870 
1871 	if (mshdr->sh_entsize == 0)
1872 		return ((Move *)0);
1873 	midx = roffset / mshdr->sh_entsize;
1874 
1875 	ret = (Move *)misp->is_indata->d_buf;
1876 	ret += midx;
1877 
1878 	/*
1879 	 * If this is an illgal entry, retun NULL.
1880 	 */
1881 	if ((midx * mshdr->sh_entsize) >= mshdr->sh_size)
1882 		return ((Move *)0);
1883 	return (ret);
1884 }
1885 
1886 /*
1887  * Relocation against Move Table.
1888  */
1889 static uintptr_t
1890 process_movereloc(Ofl_desc *ofl, Is_desc *rsect)
1891 {
1892 	Ifl_desc	*file = rsect->is_file;
1893 	Rel		*rend, *reloc;
1894 	Xword 		rsize, entsize;
1895 	static Rel_desc reld_zero;
1896 	Rel_desc 	reld;
1897 
1898 	rsize = rsect->is_shdr->sh_size;
1899 	reloc = (Rel *)rsect->is_indata->d_buf;
1900 
1901 	reld = reld_zero;
1902 
1903 	/*
1904 	 * Decide entry size
1905 	 */
1906 	entsize = rsect->is_shdr->sh_entsize;
1907 	if ((entsize == 0) ||
1908 	    (entsize > rsect->is_shdr->sh_size)) {
1909 		if (rsect->is_shdr->sh_type == SHT_RELA)
1910 			entsize = sizeof (Rela);
1911 		else
1912 			entsize = sizeof (Rel);
1913 	}
1914 
1915 	/*
1916 	 * Go through the relocation entries.
1917 	 */
1918 	for (rend = (Rel *)((uintptr_t)reloc + (uintptr_t)rsize);
1919 	    reloc < rend;
1920 	    reloc = (Rel *)((uintptr_t)reloc + (uintptr_t)entsize)) {
1921 		Sym_desc *	psdp;
1922 		Move *		mp;
1923 		Word		rsndx;
1924 
1925 		/*
1926 		 * Initialize the relocation record information.
1927 		 */
1928 		reld.rel_flags = FLG_REL_LOAD;
1929 		rsndx = ld_init_rel(&reld, (void *)reloc);
1930 
1931 		if (((mp = get_move_entry(rsect, reloc->r_offset)) == 0) ||
1932 		    ((reld.rel_move = libld_malloc(sizeof (Mv_desc))) == 0))
1933 			return (S_ERROR);
1934 
1935 		psdp = file->ifl_oldndx[ELF_M_SYM(mp->m_info)];
1936 		reld.rel_move->mvd_move = mp;
1937 		reld.rel_move->mvd_sym = psdp;
1938 
1939 		if (psdp->sd_flags & FLG_SY_PAREXPN) {
1940 			int	_num, num;
1941 
1942 			reld.rel_osdesc = ofl->ofl_issunwdata1->is_osdesc;
1943 			reld.rel_isdesc = ofl->ofl_issunwdata1;
1944 			reld.rel_roffset = mp->m_poffset;
1945 
1946 			for (num = mp->m_repeat, _num = 0; _num < num; _num++) {
1947 				reld.rel_roffset +=
1948 				    /* LINTED */
1949 				    (_num * ELF_M_SIZE(mp->m_info));
1950 
1951 				/*
1952 				 * Generate Reld
1953 				 */
1954 				if (process_reld(ofl,
1955 				    rsect, &reld, rsndx, reloc) == S_ERROR)
1956 					return (S_ERROR);
1957 			}
1958 		} else {
1959 			/*
1960 			 * Generate Reld
1961 			 */
1962 			reld.rel_flags |= FLG_REL_MOVETAB;
1963 			reld.rel_osdesc = ofl->ofl_osmove;
1964 			reld.rel_isdesc =
1965 			    ofl->ofl_osmove->os_isdescs.head->data;
1966 
1967 			if (process_reld(ofl,
1968 			    rsect, &reld, rsndx, reloc) == S_ERROR)
1969 				return (S_ERROR);
1970 		}
1971 	}
1972 	return (1);
1973 }
1974 
1975 /*
1976  * This function is similar to reloc_init().
1977  *
1978  * This function is called when the SHT_SUNW_move table is expanded
1979  * and there were relocation against the SHT_SUNW_move section.
1980  */
1981 static uintptr_t
1982 reloc_movesections(Ofl_desc *ofl)
1983 {
1984 	Listnode	*lnp1;
1985 	Is_desc		*risp;
1986 	uintptr_t	ret = 1;
1987 
1988 	/*
1989 	 * Generate/Expand relocation entries
1990 	 */
1991 	for (LIST_TRAVERSE(&ofl->ofl_mvrelisdescs, lnp1, risp)) {
1992 		if (process_movereloc(ofl, risp) == S_ERROR)
1993 			ret = S_ERROR;
1994 	}
1995 
1996 	return (ret);
1997 }
1998 
1999 /*
2000  * Count the number of output relocation entries, global offset table entries,
2001  * and procedure linkage table entries.  This function searches the segment and
2002  * outsect lists and passes each input reloc section to process_reloc().
2003  * It allocates space for any output relocations needed.  And builds up
2004  * the relocation structures for later processing.
2005  */
2006 uintptr_t
2007 ld_reloc_init(Ofl_desc *ofl)
2008 {
2009 	Listnode	*lnp;
2010 	Is_desc		*isp;
2011 	Sym_desc	*sdp;
2012 
2013 	/*
2014 	 * At this point we have finished processing all input symbols.  Make
2015 	 * sure we add any absolute (internal) symbols before continuing with
2016 	 * any relocation processing.
2017 	 */
2018 	if (ld_sym_spec(ofl) == S_ERROR)
2019 		return (S_ERROR);
2020 
2021 	ofl->ofl_gotcnt = M_GOT_XNumber;
2022 
2023 	/*
2024 	 * First process all of the relocations against NON-writable
2025 	 * segments followed by relocations against the writeable segments.
2026 	 *
2027 	 * This separation is so that when the writable segments are processed
2028 	 * we know whether or not a COPYRELOC will be produced for any symbols.
2029 	 * If relocations aren't processed in this order, a COPYRELOC and a
2030 	 * regular relocation can be produced against the same symbol.  The
2031 	 * regular relocation would be redundant.
2032 	 */
2033 	if (reloc_segments(0, ofl) == S_ERROR)
2034 		return (S_ERROR);
2035 
2036 	if (reloc_segments(PF_W, ofl) == S_ERROR)
2037 		return (S_ERROR);
2038 
2039 	/*
2040 	 * Process any extra relocations.  These are relocation sections that
2041 	 * have a NULL sh_info.
2042 	 */
2043 	for (LIST_TRAVERSE(&ofl->ofl_extrarels, lnp, isp)) {
2044 		if (reloc_section(ofl, NULL, isp, NULL) == S_ERROR)
2045 			return (S_ERROR);
2046 	}
2047 
2048 	/*
2049 	 * If there were relocation against move table,
2050 	 * process the relocation sections.
2051 	 */
2052 	if (reloc_movesections(ofl) == S_ERROR)
2053 		return (S_ERROR);
2054 
2055 	/*
2056 	 * Now all the relocations are pre-processed,
2057 	 * check the validity of copy relocations.
2058 	 */
2059 	if (ofl->ofl_copyrels.head != 0) {
2060 		Copy_rel	*cpyrel;
2061 
2062 		for (LIST_TRAVERSE(&ofl->ofl_copyrels, lnp, cpyrel)) {
2063 			sdp = cpyrel->copyrel_symd;
2064 
2065 			/*
2066 			 * If there were no displacement relocation
2067 			 * in this file, don't worry about it.
2068 			 */
2069 			if (sdp->sd_file->ifl_flags &
2070 			    (FLG_IF_DISPPEND | FLG_IF_DISPDONE))
2071 				is_disp_copied(ofl, cpyrel);
2072 		}
2073 	}
2074 
2075 	/*
2076 	 * GOT sections are created for dynamic executables and shared objects
2077 	 * if the FLG_OF_BLDGOT is set, or explicit reference has been made to
2078 	 * a GOT symbol.
2079 	 */
2080 	if (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) &&
2081 	    ((ofl->ofl_flags & FLG_OF_BLDGOT) ||
2082 	    ((((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL),
2083 	    SYM_NOHASH, 0, ofl)) != 0) ||
2084 	    ((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL_U),
2085 	    SYM_NOHASH, 0, ofl)) != 0)) && (sdp->sd_ref != REF_DYN_SEEN)))) {
2086 		if (ld_make_got(ofl) == S_ERROR)
2087 			return (S_ERROR);
2088 
2089 #if	defined(__sparc)
2090 		if (ld_allocate_got(ofl) == S_ERROR)
2091 			return (S_ERROR);
2092 #elif	defined(__x86)
2093 /* nothing to do */
2094 #else
2095 #error Unknown architecture!
2096 #endif
2097 	}
2098 
2099 	return (1);
2100 }
2101 
2102 /*
2103  * Simple comparison routine to be used by qsort() for
2104  * the sorting of the output relocation list.
2105  *
2106  * The reloc_compare() routine results in a relocation
2107  * table which is located on:
2108  *
2109  *	file referenced (NEEDED NDX)
2110  *	referenced symbol
2111  *	relocation offset
2112  *
2113  * This provides the most efficient traversal of the relocation
2114  * table at run-time.
2115  */
2116 static int
2117 reloc_compare(Reloc_list *i, Reloc_list *j)
2118 {
2119 
2120 	/*
2121 	 * first - sort on neededndx
2122 	 */
2123 	if (i->rl_key1 > j->rl_key1)
2124 		return (1);
2125 	if (i->rl_key1 < j->rl_key1)
2126 		return (-1);
2127 
2128 	/*
2129 	 * Then sort on symbol
2130 	 */
2131 	if ((uintptr_t)i->rl_key2 > (uintptr_t)j->rl_key2)
2132 		return (1);
2133 	if ((uintptr_t)i->rl_key2 < (uintptr_t)j->rl_key2)
2134 		return (-1);
2135 
2136 	/*
2137 	 * i->key2 == j->key2
2138 	 *
2139 	 * At this point we fall back to key2 (offsets) to
2140 	 * sort the output relocations.  Ideally this will
2141 	 * make for the most efficient processing of these
2142 	 * relocations at run-time.
2143 	 */
2144 	if (i->rl_key3 > j->rl_key3)
2145 		return (1);
2146 	if (i->rl_key3 < j->rl_key3)
2147 		return (-1);
2148 	return (0);
2149 }
2150 
2151 static uintptr_t
2152 do_sorted_outrelocs(Ofl_desc *ofl)
2153 {
2154 	Rel_desc	*orsp;
2155 	Rel_cache	*rcp;
2156 	Listnode	*lnp;
2157 	Reloc_list	*sorted_list;
2158 	Word		index = 0;
2159 	int		debug = 0;
2160 	uintptr_t	error = 1;
2161 
2162 	if ((sorted_list = libld_malloc((size_t)(sizeof (Reloc_list) *
2163 	    ofl->ofl_reloccnt))) == NULL)
2164 		return (S_ERROR);
2165 
2166 	/*
2167 	 * All but the PLT output relocations are sorted in the output file
2168 	 * based upon their sym_desc.  By doing this multiple relocations
2169 	 * against the same symbol are grouped together, thus when the object
2170 	 * is later relocated by ld.so.1 it will take advantage of the symbol
2171 	 * cache that ld.so.1 has.  This can significantly reduce the runtime
2172 	 * relocation cost of a dynamic object.
2173 	 *
2174 	 * PLT relocations are not sorted because the order of the PLT
2175 	 * relocations is used by ld.so.1 to determine what symbol a PLT
2176 	 * relocation is against.
2177 	 */
2178 	for (LIST_TRAVERSE(&ofl->ofl_outrels, lnp, rcp)) {
2179 		/*LINTED*/
2180 		for (orsp = (Rel_desc *)(rcp + 1);
2181 		    orsp < rcp->rc_free; orsp++) {
2182 			if (debug == 0) {
2183 				DBG_CALL(Dbg_reloc_dooutrel(ofl->ofl_lml,
2184 				    M_REL_SHT_TYPE));
2185 				debug = 1;
2186 			}
2187 
2188 			/*
2189 			 * If it's a PLT relocation we output it now in the
2190 			 * order that it was originally processed.
2191 			 */
2192 			if (orsp->rel_flags & FLG_REL_PLT) {
2193 				if (ld_perform_outreloc(orsp, ofl) == S_ERROR)
2194 					error = S_ERROR;
2195 				continue;
2196 			}
2197 
2198 			if ((orsp->rel_rtype == M_R_RELATIVE) ||
2199 			    (orsp->rel_rtype == M_R_REGISTER)) {
2200 				sorted_list[index].rl_key1 = 0;
2201 				sorted_list[index].rl_key2 =
2202 				    /* LINTED */
2203 				    (Sym_desc *)(uintptr_t)orsp->rel_rtype;
2204 			} else {
2205 				sorted_list[index].rl_key1 =
2206 				    orsp->rel_sym->sd_file->ifl_neededndx;
2207 				sorted_list[index].rl_key2 =
2208 				    orsp->rel_sym;
2209 			}
2210 
2211 			if (orsp->rel_flags & FLG_REL_GOT)
2212 				sorted_list[index].rl_key3 =
2213 				    ld_calc_got_offset(orsp, ofl);
2214 			else {
2215 				if (orsp->rel_rtype == M_R_REGISTER)
2216 					sorted_list[index].rl_key3 = 0;
2217 				else {
2218 					sorted_list[index].rl_key3 =
2219 					    orsp->rel_roffset +
2220 					    (Xword)_elf_getxoff(orsp->
2221 					    rel_isdesc->is_indata) +
2222 					    orsp->rel_isdesc->is_osdesc->
2223 					    os_shdr->sh_addr;
2224 				}
2225 			}
2226 
2227 			sorted_list[index++].rl_rsp = orsp;
2228 		}
2229 	}
2230 
2231 	qsort(sorted_list, (size_t)ofl->ofl_reloccnt, sizeof (Reloc_list),
2232 	    (int (*)(const void *, const void *))reloc_compare);
2233 
2234 	/*
2235 	 * All output relocations have now been sorted, go through
2236 	 * and process each relocation.
2237 	 */
2238 	for (index = 0; index < ofl->ofl_reloccnt; index++) {
2239 		if (ld_perform_outreloc(sorted_list[index].rl_rsp, ofl) ==
2240 		    S_ERROR)
2241 			error = S_ERROR;
2242 	}
2243 
2244 	return (error);
2245 }
2246 
2247 /*
2248  * Process relocations.  Finds every input relocation section for each output
2249  * section and invokes reloc_section() to relocate that section.
2250  */
2251 uintptr_t
2252 ld_reloc_process(Ofl_desc *ofl)
2253 {
2254 	Listnode	*lnp1;
2255 	Sg_desc		*sgp;
2256 	Os_desc		*osp;
2257 	Word		ndx = 0, flags = ofl->ofl_flags;
2258 	Shdr		*shdr;
2259 
2260 	/*
2261 	 * Determine the index of the symbol table that will be referenced by
2262 	 * the relocation entries.
2263 	 */
2264 	if ((flags & (FLG_OF_DYNAMIC|FLG_OF_RELOBJ)) == FLG_OF_DYNAMIC)
2265 		/* LINTED */
2266 		ndx = (Word)elf_ndxscn(ofl->ofl_osdynsym->os_scn);
2267 	else if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ))
2268 		/* LINTED */
2269 		ndx = (Word)elf_ndxscn(ofl->ofl_ossymtab->os_scn);
2270 
2271 	/*
2272 	 * Re-initialize counters. These are used to provide relocation
2273 	 * offsets within the output buffers.
2274 	 */
2275 	ofl->ofl_relocpltsz = 0;
2276 	ofl->ofl_relocgotsz = 0;
2277 	ofl->ofl_relocbsssz = 0;
2278 
2279 	/*
2280 	 * Now that the output file is created and symbol update has occurred,
2281 	 * process the relocations collected in process_reloc().
2282 	 */
2283 	if (do_sorted_outrelocs(ofl) == S_ERROR)
2284 		return (S_ERROR);
2285 
2286 	if (ld_do_activerelocs(ofl) == S_ERROR)
2287 		return (S_ERROR);
2288 
2289 	if ((ofl->ofl_flags & FLG_OF_COMREL) == 0) {
2290 		/*
2291 		 * Process the relocation sections:
2292 		 *
2293 		 *  o	for each relocation section generated for the output
2294 		 *	image update its shdr information to reflect the
2295 		 *	symbol table it needs (sh_link) and the section to
2296 		 *	which the relocation must be applied (sh_info).
2297 		 */
2298 		for (LIST_TRAVERSE(&ofl->ofl_segs, lnp1, sgp)) {
2299 			Os_desc *osp;
2300 			Aliste	idx;
2301 
2302 			for (APLIST_TRAVERSE(sgp->sg_osdescs, idx, osp)) {
2303 				if (osp->os_relosdesc == 0)
2304 					continue;
2305 
2306 				shdr = osp->os_relosdesc->os_shdr;
2307 				shdr->sh_link = ndx;
2308 				/* LINTED */
2309 				shdr->sh_info = (Word)elf_ndxscn(osp->os_scn);
2310 			}
2311 		}
2312 
2313 		/*
2314 		 * Since the .rel[a] section is not tied to any specific
2315 		 * section, we'd not have found it above.
2316 		 */
2317 		if ((osp = ofl->ofl_osrel) != NULL) {
2318 			shdr = osp->os_shdr;
2319 			shdr->sh_link = ndx;
2320 			shdr->sh_info = 0;
2321 		}
2322 	} else {
2323 		/*
2324 		 * We only have two relocation sections here, (PLT's,
2325 		 * coalesced) so just hit them directly instead of stepping
2326 		 * over the output sections.
2327 		 */
2328 		if ((osp = ofl->ofl_osrelhead) != NULL) {
2329 			shdr = osp->os_shdr;
2330 			shdr->sh_link = ndx;
2331 			shdr->sh_info = 0;
2332 		}
2333 		if (((osp = ofl->ofl_osplt) != NULL) && osp->os_relosdesc) {
2334 			shdr = osp->os_relosdesc->os_shdr;
2335 			shdr->sh_link = ndx;
2336 			/* LINTED */
2337 			shdr->sh_info = (Word)elf_ndxscn(osp->os_scn);
2338 		}
2339 	}
2340 
2341 	/*
2342 	 * If the -z text option was given, and we have output relocations
2343 	 * against a non-writable, allocatable section, issue a diagnostic and
2344 	 * return (the actual entries that caused this error would have been
2345 	 * output during the relocating section phase).
2346 	 */
2347 	if ((flags & (FLG_OF_PURETXT | FLG_OF_TEXTREL)) ==
2348 	    (FLG_OF_PURETXT | FLG_OF_TEXTREL)) {
2349 		eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_REL_REMAIN_3));
2350 		return (S_ERROR);
2351 	}
2352 
2353 	/*
2354 	 * Finally, initialize the first got entry with the address of the
2355 	 * .dynamic section (_DYNAMIC).
2356 	 */
2357 	if (flags & FLG_OF_DYNAMIC) {
2358 		if (ld_fillin_gotplt(ofl) == S_ERROR)
2359 			return (S_ERROR);
2360 	}
2361 
2362 	/*
2363 	 * Now that any GOT information has been written, display the debugging
2364 	 * information if required.
2365 	 */
2366 	if ((osp = ofl->ofl_osgot) != NULL)
2367 		DBG_CALL(Dbg_got_display(ofl, osp->os_shdr->sh_addr, 1));
2368 
2369 	return (1);
2370 }
2371 
2372 /*
2373  * If the -z text option was given, and we have output relocations against a
2374  * non-writable, allocatable section, issue a diagnostic. Print offending
2375  * symbols in tabular form similar to the way undefined symbols are presented.
2376  * Called from reloc_count().  The actual fatal error condition is triggered on
2377  * in reloc_process() above.
2378  *
2379  * Note.  For historic reasons -ztext is not a default option (however all OS
2380  * shared object builds use this option).  It can be argued that this option
2381  * should also be default when generating an a.out (see 1163979).  However, if
2382  * an a.out contains text relocations it is either because the user is creating
2383  * something pretty weird (they've used the -b or -znodefs options), or because
2384  * the library against which they're building wasn't constructed correctly (ie.
2385  * a function has a NOTYPE type, in which case the a.out won't generate an
2386  * associated plt).  In the latter case the builder of the a.out can't do
2387  * anything to fix the error - thus we've chosen not to give the user an error,
2388  * or warning, for this case.
2389  */
2390 static void
2391 reloc_remain_title(Ofl_desc *ofl, int warning)
2392 {
2393 	const char	*str1;
2394 
2395 	if (warning)
2396 		str1 = MSG_INTL(MSG_REL_RMN_ITM_13);
2397 	else
2398 		str1 = MSG_INTL(MSG_REL_RMN_ITM_11);
2399 
2400 	eprintf(ofl->ofl_lml, ERR_NONE, MSG_INTL(MSG_REL_REMAIN_FMT_1), str1,
2401 	    MSG_INTL(MSG_REL_RMN_ITM_31), MSG_INTL(MSG_REL_RMN_ITM_12),
2402 	    MSG_INTL(MSG_REL_RMN_ITM_2), MSG_INTL(MSG_REL_RMN_ITM_32));
2403 }
2404 
2405 void
2406 ld_reloc_remain_entry(Rel_desc *orsp, Os_desc *osp, Ofl_desc *ofl)
2407 {
2408 	static Boolean	reloc_title = TRUE;
2409 
2410 	/*
2411 	 * -ztextoff
2412 	 */
2413 	if (ofl->ofl_flags1 & FLG_OF1_TEXTOFF)
2414 		return;
2415 
2416 	/*
2417 	 * Only give relocation errors against loadable read-only segments.
2418 	 */
2419 	if ((orsp->rel_rtype == M_R_REGISTER) || (!osp) ||
2420 	    (osp->os_sgdesc->sg_phdr.p_type != PT_LOAD) ||
2421 	    (osp->os_sgdesc->sg_phdr.p_flags & PF_W))
2422 		return;
2423 
2424 	/*
2425 	 * If we are in -ztextwarn mode, it's a silent error if a relocation is
2426 	 * due to a 'WEAK REFERENCE'.  This is because if the symbol is not
2427 	 * provided at run-time we will not perform a text-relocation.
2428 	 */
2429 	if (((ofl->ofl_flags & FLG_OF_PURETXT) == 0) &&
2430 	    (ELF_ST_BIND(orsp->rel_sym->sd_sym->st_info) == STB_WEAK) &&
2431 	    (orsp->rel_sym->sd_sym->st_shndx == SHN_UNDEF))
2432 		return;
2433 
2434 	if (reloc_title) {
2435 		/*
2436 		 * If building with '-ztext' then emit a fatal error.  If
2437 		 * building a executable then only emit a 'warning'.
2438 		 */
2439 		if (ofl->ofl_flags & FLG_OF_PURETXT)
2440 			reloc_remain_title(ofl, 0);
2441 		else
2442 			reloc_remain_title(ofl, 1);
2443 		reloc_title = FALSE;
2444 	}
2445 
2446 	eprintf(ofl->ofl_lml, ERR_NONE, MSG_INTL(MSG_REL_REMAIN_2),
2447 	    demangle(orsp->rel_sname), EC_OFF(orsp->rel_roffset),
2448 	    orsp->rel_isdesc->is_file->ifl_name);
2449 }
2450 
2451 /*
2452  * Generic encapsulation for generating a TLS got index.
2453  */
2454 uintptr_t
2455 ld_assign_got_TLS(Boolean local, Rel_desc *rsp, Ofl_desc *ofl, Sym_desc *sdp,
2456     Gotndx *gnp, Gotref gref, Word rflag, Word ortype, Word rtype1, Word rtype2)
2457 {
2458 	Word	rflags;
2459 
2460 	if (ld_assign_got_ndx(&(sdp->sd_GOTndxs), gnp, gref, ofl,
2461 	    rsp, sdp) == S_ERROR)
2462 		return (S_ERROR);
2463 
2464 	rflags = FLG_REL_GOT | rflag;
2465 	if (local)
2466 		rflags |= FLG_REL_SCNNDX;
2467 	rsp->rel_rtype = rtype1;
2468 
2469 	if (ld_add_outrel(rflags, rsp, ofl) == S_ERROR)
2470 		return (S_ERROR);
2471 
2472 	if (local && (gref == GOT_REF_TLSIE)) {
2473 		/*
2474 		 * If this is a local LE TLS symbol, then the symbol won't be
2475 		 * available at runtime.  The value of the local symbol will
2476 		 * be placed in the associated got entry, and the got
2477 		 * relocation is reassigned to a section symbol.
2478 		 */
2479 		if (ld_add_actrel(rflags, rsp, ofl) == S_ERROR)
2480 			return (S_ERROR);
2481 	}
2482 
2483 	if (rtype2) {
2484 		rflags = FLG_REL_GOT | rflag;
2485 		rsp->rel_rtype = rtype2;
2486 
2487 		if (local) {
2488 			if (ld_add_actrel(rflags, rsp, ofl) == S_ERROR)
2489 				return (S_ERROR);
2490 		} else {
2491 			if (ld_add_outrel(rflags, rsp, ofl) == S_ERROR)
2492 				return (S_ERROR);
2493 		}
2494 	}
2495 
2496 	rsp->rel_rtype = ortype;
2497 
2498 	return (1);
2499 }
2500 
2501 /*
2502  * Move Section related function
2503  */
2504 static uintptr_t
2505 newroffset_for_move(Sym_desc *symd,
2506 	Move *mventry, Xword offset1, Xword *offset2)
2507 {
2508 	Psym_info	*psym = symd->sd_psyminfo;
2509 	Mv_itm		*itm;
2510 	Listnode	*lnp1;
2511 	int 		found = 0;
2512 
2513 	/*
2514 	 * Search for matching move entry
2515 	 */
2516 	found = 0;
2517 	for (LIST_TRAVERSE(&psym->psym_mvs, lnp1, itm)) {
2518 		if (itm->mv_ientry == mventry) {
2519 			found = 1;
2520 			break;
2521 		}
2522 	}
2523 	if (found == 0) {
2524 		/*
2525 		 * This should never happen.
2526 		 */
2527 		return (S_ERROR);
2528 	}
2529 
2530 	/*
2531 	 * Update r_offset
2532 	 */
2533 	*offset2 = (Xword)((itm->mv_oidx - 1)*sizeof (Move) +
2534 	    offset1 % sizeof (Move));
2535 	return (1);
2536 }
2537 
2538 void
2539 ld_adj_movereloc(Ofl_desc *ofl, Rel_desc *arsp)
2540 {
2541 	Move		*move = arsp->rel_move->mvd_move;
2542 	Sym_desc	*psdp = arsp->rel_move->mvd_sym;
2543 	Xword		newoffset;
2544 
2545 	if (arsp->rel_flags & FLG_REL_MOVETAB) {
2546 		/*
2547 		 * We are relocating the move table itself.
2548 		 */
2549 		(void) newroffset_for_move(psdp, move, arsp->rel_roffset,
2550 		    &newoffset);
2551 		DBG_CALL(Dbg_move_adjmovereloc(ofl->ofl_lml, arsp->rel_roffset,
2552 		    newoffset, psdp->sd_name));
2553 		arsp->rel_roffset = newoffset;
2554 	} else {
2555 		/*
2556 		 * We are expanding the partial symbol.  So we are generating
2557 		 * the relocation entry relocating the expanded partial symbol.
2558 		 */
2559 		arsp->rel_roffset += psdp->sd_sym->st_value -
2560 		    ofl->ofl_issunwdata1->is_osdesc->os_shdr->sh_addr;
2561 		DBG_CALL(Dbg_move_adjexpandreloc(ofl->ofl_lml,
2562 		    arsp->rel_roffset, psdp->sd_name));
2563 	}
2564 }
2565 
2566 /*
2567  * Partially Initialized Symbol Handling routines
2568  * For sparc architecture, the second argument is reld->rel_raddend.
2569  * For i386  acrchitecure, the second argument is the value stored
2570  *	at the relocation target address.
2571  */
2572 Sym_desc *
2573 ld_am_I_partial(Rel_desc *reld, Xword val)
2574 {
2575 	Ifl_desc *	ifile = reld->rel_sym->sd_isc->is_file;
2576 	int 		nlocs = ifile->ifl_locscnt, i;
2577 
2578 	for (i = 1; i < nlocs; i++) {
2579 		Sym *		osym;
2580 		Sym_desc *	symd = ifile->ifl_oldndx[i];
2581 
2582 		if ((osym = symd->sd_osym) == 0)
2583 			continue;
2584 		if ((symd->sd_flags & FLG_SY_PAREXPN) == 0)
2585 			continue;
2586 		if ((osym->st_value <= val) &&
2587 		    (osym->st_value + osym->st_size  > val))
2588 			return (symd);
2589 	}
2590 	return ((Sym_desc *) 0);
2591 }
2592 
2593 
2594 /*
2595  * Obtain the current value at the given relocation target.
2596  *
2597  * entry:
2598  *	ofl - Output file descriptor
2599  *	rsp - Relocation record
2600  *	data - Pointer to relocation target
2601  *	value - Address of variable to recieve value
2602  *
2603  * exit:
2604  *	The value of the data at the relocation target has
2605  *	been stored in value.
2606  */
2607 int
2608 ld_reloc_targval_get(Ofl_desc *ofl, Rel_desc *rsp, uchar_t *data, Xword *value)
2609 {
2610 	const Rel_entry	*rep;
2611 
2612 	/* We do not currently support running as a cross linker */
2613 	if (OFL_SWAP_RELOC_DATA(ofl, rsp)) {
2614 		REL_ERR_NOSWAP(ofl->ofl_lml,
2615 		    rsp->rel_isdesc->is_file->ifl_name, rsp->rel_sname,
2616 		    rsp->rel_rtype);
2617 		return (0);
2618 	}
2619 
2620 	rep = &reloc_table[rsp->rel_rtype];
2621 
2622 	switch (rep->re_fsize) {
2623 	case 1:
2624 		/* LINTED */
2625 		*value = (Xword) *((uchar_t *)data);
2626 		break;
2627 	case 2:
2628 		/* LINTED */
2629 		*value = (Xword) *((Half *)data);
2630 		break;
2631 	case 4:
2632 		/* LINTED */
2633 		*value = *((Xword *)data);
2634 		break;
2635 	default:
2636 		/*
2637 		 * To keep chkmsg() happy: MSG_INTL(MSG_REL_UNSUPSZ)
2638 		 */
2639 		REL_ERR_UNSUPSZ(ofl->ofl_lml,
2640 		    rsp->rel_isdesc->is_file->ifl_name, rsp->rel_sname,
2641 		    rsp->rel_rtype, rep->re_fsize);
2642 		return (0);
2643 	}
2644 	return (1);
2645 }
2646 
2647 
2648 /*
2649  * Set the value at the given relocation target.
2650  *
2651  * entry:
2652  *	ofl - Output file descriptor
2653  *	rsp - Relocation record
2654  *	data - Pointer to relocation target
2655  *	value - Address of variable to recieve value
2656  *
2657  * exit:
2658  *	The value of the data at the relocation target has
2659  *	been stored in value.
2660  */
2661 int
2662 ld_reloc_targval_set(Ofl_desc *ofl, Rel_desc *rsp, uchar_t *data, Xword value)
2663 {
2664 	const Rel_entry	*rep;
2665 
2666 	/* We do not currently support running as a cross linker */
2667 	if (OFL_SWAP_RELOC_DATA(ofl, rsp)) {
2668 		REL_ERR_NOSWAP(ofl->ofl_lml,
2669 		    rsp->rel_isdesc->is_file->ifl_name, rsp->rel_sname,
2670 		    rsp->rel_rtype);
2671 		return (0);
2672 	}
2673 
2674 	rep = &reloc_table[rsp->rel_rtype];
2675 
2676 	switch (rep->re_fsize) {
2677 	case 1:
2678 		/* LINTED */
2679 		*((uchar_t *)data) = (uchar_t)value;
2680 		break;
2681 	case 2:
2682 		/* LINTED */
2683 		*((Half *)data) = (Half)value;
2684 		break;
2685 	case 4:
2686 		/* LINTED */
2687 		*((Xword *)data) = value;
2688 		break;
2689 	default:
2690 		/*
2691 		 * To keep chkmsg() happy: MSG_INTL(MSG_REL_UNSUPSZ)
2692 		 */
2693 		REL_ERR_UNSUPSZ(ofl->ofl_lml,
2694 		    rsp->rel_isdesc->is_file->ifl_name, rsp->rel_sname,
2695 		    rsp->rel_rtype, rep->re_fsize);
2696 		return (0);
2697 	}
2698 	return (1);
2699 }
2700 
2701 
2702 /*
2703  * Because of the combinations of 32-bit lib providing 64-bit support, and
2704  * visa-versa, the use of krtld's dorelocs can result in differing message
2705  * requirements that make msg.c/msg.h creation and chkmsg "interesting".
2706  * Thus the actual message files contain a couple of entries to satisfy
2707  * each architectures build.  Here we add dummy calls to quieten chkmsg.
2708  *
2709  * chkmsg: MSG_INTL(MSG_REL_NOFIT)
2710  * chkmsg: MSG_INTL(MSG_REL_NONALIGN)
2711  */
2712