xref: /titanic_51/usr/src/cmd/sgs/libld/common/relocate.c (revision 25c28e83beb90e7c80452a7c818c5e6f73a07dc8)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  *	Copyright (c) 1988 AT&T
24  *	  All Rights Reserved
25  *
26  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
27  */
28 
29 /*
30  * set-up for relocations
31  */
32 
33 #define	ELF_TARGET_AMD64
34 #define	ELF_TARGET_SPARC
35 
36 #include	<string.h>
37 #include	<stdio.h>
38 #include	<alloca.h>
39 #include	<debug.h>
40 #include	"msg.h"
41 #include	"_libld.h"
42 
43 /*
44  * Set up the relocation table flag test macros so that they use the
45  * relocation table for the current target machine.
46  */
47 #define	IS_PLT(X)	RELTAB_IS_PLT(X, ld_targ.t_mr.mr_reloc_table)
48 #define	IS_GOT_RELATIVE(X) \
49 	RELTAB_IS_GOT_RELATIVE(X, ld_targ.t_mr.mr_reloc_table)
50 #define	IS_GOT_PC(X)	RELTAB_IS_GOT_PC(X, ld_targ.t_mr.mr_reloc_table)
51 #define	IS_GOTPCREL(X)	RELTAB_IS_GOTPCREL(X, ld_targ.t_mr.mr_reloc_table)
52 #define	IS_GOT_BASED(X)	RELTAB_IS_GOT_BASED(X, ld_targ.t_mr.mr_reloc_table)
53 #define	IS_GOT_OPINS(X)	RELTAB_IS_GOT_OPINS(X, ld_targ.t_mr.mr_reloc_table)
54 #define	IS_GOT_REQUIRED(X) \
55 	RELTAB_IS_GOT_REQUIRED(X, ld_targ.t_mr.mr_reloc_table)
56 #define	IS_PC_RELATIVE(X) RELTAB_IS_PC_RELATIVE(X, ld_targ.t_mr.mr_reloc_table)
57 #define	IS_ADD_RELATIVE(X) \
58 	RELTAB_IS_ADD_RELATIVE(X, ld_targ.t_mr.mr_reloc_table)
59 #define	IS_REGISTER(X)	RELTAB_IS_REGISTER(X, ld_targ.t_mr.mr_reloc_table)
60 #define	IS_NOTSUP(X)	RELTAB_IS_NOTSUP(X, ld_targ.t_mr.mr_reloc_table)
61 #define	IS_SEG_RELATIVE(X) \
62 	RELTAB_IS_SEG_RELATIVE(X, ld_targ.t_mr.mr_reloc_table)
63 #define	IS_EXTOFFSET(X)	RELTAB_IS_EXTOFFSET(X, ld_targ.t_mr.mr_reloc_table)
64 #define	IS_SEC_RELATIVE(X) \
65 	RELTAB_IS_SEC_RELATIVE(X, ld_targ.t_mr.mr_reloc_table)
66 #define	IS_TLS_INS(X)	RELTAB_IS_TLS_INS(X, ld_targ.t_mr.mr_reloc_table)
67 #define	IS_TLS_GD(X)	RELTAB_IS_TLS_GD(X, ld_targ.t_mr.mr_reloc_table)
68 #define	IS_TLS_LD(X)	RELTAB_IS_TLS_LD(X, ld_targ.t_mr.mr_reloc_table)
69 #define	IS_TLS_IE(X)	RELTAB_IS_TLS_IE(X, ld_targ.t_mr.mr_reloc_table)
70 #define	IS_TLS_LE(X)	RELTAB_IS_TLS_LE(X, ld_targ.t_mr.mr_reloc_table)
71 #define	IS_LOCALBND(X)	RELTAB_IS_LOCALBND(X, ld_targ.t_mr.mr_reloc_table)
72 #define	IS_SIZE(X)	RELTAB_IS_SIZE(X, ld_targ.t_mr.mr_reloc_table)
73 
74 /*
75  * Structure to hold copy relocation items.
76  */
77 typedef struct copy_rel {
78 	Sym_desc	*c_sdp;		/* symbol descriptor to be copied */
79 	Addr 		c_val;		/* original symbol value */
80 } Copy_rel;
81 
82 /*
83  * For each copy relocation symbol, determine if the symbol is:
84  * 	1) to be *disp* relocated at runtime
85  *	2) a reference symbol for *disp* relocation
86  *	3) possibly *disp* relocated at ld time.
87  *
88  * The first and the second are serious errors.
89  */
90 static void
91 is_disp_copied(Ofl_desc *ofl, Copy_rel *crp)
92 {
93 	Ifl_desc	*ifl = crp->c_sdp->sd_file;
94 	Sym_desc	*sdp = crp->c_sdp;
95 	Addr		symaddr = crp->c_val;
96 	Is_desc		*irel;
97 	Aliste		idx;
98 	Conv_inv_buf_t	inv_buf;
99 
100 	/*
101 	 * This symbol may not be *disp* relocated at run time, but could
102 	 * already have been *disp* relocated when the shared object was
103 	 * created.  Warn the user.
104 	 */
105 	if ((ifl->ifl_flags & FLG_IF_DISPDONE) &&
106 	    (ofl->ofl_flags & FLG_OF_VERBOSE))
107 		ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_REL_DISPREL2),
108 		    conv_reloc_type(ifl->ifl_ehdr->e_machine,
109 		    ld_targ.t_m.m_r_copy, 0, &inv_buf),
110 		    ifl->ifl_name, demangle(sdp->sd_name));
111 
112 	if ((ifl->ifl_flags & FLG_IF_DISPPEND) == 0)
113 		return;
114 
115 	/*
116 	 * Traverse the input relocation sections.
117 	 */
118 	for (APLIST_TRAVERSE(ifl->ifl_relsect, idx, irel)) {
119 		Sym_desc	*rsdp;
120 		Is_desc		*trel;
121 		Rel		*rend, *reloc;
122 		Xword		rsize, entsize;
123 
124 		trel = ifl->ifl_isdesc[irel->is_shdr->sh_info];
125 		rsize = irel->is_shdr->sh_size;
126 		entsize = irel->is_shdr->sh_entsize;
127 		reloc = (Rel *)irel->is_indata->d_buf;
128 
129 		/*
130 		 * Decide entry size
131 		 */
132 		if ((entsize == 0) || (entsize > rsize)) {
133 			if (irel->is_shdr->sh_type == SHT_RELA)
134 				entsize = sizeof (Rela);
135 			else
136 				entsize = sizeof (Rel);
137 		}
138 
139 		/*
140 		 * Traverse the relocation entries.
141 		 */
142 		for (rend = (Rel *)((uintptr_t)reloc + (uintptr_t)rsize);
143 		    reloc < rend;
144 		    reloc = (Rel *)((uintptr_t)reloc + (uintptr_t)entsize)) {
145 			const char	*str;
146 			Word		rstndx;
147 
148 			if (IS_PC_RELATIVE(ELF_R_TYPE(reloc->r_info,
149 			    ld_targ.t_m.m_mach)) == 0)
150 				continue;
151 
152 			/*
153 			 * Determine if symbol is referenced from a relocation.
154 			 */
155 			rstndx = (Word) ELF_R_SYM(reloc->r_info);
156 			rsdp = ifl->ifl_oldndx[rstndx];
157 			if (rsdp == sdp) {
158 				if ((str = demangle(rsdp->sd_name)) !=
159 				    rsdp->sd_name) {
160 					char	*_str = alloca(strlen(str) + 1);
161 					(void) strcpy(_str, str);
162 					str = (const char *)_str;
163 				}
164 				ld_eprintf(ofl, ERR_WARNING,
165 				    MSG_INTL(MSG_REL_DISPREL1),
166 				    conv_reloc_type(ifl->ifl_ehdr->e_machine,
167 				    (uint_t)ELF_R_TYPE(reloc->r_info,
168 				    ld_targ.t_m.m_mach),
169 				    0, &inv_buf), ifl->ifl_name, str,
170 				    MSG_INTL(MSG_STR_UNKNOWN),
171 				    EC_XWORD(reloc->r_offset),
172 				    demangle(sdp->sd_name));
173 			}
174 
175 			/*
176 			 * Determine whether the relocation entry is relocating
177 			 * this symbol.
178 			 */
179 			if ((sdp->sd_isc != trel) ||
180 			    (reloc->r_offset < symaddr) ||
181 			    (reloc->r_offset >=
182 			    (symaddr + sdp->sd_sym->st_size)))
183 				continue;
184 
185 			/*
186 			 * This symbol is truely *disp* relocated, so should
187 			 * really be fixed by user.
188 			 */
189 			if ((str = demangle(sdp->sd_name)) != sdp->sd_name) {
190 				char	*_str = alloca(strlen(str) + 1);
191 				(void) strcpy(_str, str);
192 				str = (const char *)_str;
193 			}
194 			ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_REL_DISPREL1),
195 			    conv_reloc_type(ifl->ifl_ehdr->e_machine,
196 			    (uint_t)ELF_R_TYPE(reloc->r_info,
197 			    ld_targ.t_m.m_mach), 0, &inv_buf),
198 			    ifl->ifl_name, demangle(rsdp->sd_name), str,
199 			    EC_XWORD(reloc->r_offset), str);
200 		}
201 	}
202 }
203 
204 /*
205  * The number of symbols provided by some objects can be very large.  Use a
206  * binary search to match the associated value to a symbol table entry.
207  */
208 static int
209 disp_bsearch(const void *key, const void *array)
210 {
211 	Addr		kvalue, avalue;
212 	Ssv_desc	*ssvp = (Ssv_desc *)array;
213 
214 	kvalue = *((Addr *)key);
215 	avalue = ssvp->ssv_value;
216 
217 	if (avalue > kvalue)
218 		return (-1);
219 	if ((avalue < kvalue) &&
220 	    ((avalue + ssvp->ssv_sdp->sd_sym->st_size) <= kvalue))
221 		return (1);
222 	return (0);
223 }
224 
225 /*
226  * Given a sorted list of symbols, look for a symbol in which the relocation
227  * offset falls between the [sym.st_value - sym.st_value + sym.st_size].  Since
228  * the symbol list is maintained in sorted order,  we can bail once the
229  * relocation offset becomes less than the symbol values.  The symbol is
230  * returned for use in error diagnostics.
231  */
232 static Sym_desc *
233 disp_scansyms(Ifl_desc * ifl, Rel_desc *rld, Boolean rlocal, int inspect,
234     Ofl_desc *ofl)
235 {
236 	Sym_desc	*tsdp, *rsdp;
237 	Sym		*rsym, *tsym;
238 	Ssv_desc	*ssvp;
239 	uchar_t		rtype, ttype;
240 	Addr		value;
241 
242 	/*
243 	 * Sorted symbol values have been uniquified by adding their associated
244 	 * section offset.  Uniquify the relocation offset by adding its
245 	 * associated section offset, and search for the symbol.
246 	 */
247 	value = rld->rel_roffset;
248 	if (rld->rel_isdesc->is_shdr)
249 		value += rld->rel_isdesc->is_shdr->sh_offset;
250 
251 	if ((ssvp = bsearch((void *)&value, (void *)ifl->ifl_sortsyms,
252 	    ifl->ifl_sortcnt, sizeof (Ssv_desc), &disp_bsearch)) != 0)
253 		tsdp = ssvp->ssv_sdp;
254 	else
255 		tsdp = 0;
256 
257 	if (inspect)
258 		return (tsdp);
259 
260 	/*
261 	 * Determine the relocation reference symbol and its type.
262 	 */
263 	rsdp = rld->rel_sym;
264 	rsym = rsdp->sd_sym;
265 	rtype = ELF_ST_TYPE(rsym->st_info);
266 
267 	/*
268 	 * If there is no target symbol to match the relocation offset, then the
269 	 * offset is effectively local data.  If the relocation symbol is global
270 	 * data we have a potential for this displacement relocation to be
271 	 * invalidated should the global symbol be copied.
272 	 */
273 	if (tsdp == 0) {
274 		if ((rlocal == TRUE) ||
275 		    ((rtype != STT_OBJECT) && (rtype != STT_SECTION)))
276 		return (tsdp);
277 	} else {
278 		/*
279 		 * If both symbols are local, no copy relocations can occur to
280 		 * either symbol.  Note, this test is very similar to the test
281 		 * used in ld_sym_adjust_vis().
282 		 */
283 		if ((rlocal == TRUE) && (SYM_IS_HIDDEN(tsdp) ||
284 		    (ELF_ST_BIND(tsdp->sd_sym->st_info) != STB_GLOBAL) ||
285 		    ((ofl->ofl_flags & (FLG_OF_AUTOLCL | FLG_OF_AUTOELM)) &&
286 		    ((tsdp->sd_flags & MSK_SY_NOAUTO) == 0))))
287 			return (tsdp);
288 
289 		/*
290 		 * Determine the relocation target symbols type.
291 		 */
292 		tsym = tsdp->sd_sym;
293 		ttype = ELF_ST_TYPE(tsym->st_info);
294 
295 		/*
296 		 * If the reference symbol is local, and the target isn't a
297 		 * data element, then no copy relocations can occur to either
298 		 * symbol.  Note, this catches pc-relative relocations against
299 		 * the _GLOBAL_OFFSET_TABLE_, which is effectively treated as
300 		 * a local symbol.
301 		 */
302 		if ((rlocal == TRUE) && (ttype != STT_OBJECT) &&
303 		    (ttype != STT_SECTION))
304 			return (tsdp);
305 
306 		/*
307 		 * Finally, one of the symbols must reference a data element.
308 		 */
309 		if ((rtype != STT_OBJECT) && (rtype != STT_SECTION) &&
310 		    (ttype != STT_OBJECT) && (ttype != STT_SECTION))
311 			return (tsdp);
312 	}
313 
314 	/*
315 	 * We have two global symbols, at least one of which is a data item.
316 	 * The last case where a displacement relocation can be ignored, is
317 	 * if the reference symbol is included in the target symbol.
318 	 */
319 	value = rsym->st_value;
320 	if ((rld->rel_flags & FLG_REL_RELA) == FLG_REL_RELA)
321 		value += rld->rel_raddend;
322 
323 	if ((rld->rel_roffset >= value) &&
324 	    (rld->rel_roffset < (value + rsym->st_size)))
325 		return (tsdp);
326 
327 	/*
328 	 * We have a displacement relocation that could be compromised by a
329 	 * copy relocation of one of the associated data items.
330 	 */
331 	rld->rel_flags |= FLG_REL_DISP;
332 	return (tsdp);
333 }
334 
335 void
336 ld_disp_errmsg(const char *msg, Rel_desc *rsp, Ofl_desc *ofl)
337 {
338 	Sym_desc	*sdp;
339 	const char	*str;
340 	Ifl_desc	*ifl = rsp->rel_isdesc->is_file;
341 	Conv_inv_buf_t	inv_buf;
342 
343 	if ((sdp = disp_scansyms(ifl, rsp, 0, 1, ofl)) != 0)
344 		str = demangle(sdp->sd_name);
345 	else
346 		str = MSG_INTL(MSG_STR_UNKNOWN);
347 
348 	ld_eprintf(ofl, ERR_WARNING, msg,
349 	    conv_reloc_type(ifl->ifl_ehdr->e_machine, rsp->rel_rtype,
350 	    0, &inv_buf), ifl->ifl_name, ld_reloc_sym_name(rsp), str,
351 	    EC_OFF(rsp->rel_roffset));
352 }
353 
354 /*
355  * qsort(3C) comparison routine used for the disp_sortsyms().
356  */
357 static int
358 disp_qsort(const void * s1, const void * s2)
359 {
360 	Ssv_desc	*ssvp1 = ((Ssv_desc *)s1);
361 	Ssv_desc	*ssvp2 = ((Ssv_desc *)s2);
362 	Addr		val1 = ssvp1->ssv_value;
363 	Addr		val2 = ssvp2->ssv_value;
364 
365 	if (val1 > val2)
366 		return (1);
367 	if (val1 < val2)
368 		return (-1);
369 	return (0);
370 }
371 
372 /*
373  * Determine whether a displacement relocation is between a local and global
374  * symbol pair.  One symbol is used to perform the relocation, and the other
375  * is the destination offset of the relocation.
376  */
377 static uintptr_t
378 disp_inspect(Ofl_desc *ofl, Rel_desc *rld, Boolean rlocal)
379 {
380 	Is_desc		*isp = rld->rel_isdesc;
381 	Ifl_desc	*ifl = rld->rel_isdesc->is_file;
382 
383 	/*
384 	 * If the input files symbols haven't been sorted yet, do so.
385 	 */
386 	if (ifl->ifl_sortsyms == 0) {
387 		Word	ondx, nndx;
388 
389 		if ((ifl->ifl_sortsyms = libld_malloc((ifl->ifl_symscnt + 1) *
390 		    sizeof (Ssv_desc))) == 0)
391 			return (S_ERROR);
392 
393 		for (ondx = 0, nndx = 0; ondx < ifl->ifl_symscnt; ondx++) {
394 			Sym_desc	*sdp;
395 			Addr		value;
396 
397 			/*
398 			 * As symbol resolution has already occurred, various
399 			 * symbols from this object may have been satisfied
400 			 * from other objects.  Only select symbols from this
401 			 * object.  For the displacement test, we only really
402 			 * need to observe data definitions, however, later as
403 			 * part of providing warning disgnostics, relating the
404 			 * relocation offset to a symbol is desirable.  Thus,
405 			 * collect all symbols that define a memory area.
406 			 */
407 			if (((sdp = ifl->ifl_oldndx[ondx]) == 0) ||
408 			    (sdp->sd_sym->st_shndx == SHN_UNDEF) ||
409 			    (sdp->sd_sym->st_shndx >= SHN_LORESERVE) ||
410 			    (sdp->sd_ref != REF_REL_NEED) ||
411 			    (sdp->sd_file != ifl) ||
412 			    (sdp->sd_sym->st_size == 0))
413 				continue;
414 
415 			/*
416 			 * As a further optimization for later checking, mark
417 			 * this section if this a global data definition.
418 			 */
419 			if (sdp->sd_isc && (ondx >= ifl->ifl_locscnt))
420 				sdp->sd_isc->is_flags |= FLG_IS_GDATADEF;
421 
422 			/*
423 			 * Capture the symbol.  Within relocatable objects, a
424 			 * symbols value is its offset within its associated
425 			 * section.  Add the section offset to this value to
426 			 * uniquify the symbol.
427 			 */
428 			value = sdp->sd_sym->st_value;
429 			if (sdp->sd_isc && sdp->sd_isc->is_shdr)
430 				value += sdp->sd_isc->is_shdr->sh_offset;
431 
432 			ifl->ifl_sortsyms[nndx].ssv_value = value;
433 			ifl->ifl_sortsyms[nndx].ssv_sdp = sdp;
434 			nndx++;
435 		}
436 
437 		/*
438 		 * Sort the list based on the symbols value (address).
439 		 */
440 		if ((ifl->ifl_sortcnt = nndx) != 0)
441 			qsort(ifl->ifl_sortsyms, nndx, sizeof (Ssv_desc),
442 			    &disp_qsort);
443 	}
444 
445 	/*
446 	 * If the reference symbol is local, and the section being relocated
447 	 * contains no global definitions, neither can be the target of a copy
448 	 * relocation.
449 	 */
450 	if ((rlocal == FALSE) && ((isp->is_flags & FLG_IS_GDATADEF) == 0))
451 		return (1);
452 
453 	/*
454 	 * Otherwise determine whether this relocation symbol and its offset
455 	 * could be candidates for a copy relocation.
456 	 */
457 	if (ifl->ifl_sortcnt)
458 		(void) disp_scansyms(ifl, rld, rlocal, 0, ofl);
459 	return (1);
460 }
461 
462 /*
463  * Return a Rel_cachebuf with an available Rel_desc entry from the
464  * specified cache, allocating a cache buffer if necessary.
465  *
466  * entry:
467  *	ofl - Output file descriptor
468  *	rcp - Relocation cache to allocate the descriptor from.
469  *		One of &ofl->ofl_actrels or &ofl->ofl_outrels.
470  *
471  * exit:
472  *	Returns the allocated descriptor, or NULL if the allocation fails.
473  */
474 static Rel_cachebuf *
475 ld_add_rel_cache(Ofl_desc *ofl, Rel_cache *rcp)
476 {
477 	Rel_cachebuf	*rcbp;
478 	size_t		nelts, size, alloc_cnt;
479 
480 	/*
481 	 * If there is space available in the present cache bucket, return the
482 	 * next free entry.
483 	 */
484 	alloc_cnt = aplist_nitems(rcp->rc_list);
485 	if (rcp->rc_list &&
486 	    ((rcbp = rcp->rc_list->apl_data[alloc_cnt - 1]) != NULL) &&
487 	    (rcbp->rc_free < rcbp->rc_end))
488 		return (rcbp);
489 
490 	/*
491 	 * Allocate a new bucket. As we cannot know the number of relocations
492 	 * we'll have in the active and output cache until after the link is
493 	 * complete, the size of the bucket is a heuristic.
494 	 *
495 	 * In general, if the output object is an executable, or a sharable
496 	 * object, then the size of the active relocation list will be nearly
497 	 * the same as the number of input relocations, and the output
498 	 * relocation list will be very short. If the output object is a
499 	 * relocatable object, then the reverse is true. Therefore, the initial
500 	 * allocation for the appropriate list is sized to fit all the input
501 	 * allocations in a single shot.
502 	 *
503 	 * All other allocations are done in units of REL_CACHEBUF_ALLOC,
504 	 * which is chosen to be large enough to cover most common cases,
505 	 * but small enough that not using it fully is inconsequential.
506 	 *
507 	 * In an ideal scenario, this results in one allocation on each list.
508 	 */
509 	nelts = REL_CACHEBUF_ALLOC;
510 	if ((alloc_cnt == 0) && (ofl->ofl_relocincnt > REL_CACHEBUF_ALLOC)) {
511 		Boolean is_rel = (ofl->ofl_flags & FLG_OF_RELOBJ) != 0;
512 
513 		if (((rcp == &ofl->ofl_actrels) && !is_rel) ||
514 		    ((rcp == &ofl->ofl_outrels) && is_rel))
515 			nelts = ofl->ofl_relocincnt;
516 	}
517 
518 	/*
519 	 * Compute the total number of bytes to allocate. The first element
520 	 * of the array is built into the Rel_cachebuf header, so we subtract
521 	 * one from nelts.
522 	 */
523 	size = sizeof (Rel_cachebuf) + ((nelts - 1) * sizeof (Rel_desc));
524 
525 	if (((rcbp = libld_malloc(size)) == NULL) ||
526 	    (aplist_append(&rcp->rc_list, rcbp, AL_CNT_OFL_RELS) == NULL))
527 		return (NULL);
528 
529 	rcbp->rc_free = rcbp->rc_arr;
530 	rcbp->rc_end = rcbp->rc_arr + nelts;
531 
532 	return (rcbp);
533 }
534 
535 /*
536  * Allocate a Rel_aux descriptor and attach it to the given Rel_desc,
537  * allocating an auxiliary cache buffer if necessary.
538  *
539  * entry:
540  *	ofl - Output file descriptor
541  *	rdp - Rel_desc descriptor that requires an auxiliary block
542  *
543  * exit:
544  *	Returns TRUE on success, and FALSE if the allocation fails.
545  *	On success, the caller is responsible for initializing the
546  *	auxiliary block properly.
547  */
548 static Boolean
549 ld_add_rel_aux(Ofl_desc *ofl, Rel_desc *rdesc)
550 {
551 	Rel_aux_cachebuf	*racp = NULL;
552 	size_t			size;
553 
554 	/*
555 	 * If there is space available in the present cache bucket, use it.
556 	 * Otherwise, allocate a new bucket.
557 	 */
558 	if (ofl->ofl_relaux) {
559 		racp = ofl->ofl_relaux->apl_data[
560 		    ofl->ofl_relaux->apl_nitems - 1];
561 
562 		if (racp && (racp->rac_free >= racp->rac_end))
563 			racp = NULL;
564 	}
565 	if (racp == NULL) {
566 		/*
567 		 * Compute the total number of bytes to allocate. The first
568 		 * element of the array is built into the Rel_aux_cachebuf
569 		 * header, so we subtract one from the number of elements.
570 		 */
571 		size = sizeof (Rel_aux_cachebuf) +
572 		    ((RELAUX_CACHEBUF_ALLOC - 1) * sizeof (Rel_aux));
573 		if (((racp = libld_malloc(size)) == NULL) ||
574 		    (aplist_append(&ofl->ofl_relaux, racp, AL_CNT_OFL_RELS) ==
575 		    NULL))
576 			return (FALSE);
577 
578 		racp->rac_free = racp->rac_arr;
579 		racp->rac_end = racp->rac_arr + RELAUX_CACHEBUF_ALLOC;
580 	}
581 
582 	/* Take an auxiliary descriptor from the cache and add it to rdesc */
583 	rdesc->rel_aux = racp->rac_free++;
584 
585 	return (TRUE);
586 }
587 
588 /*
589  * Enter a copy of the given Rel_desc relocation descriptor, and
590  * any associated auxiliary Rel_aux it may reference, into the
591  * specified relocation cache.
592  *
593  * entry:
594  *	ofl - Output file descriptor
595  *	rcp - Relocation descriptor cache to recieve relocation
596  *	rdesc - Rel_desc image to be inserted
597  *	flags - Flags to add to rdest->rel_flags in the inserted descriptor
598  *
599  * exit:
600  *	Returns the pointer to the inserted descriptor on success.
601  *	Returns NULL if an allocation error occurs.
602  */
603 Rel_desc *
604 ld_reloc_enter(Ofl_desc *ofl, Rel_cache *rcp, Rel_desc *rdesc, Word flags)
605 {
606 	Rel_desc	*arsp;
607 	Rel_aux		*auxp;
608 	Rel_cachebuf	*rcbp;
609 
610 
611 	/*
612 	 * If no relocation cache structures are available, allocate a new
613 	 * one and link it to the buffer list.
614 	 */
615 	rcbp = ld_add_rel_cache(ofl, rcp);
616 	if (rcbp == NULL)
617 		return (NULL);
618 	arsp = rcbp->rc_free;
619 
620 	/*
621 	 * If there is an auxiliary block on the original, allocate
622 	 * one for the clone. Save the pointer, because the struct copy
623 	 * below will crush it.
624 	 */
625 	if (rdesc->rel_aux != NULL) {
626 		if (!ld_add_rel_aux(ofl, arsp))
627 			return (NULL);
628 		auxp = arsp->rel_aux;
629 	}
630 
631 	/* Copy contents of the original into the clone */
632 	*arsp = *rdesc;
633 
634 	/*
635 	 * If there is an auxiliary block, restore the clone's pointer to
636 	 * it, and copy the auxiliary contents.
637 	 */
638 	if (rdesc->rel_aux != NULL) {
639 		arsp->rel_aux = auxp;
640 		*auxp = *rdesc->rel_aux;
641 	}
642 	arsp->rel_flags |= flags;
643 
644 	rcbp->rc_free++;
645 	rcp->rc_cnt++;
646 
647 	return (arsp);
648 }
649 
650 /*
651  * Initialize a relocation descriptor auxiliary block to default
652  * values.
653  *
654  * entry:
655  *	rdesc - Relocation descriptor, with a non-NULL rel_aux field
656  *		pointing at the auxiliary block to be initialized.
657  *
658  * exit:
659  *	Each field in rdesc->rel_aux has been set to its default value
660  */
661 static void
662 ld_init_rel_aux(Rel_desc *rdesc)
663 {
664 	Rel_aux	*rap = rdesc->rel_aux;
665 
666 	/*
667 	 * The default output section is the one the input section
668 	 * is assigned to, assuming that there is an input section.
669 	 * Failing that, NULL is the only possibility, and we expect
670 	 * that the caller will assign an explicit value.
671 	 */
672 	rap->ra_osdesc = (rdesc->rel_isdesc == NULL) ? NULL :
673 	    rdesc->rel_isdesc->is_osdesc;
674 
675 	/* The ra_usym defaults to the value in rel_sym */
676 	rap->ra_usym = rdesc->rel_sym;
677 
678 	/* Remaining fields are zeroed */
679 	rap->ra_move = NULL;
680 	rap->ra_typedata = 0;
681 }
682 
683 /*
684  * The ld_reloc_set_aux_XXX() functions are used to set the value of an
685  * auxiliary relocation item on a relocation descriptor that exists in
686  * the active or output relocation cache. These descriptors are created
687  * via a call to ld_reloc_enter().
688  *
689  * These functions preserve the illusion that every relocation descriptor
690  * has a non-NULL auxiliary block into which values can be set, while
691  * only creating an auxiliary block if one is actually necessary, preventing
692  * the large memory allocations that would otherwise occur. They operate
693  * as follows:
694  *
695  * -	If an auxiliary block already exists, set the desired value and
696  *	and return TRUE.
697  *
698  * -	If no auxiliary block exists, but the desired value is the default
699  *	value for the specified item, then no auxiliary block is needed,
700  *	and TRUE is returned.
701  *
702  * -	If no auxiliary block exists, and the desired value is not the
703  *	default for the specified item, allocate an auxiliary block for
704  *	the descriptor, initialize its contents to default values for all
705  *	items, set the specified value, and return TRUE.
706  *
707  * -	If an auxiliary block needs to be added, but the allocation fails,
708  *	an error is issued, and FALSE is returned.
709  *
710  * Note that we only provide an ld_reloc_set_aux_XXX() function for those
711  * auxiliary items that libld actually modifies in Rel_desc descriptors
712  * in the active or output caches. If another one is needed, add it here.
713  *
714  * The PROCESS_NULL_REL_AUX macro is used to provide a single implementation
715  * for the logic that determines if an auxiliary block is needed or not,
716  * and handles the details of allocating and initializing it. It accepts
717  * one argument, _isdefault_predicate, which should be a call to the
718  * RELAUX_ISDEFAULT_xxx() macro appropriate for the auxiliary item
719  */
720 
721 #define	PROCESS_NULL_REL_AUX(_isdefault_predicate) \
722 	if (rdesc->rel_aux == NULL) { \
723 		/* If requested value is the default, no need for aux block */ \
724 		if (_isdefault_predicate) \
725 			return (TRUE); \
726 		/* Allocate and attach an auxiliary block */ \
727 		if (!ld_add_rel_aux(ofl, rdesc)) \
728 			return (FALSE); \
729 		/* Initialize the auxiliary block with default values */ \
730 		ld_init_rel_aux(rdesc); \
731 	}
732 
733 Boolean
734 ld_reloc_set_aux_osdesc(Ofl_desc *ofl, Rel_desc *rdesc, Os_desc *osp)
735 {
736 	PROCESS_NULL_REL_AUX(RELAUX_ISDEFAULT_OSDESC(rdesc, osp))
737 	rdesc->rel_aux->ra_osdesc = osp;
738 	return (TRUE);
739 }
740 
741 Boolean
742 ld_reloc_set_aux_usym(Ofl_desc *ofl, Rel_desc *rdesc, Sym_desc *sdp)
743 {
744 	PROCESS_NULL_REL_AUX(RELAUX_ISDEFAULT_USYM(rdesc, sdp))
745 	rdesc->rel_aux->ra_usym = sdp;
746 	return (TRUE);
747 }
748 
749 #undef PROCESS_NULL_REL_AUX
750 
751 /*
752  * Return a descriptive name for the symbol associated with the
753  * given relocation descriptor. This will be the actual symbol
754  * name if one exists, or a suitable alternative otherwise.
755  *
756  * entry:
757  *	rsp - Relocation descriptor
758  */
759 const char *
760 ld_reloc_sym_name(Rel_desc *rsp)
761 {
762 	Sym_desc	*sdp = rsp->rel_sym;
763 
764 	if (sdp != NULL) {
765 		/* If the symbol has a valid name use it */
766 		if (sdp->sd_name && *sdp->sd_name)
767 			return (demangle(sdp->sd_name));
768 
769 		/*
770 		 * If the symbol is STT_SECTION, and the corresponding
771 		 * section symbol has the specially prepared string intended
772 		 * for this use, use that string. The string is of the form
773 		 *	secname (section)
774 		 */
775 		if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) &&
776 		    (sdp->sd_isc != NULL) && (sdp->sd_isc->is_sym_name != NULL))
777 			return (demangle(sdp->sd_isc->is_sym_name));
778 	} else {
779 		/*
780 		 * Use an empty name for a register relocation with
781 		 * no symbol.
782 		 */
783 		if (IS_REGISTER(rsp->rel_rtype))
784 			return (MSG_ORIG(MSG_STR_EMPTY));
785 	}
786 
787 	/* If all else fails, report it as <unknown> */
788 	return (MSG_INTL(MSG_STR_UNKNOWN));
789 }
790 
791 /*
792  * Add an active relocation record.
793  */
794 uintptr_t
795 ld_add_actrel(Word flags, Rel_desc *rsp, Ofl_desc *ofl)
796 {
797 	Rel_desc	*arsp;
798 
799 	if ((arsp = ld_reloc_enter(ofl, &ofl->ofl_actrels, rsp, flags)) == NULL)
800 		return (S_ERROR);
801 
802 	/*
803 	 * Any GOT relocation reference requires the creation of a .got table.
804 	 * Most references to a .got require a .got entry,  which is accounted
805 	 * for with the ofl_gotcnt counter.  However, some references are
806 	 * relative to the .got table, but require no .got entry.  This test
807 	 * insures a .got is created regardless of the type of reference.
808 	 */
809 	if (IS_GOT_REQUIRED(arsp->rel_rtype))
810 		ofl->ofl_flags |= FLG_OF_BLDGOT;
811 
812 	/*
813 	 * If this is a displacement relocation generate a warning.
814 	 */
815 	if (arsp->rel_flags & FLG_REL_DISP) {
816 		ofl->ofl_dtflags_1 |= DF_1_DISPRELDNE;
817 
818 		if (ofl->ofl_flags & FLG_OF_VERBOSE)
819 			ld_disp_errmsg(MSG_INTL(MSG_REL_DISPREL3), arsp, ofl);
820 	}
821 
822 	DBG_CALL(Dbg_reloc_ars_entry(ofl->ofl_lml, ELF_DBG_LD,
823 	    arsp->rel_isdesc->is_shdr->sh_type, ld_targ.t_m.m_mach, arsp));
824 	return (1);
825 }
826 
827 /*
828  * In the platform specific machrel.XXX.c files, we sometimes write
829  * a value directly into the got/plt. These function can be used when
830  * the running linker has the opposite byte order of the object being
831  * produced.
832  */
833 Word
834 ld_bswap_Word(Word v)
835 {
836 	return (BSWAP_WORD(v));
837 }
838 
839 
840 Xword
841 ld_bswap_Xword(Xword v)
842 {
843 	return (BSWAP_XWORD(v));
844 }
845 
846 
847 uintptr_t
848 ld_reloc_GOT_relative(Boolean local, Rel_desc *rsp, Ofl_desc *ofl)
849 {
850 	Sym_desc	*sdp = rsp->rel_sym;
851 	ofl_flag_t	flags = ofl->ofl_flags;
852 	Gotndx		*gnp;
853 
854 	/*
855 	 * If this is the first time we've seen this symbol in a GOT
856 	 * relocation we need to assign it a GOT token.  Once we've got
857 	 * all of the GOT's assigned we can assign the actual indexes.
858 	 */
859 	if ((gnp = (*ld_targ.t_mr.mr_find_got_ndx)(sdp->sd_GOTndxs,
860 	    GOT_REF_GENERIC, ofl, rsp)) == 0) {
861 		Word	rtype = rsp->rel_rtype;
862 
863 		if ((*ld_targ.t_mr.mr_assign_got_ndx)(&(sdp->sd_GOTndxs), NULL,
864 		    GOT_REF_GENERIC, ofl, rsp, sdp) == S_ERROR)
865 			return (S_ERROR);
866 
867 		/*
868 		 * Initialize the GOT table entry.
869 		 *
870 		 * For global symbols, we clear the GOT table entry and create
871 		 * a GLOB_DAT relocation against the symbol.
872 		 *
873 		 * For local symbols, we enter the symbol value into a GOT
874 		 * table entry and create a relative relocation if all of
875 		 * the following hold:
876 		 *
877 		 * -	Output is a shared object
878 		 * -	Symbol is not ABS
879 		 * -	Relocation is not against one of the special sections
880 		 *	(COMMON, ...)
881 		 * -	This is not one of the generated symbols we have
882 		 *	to update after the output object has been fully
883 		 *	laid out (_START_, _END_, ...)
884 		 *
885 		 * Local symbols that don't meet the above requirements
886 		 * are processed as is.
887 		 */
888 		if (local == TRUE) {
889 			if ((flags & FLG_OF_SHAROBJ) &&
890 			    (((sdp->sd_flags & FLG_SY_SPECSEC) == 0) ||
891 			    ((sdp->sd_sym->st_shndx != SHN_ABS)) ||
892 			    (sdp->sd_aux && sdp->sd_aux->sa_symspec))) {
893 				if (ld_add_actrel((FLG_REL_GOT | FLG_REL_GOTCL),
894 				    rsp, ofl) == S_ERROR)
895 					return (S_ERROR);
896 
897 				rsp->rel_rtype = ld_targ.t_m.m_r_relative;
898 
899 				if ((*ld_targ.t_mr.mr_add_outrel)
900 				    ((FLG_REL_GOT | FLG_REL_ADVAL),
901 				    rsp, ofl) == S_ERROR)
902 					return (S_ERROR);
903 
904 				rsp->rel_rtype = rtype;
905 			} else {
906 				if (ld_add_actrel(FLG_REL_GOT, rsp,
907 				    ofl) == S_ERROR)
908 					return (S_ERROR);
909 			}
910 		} else {
911 			rsp->rel_rtype = ld_targ.t_m.m_r_glob_dat;
912 			if ((*ld_targ.t_mr.mr_add_outrel)(FLG_REL_GOT,
913 			    rsp, ofl) == S_ERROR)
914 				return (S_ERROR);
915 			rsp->rel_rtype = rtype;
916 		}
917 	} else {
918 		if ((*ld_targ.t_mr.mr_assign_got_ndx)(&(sdp->sd_GOTndxs), gnp,
919 		    GOT_REF_GENERIC, ofl, rsp, sdp) == S_ERROR)
920 			return (S_ERROR);
921 	}
922 
923 	/*
924 	 * Perform relocation to GOT table entry.
925 	 */
926 	return (ld_add_actrel(NULL, rsp, ofl));
927 }
928 
929 /*
930  * Perform relocations for PLT's
931  */
932 uintptr_t
933 ld_reloc_plt(Rel_desc *rsp, Ofl_desc *ofl)
934 {
935 	Sym_desc	*sdp = rsp->rel_sym;
936 
937 	switch (ld_targ.t_m.m_mach) {
938 	case EM_AMD64:
939 		/*
940 		 * AMD64 TLS code sequences do not use a unique TLS
941 		 * relocation to reference the __tls_get_addr() function call.
942 		 */
943 		if ((ofl->ofl_flags & FLG_OF_EXEC) &&
944 		    (strcmp(sdp->sd_name, MSG_ORIG(MSG_SYM_TLSGETADDR_U)) ==
945 		    0))
946 			return (ld_add_actrel(FLG_REL_TLSFIX, rsp, ofl));
947 		break;
948 
949 	case EM_386:
950 		/*
951 		 * GNUC IA32 TLS code sequences do not use a unique TLS
952 		 * relocation to reference the ___tls_get_addr() function call.
953 		 */
954 		if ((ofl->ofl_flags & FLG_OF_EXEC) &&
955 		    (strcmp(sdp->sd_name, MSG_ORIG(MSG_SYM_TLSGETADDR_UU)) ==
956 		    0))
957 			return (ld_add_actrel(FLG_REL_TLSFIX, rsp, ofl));
958 		break;
959 	}
960 
961 	/*
962 	 * if (not PLT yet assigned)
963 	 * then
964 	 *	assign PLT index to symbol
965 	 *	build output JMP_SLOT relocation
966 	 * fi
967 	 */
968 	if (sdp->sd_aux->sa_PLTndx == 0) {
969 		Word	ortype = rsp->rel_rtype;
970 
971 		(*ld_targ.t_mr.mr_assign_plt_ndx)(sdp, ofl);
972 
973 		/*
974 		 * If this symbol is binding to a lazy loadable, or deferred
975 		 * dependency, then identify the symbol.
976 		 */
977 		if (sdp->sd_file) {
978 			if (sdp->sd_file->ifl_flags & FLG_IF_LAZYLD)
979 				sdp->sd_flags |= FLG_SY_LAZYLD;
980 			if (sdp->sd_file->ifl_flags & FLG_IF_DEFERRED)
981 				sdp->sd_flags |= FLG_SY_DEFERRED;
982 		}
983 
984 		rsp->rel_rtype = ld_targ.t_m.m_r_jmp_slot;
985 		if ((*ld_targ.t_mr.mr_add_outrel)(FLG_REL_PLT, rsp, ofl) ==
986 		    S_ERROR)
987 			return (S_ERROR);
988 		rsp->rel_rtype = ortype;
989 	}
990 
991 	/*
992 	 * Perform relocation to PLT table entry.
993 	 */
994 	if ((ofl->ofl_flags & FLG_OF_SHAROBJ) &&
995 	    IS_ADD_RELATIVE(rsp->rel_rtype)) {
996 		Word	ortype	= rsp->rel_rtype;
997 
998 		rsp->rel_rtype = ld_targ.t_m.m_r_relative;
999 		if ((*ld_targ.t_mr.mr_add_outrel)(FLG_REL_ADVAL, rsp, ofl) ==
1000 		    S_ERROR)
1001 			return (S_ERROR);
1002 		rsp->rel_rtype = ortype;
1003 		return (1);
1004 	} else
1005 		return (ld_add_actrel(NULL, rsp, ofl));
1006 }
1007 
1008 /*
1009  * Round up to the next power of 2.  Used to ensure section alignments that can
1010  * be used for copy relocation symbol alignments are sane values.
1011  */
1012 static Word
1013 nlpo2(Word val)
1014 {
1015 	val--;
1016 	val |= (val >> 1);
1017 	val |= (val >> 2);
1018 	val |= (val >> 4);
1019 	val |= (val >> 8);
1020 	val |= (val >> 16);
1021 	return (++val);
1022 }
1023 
1024 /*
1025  * process GLOBAL undefined and ref_dyn_need symbols.
1026  */
1027 static uintptr_t
1028 reloc_exec(Rel_desc *rsp, Ofl_desc *ofl)
1029 {
1030 	Sym_desc	*_sdp, *sdp = rsp->rel_sym;
1031 	Sym_aux		*sap = sdp->sd_aux;
1032 	Sym		*sym = sdp->sd_sym;
1033 	Addr		stval;
1034 
1035 	/*
1036 	 * Reference is to a function so simply create a plt entry for it.
1037 	 */
1038 	if (ELF_ST_TYPE(sym->st_info) == STT_FUNC)
1039 		return (ld_reloc_plt(rsp, ofl));
1040 
1041 	/*
1042 	 * Catch absolutes - these may cause a text relocation.
1043 	 */
1044 	if ((sdp->sd_flags & FLG_SY_SPECSEC) && (sym->st_shndx == SHN_ABS)) {
1045 		if ((ofl->ofl_flags1 & FLG_OF1_ABSEXEC) == 0)
1046 			return ((*ld_targ.t_mr.mr_add_outrel)(NULL, rsp, ofl));
1047 
1048 		/*
1049 		 * If -zabsexec is set then promote the ABSOLUTE symbol to
1050 		 * current the current object and perform the relocation now.
1051 		 */
1052 		sdp->sd_ref = REF_REL_NEED;
1053 		return (ld_add_actrel(NULL, rsp, ofl));
1054 	}
1055 
1056 	/*
1057 	 * If the relocation is against a writable section simply compute the
1058 	 * necessary output relocation.  As an optimization, if the symbol has
1059 	 * already been transformed into a copy relocation then we can perform
1060 	 * the relocation directly (copy relocations should only be generated
1061 	 * for references from the text segment and these relocations are
1062 	 * normally carried out before we get to the data segment relocations).
1063 	 */
1064 	if ((ELF_ST_TYPE(sym->st_info) == STT_OBJECT) &&
1065 	    (RELAUX_GET_OSDESC(rsp)->os_shdr->sh_flags & SHF_WRITE)) {
1066 		if (sdp->sd_flags & FLG_SY_MVTOCOMM)
1067 			return (ld_add_actrel(NULL, rsp, ofl));
1068 		else
1069 			return ((*ld_targ.t_mr.mr_add_outrel)(NULL, rsp, ofl));
1070 	}
1071 
1072 	/*
1073 	 * If the reference isn't to an object (normally because a .type
1074 	 * directive wasn't defined in some assembler source), then apply
1075 	 * a generic relocation (this has a tendency to result in text
1076 	 * relocations).
1077 	 */
1078 	if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT) {
1079 		Conv_inv_buf_t inv_buf;
1080 
1081 		ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_REL_UNEXPSYM),
1082 		    conv_sym_info_type(sdp->sd_file->ifl_ehdr->e_machine,
1083 		    ELF_ST_TYPE(sym->st_info), 0, &inv_buf),
1084 		    rsp->rel_isdesc->is_file->ifl_name,
1085 		    ld_reloc_sym_name(rsp), sdp->sd_file->ifl_name);
1086 		return ((*ld_targ.t_mr.mr_add_outrel)(NULL, rsp, ofl));
1087 	}
1088 
1089 	/*
1090 	 * Prepare for generating a copy relocation.
1091 	 *
1092 	 * If this symbol is one of an alias pair, we need to ensure both
1093 	 * symbols become part of the output (the strong symbol will be used to
1094 	 * maintain the symbols state).  And, if we did raise the precedence of
1095 	 * a symbol we need to check and see if this is a weak symbol.  If it is
1096 	 * we want to use it's strong counter part.
1097 	 *
1098 	 * The results of this logic should be:
1099 	 *	ra_usym: assigned to strong
1100 	 *	rel_sym: assigned to symbol to perform
1101 	 *		copy_reloc against (weak or strong).
1102 	 */
1103 	if (sap->sa_linkndx) {
1104 		_sdp = sdp->sd_file->ifl_oldndx[sap->sa_linkndx];
1105 
1106 		if (_sdp->sd_ref < sdp->sd_ref) {
1107 			_sdp->sd_ref = sdp->sd_ref;
1108 			_sdp->sd_flags |= FLG_SY_REFRSD;
1109 
1110 			/*
1111 			 * As we're going to replicate a symbol from a shared
1112 			 * object, retain its correct binding status.
1113 			 */
1114 			if (ELF_ST_BIND(_sdp->sd_sym->st_info) == STB_GLOBAL)
1115 				_sdp->sd_flags |= FLG_SY_GLOBREF;
1116 
1117 		} else if (_sdp->sd_ref > sdp->sd_ref) {
1118 			sdp->sd_ref = _sdp->sd_ref;
1119 			sdp->sd_flags |= FLG_SY_REFRSD;
1120 
1121 			/*
1122 			 * As we're going to replicate a symbol from a shared
1123 			 * object, retain its correct binding status.
1124 			 */
1125 			if (ELF_ST_BIND(sym->st_info) == STB_GLOBAL)
1126 				sdp->sd_flags |= FLG_SY_GLOBREF;
1127 		}
1128 
1129 		/*
1130 		 * If this is a weak symbol then we want to move the strong
1131 		 * symbol into local .bss.  If there is a copy_reloc to be
1132 		 * performed, that should still occur against the WEAK symbol.
1133 		 */
1134 		if (((ELF_ST_BIND(sdp->sd_sym->st_info) == STB_WEAK) ||
1135 		    (sdp->sd_flags & FLG_SY_WEAKDEF)) &&
1136 		    !ld_reloc_set_aux_usym(ofl, rsp, _sdp))
1137 			return (S_ERROR);
1138 	} else
1139 		_sdp = 0;
1140 
1141 	/*
1142 	 * If the reference is to an object then allocate space for the object
1143 	 * within the executables .bss.  Relocations will now be performed from
1144 	 * this new location.  If the original shared objects data is
1145 	 * initialized, then generate a copy relocation that will copy the data
1146 	 * to the executables .bss at runtime.
1147 	 */
1148 	if (!(RELAUX_GET_USYM(rsp)->sd_flags & FLG_SY_MVTOCOMM)) {
1149 		Word		rtype = rsp->rel_rtype, w2align;
1150 		Copy_rel	cr;
1151 
1152 		/*
1153 		 * Diagnose the original copy reference, as this symbol
1154 		 * information will be overridden with the new destination.
1155 		 */
1156 		DBG_CALL(Dbg_syms_copy_reloc(ofl, sdp, 0));
1157 
1158 		/*
1159 		 * Indicate that the symbol(s) against which we're relocating
1160 		 * have been moved to the executables common.  Also, insure that
1161 		 * the symbol(s) remain marked as global, as the shared object
1162 		 * from which they are copied must be able to relocate to the
1163 		 * new common location within the executable.
1164 		 *
1165 		 * Note that even though a new symbol has been generated in the
1166 		 * output files' .bss, the symbol must remain REF_DYN_NEED and
1167 		 * not be promoted to REF_REL_NEED.  sym_validate() still needs
1168 		 * to carry out a number of checks against the symbols binding
1169 		 * that are triggered by the REF_DYN_NEED state.
1170 		 */
1171 		sdp->sd_flags |=
1172 		    (FLG_SY_MVTOCOMM | FLG_SY_DEFAULT | FLG_SY_EXPDEF);
1173 		sdp->sd_flags &= ~MSK_SY_LOCAL;
1174 		sdp->sd_sym->st_other &= ~MSK_SYM_VISIBILITY;
1175 		if (_sdp) {
1176 			_sdp->sd_flags |= (FLG_SY_MVTOCOMM |
1177 			    FLG_SY_DEFAULT | FLG_SY_EXPDEF);
1178 			_sdp->sd_flags &= ~MSK_SY_LOCAL;
1179 			_sdp->sd_sym->st_other &= ~MSK_SYM_VISIBILITY;
1180 
1181 			/*
1182 			 * Make sure the symbol has a reference in case of any
1183 			 * error diagnostics against it (perhaps this belongs
1184 			 * to a version that isn't allowable for this build).
1185 			 * The resulting diagnostic (see sym_undef_entry())
1186 			 * might seem a little bogus, as the symbol hasn't
1187 			 * really been referenced by this file, but has been
1188 			 * promoted as a consequence of its alias reference.
1189 			 */
1190 			if (!(_sdp->sd_aux->sa_rfile))
1191 				_sdp->sd_aux->sa_rfile = sdp->sd_aux->sa_rfile;
1192 		}
1193 
1194 		/*
1195 		 * Assign the symbol to the bss.
1196 		 */
1197 		_sdp = RELAUX_GET_USYM(rsp);
1198 		stval = _sdp->sd_sym->st_value;
1199 		if (ld_sym_copy(_sdp) == S_ERROR)
1200 			return (S_ERROR);
1201 		_sdp->sd_shndx = _sdp->sd_sym->st_shndx = SHN_COMMON;
1202 		_sdp->sd_flags |= FLG_SY_SPECSEC;
1203 
1204 		/*
1205 		 * Ensure the symbol has sufficient alignment.  The symbol
1206 		 * definition has no alignment information that can be used,
1207 		 * hence we use a heuristic.  Historically, twice the native
1208 		 * word alignment was sufficient for any data type, however,
1209 		 * the developer may have requested larger alignments (pragma
1210 		 * align).  The most conservative approach is to use a power
1211 		 * of two alignment, determined from the alignment of the
1212 		 * section containing the symbol definition.  Note that this
1213 		 * can result in some bloat to the .bss as the not every item
1214 		 * of copied data might need the section alignment.
1215 		 *
1216 		 * COMMON symbols carry their alignment requirements in the
1217 		 * symbols st_value field.  This alignment is applied to the
1218 		 * symbol when it is eventually transformed into .bss.
1219 		 */
1220 		w2align = ld_targ.t_m.m_word_align * 2;
1221 		if (_sdp->sd_sym->st_size < w2align)
1222 			_sdp->sd_sym->st_value = ld_targ.t_m.m_word_align;
1223 		else {
1224 			Shdr	*shdr;
1225 			Word	isalign;
1226 
1227 			if (_sdp->sd_isc &&
1228 			    ((shdr = _sdp->sd_isc->is_shdr) != NULL) &&
1229 			    ((isalign = shdr->sh_addralign) != 0))
1230 				_sdp->sd_sym->st_value = nlpo2(isalign);
1231 			else
1232 				_sdp->sd_sym->st_value = w2align;
1233 		}
1234 
1235 		/*
1236 		 * Whether or not the symbol references initialized data we
1237 		 * generate a copy relocation - this differs from the past
1238 		 * where we would not create the COPY_RELOC if we were binding
1239 		 * against .bss.  This is done for *two* reasons.
1240 		 *
1241 		 *  -	If the symbol in the shared object changes to a
1242 		 *	initialized data - we need the COPY to pick it up.
1243 		 *  -	Without the COPY RELOC we can't tell that the symbol
1244 		 *	from the COPY'd object has been moved and all bindings
1245 		 *	to it should bind here.
1246 		 *
1247 		 * Keep this symbol in the copy relocation list to check the
1248 		 * validity later.
1249 		 */
1250 		cr.c_sdp = _sdp;
1251 		cr.c_val = stval;
1252 		if (alist_append(&ofl->ofl_copyrels, &cr, sizeof (Copy_rel),
1253 		    AL_CNT_OFL_COPYRELS) == NULL)
1254 			return (S_ERROR);
1255 
1256 		rsp->rel_rtype = ld_targ.t_m.m_r_copy;
1257 		if ((*ld_targ.t_mr.mr_add_outrel)(FLG_REL_BSS, rsp, ofl) ==
1258 		    S_ERROR)
1259 			return (S_ERROR);
1260 		rsp->rel_rtype = rtype;
1261 
1262 		/*
1263 		 * If this symbol is a protected symbol, warn the user.  A
1264 		 * potential issue exists as the copy relocated symbol within
1265 		 * the executable can be visible to others, whereas the shared
1266 		 * object that defined the original copy data symbol is pre-
1267 		 * bound to reference it's own definition.  Any modification
1268 		 * of the symbols data could lead to inconsistencies for the
1269 		 * various users.
1270 		 */
1271 		if (_sdp->sd_flags & FLG_SY_PROT) {
1272 			Conv_inv_buf_t inv_buf;
1273 
1274 			ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_REL_COPY),
1275 			    conv_reloc_type(_sdp->sd_file->ifl_ehdr->e_machine,
1276 			    ld_targ.t_m.m_r_copy, 0, &inv_buf),
1277 			    _sdp->sd_file->ifl_name, _sdp->sd_name);
1278 		}
1279 		DBG_CALL(Dbg_syms_copy_reloc(ofl, _sdp,
1280 		    _sdp->sd_sym->st_value));
1281 	}
1282 	return (ld_add_actrel(NULL, rsp, ofl));
1283 }
1284 
1285 /*
1286  * All relocations should have been handled by the other routines.  This
1287  * routine is here as a catch all, if we do enter it we've goofed - but
1288  * we'll try and do the best we can.
1289  */
1290 static uintptr_t
1291 reloc_generic(Rel_desc *rsp, Ofl_desc *ofl)
1292 {
1293 	Ifl_desc	*ifl = rsp->rel_isdesc->is_file;
1294 	Conv_inv_buf_t	inv_buf;
1295 
1296 	ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_REL_UNEXPREL),
1297 	    conv_reloc_type(ifl->ifl_ehdr->e_machine, rsp->rel_rtype,
1298 	    0, &inv_buf), ifl->ifl_name, ld_reloc_sym_name(rsp));
1299 
1300 	/*
1301 	 * If building a shared object then put the relocation off
1302 	 * until runtime.
1303 	 */
1304 	if (ofl->ofl_flags & FLG_OF_SHAROBJ)
1305 		return ((*ld_targ.t_mr.mr_add_outrel)(NULL, rsp, ofl));
1306 
1307 	/*
1308 	 * Otherwise process relocation now.
1309 	 */
1310 	return (ld_add_actrel(NULL, rsp, ofl));
1311 }
1312 
1313 /*
1314  * Process relocations when building a relocatable object.  Typically, there
1315  * aren't many relocations that can be caught at this point, most are simply
1316  * passed through to the output relocatable object.
1317  */
1318 static uintptr_t
1319 reloc_relobj(Boolean local, Rel_desc *rsp, Ofl_desc *ofl)
1320 {
1321 	Word		rtype = rsp->rel_rtype;
1322 	Sym_desc	*sdp = rsp->rel_sym;
1323 	Is_desc		*isp = rsp->rel_isdesc;
1324 	Word		oflags = NULL;
1325 
1326 	/*
1327 	 * Determine if we can do any relocations at this point.  We can if:
1328 	 *
1329 	 *	this is local_symbol and a non-GOT relocation, and
1330 	 *	the relocation is pc-relative, and
1331 	 *	the relocation is against a symbol in same section
1332 	 */
1333 	if (local && !IS_GOT_RELATIVE(rtype) &&
1334 	    !IS_GOT_BASED(rtype) && !IS_GOT_PC(rtype) &&
1335 	    IS_PC_RELATIVE(rtype) &&
1336 	    ((sdp->sd_isc) && (sdp->sd_isc->is_osdesc == isp->is_osdesc)))
1337 		return (ld_add_actrel(NULL, rsp, ofl));
1338 
1339 	/*
1340 	 * If -zredlocsym is in effect, translate all local symbol relocations
1341 	 * to be against section symbols, since section symbols are the only
1342 	 * local symbols which will be added to the .symtab.
1343 	 */
1344 	if (local && (((ofl->ofl_flags & FLG_OF_REDLSYM) &&
1345 	    (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL)) ||
1346 	    ((sdp->sd_flags & FLG_SY_ELIM) &&
1347 	    (ofl->ofl_flags & FLG_OF_PROCRED)))) {
1348 		/*
1349 		 * But if this is PIC code, don't allow it for now.
1350 		 */
1351 		if (IS_GOT_RELATIVE(rsp->rel_rtype)) {
1352 			Ifl_desc	*ifl = rsp->rel_isdesc->is_file;
1353 			Conv_inv_buf_t inv_buf;
1354 
1355 			ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_PICREDLOC),
1356 			    ld_reloc_sym_name(rsp), ifl->ifl_name,
1357 			    conv_reloc_type(ifl->ifl_ehdr->e_machine,
1358 			    rsp->rel_rtype, 0, &inv_buf));
1359 			return (S_ERROR);
1360 		}
1361 
1362 		/*
1363 		 * Indicate that this relocation should be processed the same
1364 		 * as a section symbol.  For RELA, indicate that the addend
1365 		 * also needs to be applied to this relocation.
1366 		 */
1367 		if ((rsp->rel_flags & FLG_REL_RELA) == FLG_REL_RELA)
1368 			oflags = FLG_REL_SCNNDX | FLG_REL_ADVAL;
1369 		else
1370 			oflags = FLG_REL_SCNNDX;
1371 	}
1372 
1373 	if ((rsp->rel_flags & FLG_REL_RELA) == 0) {
1374 		/*
1375 		 * Intel (Rel) relocations do not contain an addend.  Any
1376 		 * addend is contained within the file at the location
1377 		 * identified by the relocation offset.  Therefore, if we're
1378 		 * processing a section symbol, or a -zredlocsym relocation
1379 		 * (that basically transforms a local symbol reference into
1380 		 * a section reference), perform an active relocation to
1381 		 * propagate any addend.
1382 		 */
1383 		if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) ||
1384 		    (oflags == FLG_REL_SCNNDX))
1385 			if (ld_add_actrel(NULL, rsp, ofl) == S_ERROR)
1386 				return (S_ERROR);
1387 	}
1388 	return ((*ld_targ.t_mr.mr_add_outrel)(oflags, rsp, ofl));
1389 }
1390 
1391 /*
1392  * Perform any generic TLS validations before passing control to machine
1393  * specific routines.  At this point we know we are dealing with an executable
1394  * or shared object - relocatable objects have already been processed.
1395  */
1396 static uintptr_t
1397 reloc_TLS(Boolean local, Rel_desc *rsp, Ofl_desc *ofl)
1398 {
1399 	Word		rtype = rsp->rel_rtype;
1400 	ofl_flag_t	flags = ofl->ofl_flags;
1401 	Ifl_desc	*ifl = rsp->rel_isdesc->is_file;
1402 	Half		mach = ifl->ifl_ehdr->e_machine;
1403 	Sym_desc	*sdp = rsp->rel_sym;
1404 	unsigned char	type;
1405 	Conv_inv_buf_t	inv_buf1, inv_buf2;
1406 
1407 	/*
1408 	 * All TLS relocations are illegal in a static executable.
1409 	 */
1410 	if (OFL_IS_STATIC_EXEC(ofl)) {
1411 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_TLSSTAT),
1412 		    conv_reloc_type(mach, rtype, 0, &inv_buf1), ifl->ifl_name,
1413 		    ld_reloc_sym_name(rsp));
1414 		return (S_ERROR);
1415 	}
1416 
1417 	/*
1418 	 * Any TLS relocation must be against a STT_TLS symbol, all others
1419 	 * are illegal.
1420 	 */
1421 	if ((type = ELF_ST_TYPE(sdp->sd_sym->st_info)) != STT_TLS) {
1422 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_TLSBADSYM),
1423 		    conv_reloc_type(mach, rtype, 0, &inv_buf1), ifl->ifl_name,
1424 		    ld_reloc_sym_name(rsp),
1425 		    conv_sym_info_type(mach, type, 0, &inv_buf2));
1426 		return (S_ERROR);
1427 	}
1428 
1429 	/*
1430 	 * A dynamic executable can not use the LD or LE reference models to
1431 	 * reference an external symbol.  A shared object can not use the LD
1432 	 * reference model to reference an external symbol.
1433 	 */
1434 	if (!local && (IS_TLS_LD(rtype) ||
1435 	    ((flags & FLG_OF_EXEC) && IS_TLS_LE(rtype)))) {
1436 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_TLSBND),
1437 		    conv_reloc_type(mach, rtype, 0, &inv_buf1), ifl->ifl_name,
1438 		    ld_reloc_sym_name(rsp), sdp->sd_file->ifl_name);
1439 		return (S_ERROR);
1440 	}
1441 
1442 	/*
1443 	 * The TLS LE model is only allowed for dynamic executables.  The TLS IE
1444 	 * model is allowed for shared objects, but this model has restrictions.
1445 	 * This model can only be used freely in dependencies that are loaded
1446 	 * immediately as part of process initialization.  However, during the
1447 	 * initial runtime handshake with libc that establishes the thread
1448 	 * pointer, a small backup TLS reservation is created.  This area can
1449 	 * be used by objects that are loaded after threads are initialized.
1450 	 * However, this area is limited in size and may have already been
1451 	 * used.  This area is intended for specialized applications, and does
1452 	 * not provide the degree of flexibility dynamic TLS can offer.  Under
1453 	 * -z verbose indicate this restriction to the user.
1454 	 */
1455 	if ((flags & FLG_OF_EXEC) == 0) {
1456 		if (IS_TLS_LE(rtype)) {
1457 			ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_TLSLE),
1458 			    conv_reloc_type(mach, rtype, 0, &inv_buf1),
1459 			    ifl->ifl_name, ld_reloc_sym_name(rsp));
1460 			return (S_ERROR);
1461 
1462 		} else if ((IS_TLS_IE(rtype)) &&
1463 		    (flags & FLG_OF_VERBOSE)) {
1464 			ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_REL_TLSIE),
1465 			    conv_reloc_type(mach, rtype, 0, &inv_buf1),
1466 			    ifl->ifl_name, ld_reloc_sym_name(rsp));
1467 		}
1468 	}
1469 
1470 	return ((*ld_targ.t_mr.mr_reloc_TLS)(local, rsp, ofl));
1471 }
1472 
1473 uintptr_t
1474 ld_process_sym_reloc(Ofl_desc *ofl, Rel_desc *reld, Rel *reloc, Is_desc *isp,
1475     const char *isname, Word isscnndx)
1476 {
1477 	Word		rtype = reld->rel_rtype;
1478 	ofl_flag_t	flags = ofl->ofl_flags;
1479 	Sym_desc	*sdp = reld->rel_sym;
1480 	Sym_aux		*sap;
1481 	Boolean		local;
1482 	Conv_inv_buf_t	inv_buf;
1483 
1484 	DBG_CALL(Dbg_reloc_in(ofl->ofl_lml, ELF_DBG_LD, ld_targ.t_m.m_mach,
1485 	    ld_targ.t_m.m_rel_sht_type, (void *)reloc, isname, isscnndx,
1486 	    ld_reloc_sym_name(reld)));
1487 
1488 	/*
1489 	 * Indicate this symbol is being used for relocation and therefore must
1490 	 * have its output address updated accordingly (refer to update_osym()).
1491 	 */
1492 	sdp->sd_flags |= FLG_SY_UPREQD;
1493 
1494 	/*
1495 	 * Indicate the section this symbol is defined in has been referenced,
1496 	 * therefor it *is not* a candidate for elimination.
1497 	 */
1498 	if (sdp->sd_isc) {
1499 		sdp->sd_isc->is_flags |= FLG_IS_SECTREF;
1500 		sdp->sd_isc->is_file->ifl_flags |= FLG_IF_FILEREF;
1501 	}
1502 
1503 	if (!ld_reloc_set_aux_usym(ofl, reld, sdp))
1504 		return (S_ERROR);
1505 
1506 	/*
1507 	 * Determine if this symbol is actually an alias to another symbol.  If
1508 	 * so, and the alias is not REF_DYN_SEEN, set ra_usym to point to the
1509 	 * weak symbols strong counter-part.  The one exception is if the
1510 	 * FLG_SY_MVTOCOMM flag is set on the weak symbol.  If this is the case,
1511 	 * the strong is only here because of its promotion, and the weak symbol
1512 	 * should still be used for the relocation reference (see reloc_exec()).
1513 	 */
1514 	sap = sdp->sd_aux;
1515 	if (sap && sap->sa_linkndx &&
1516 	    ((ELF_ST_BIND(sdp->sd_sym->st_info) == STB_WEAK) ||
1517 	    (sdp->sd_flags & FLG_SY_WEAKDEF)) &&
1518 	    (!(sdp->sd_flags & FLG_SY_MVTOCOMM))) {
1519 		Sym_desc	*_sdp;
1520 
1521 		_sdp = sdp->sd_file->ifl_oldndx[sap->sa_linkndx];
1522 		if ((_sdp->sd_ref != REF_DYN_SEEN) &&
1523 		    !ld_reloc_set_aux_usym(ofl, reld, _sdp))
1524 			return (S_ERROR);
1525 	}
1526 
1527 	/*
1528 	 * Determine whether this symbol should be bound locally or not.
1529 	 * Symbols are bound locally if one of the following is true:
1530 	 *
1531 	 *  -	the symbol is of type STB_LOCAL.
1532 	 *
1533 	 *  -	the output image is not a relocatable object and the relocation
1534 	 *	is relative to the .got.
1535 	 *
1536 	 *  -	the section being relocated is of type SHT_SUNW_dof.  These
1537 	 *	sections must be bound to the functions in the containing
1538 	 *	object and can not be interposed upon.
1539 	 *
1540 	 *  -	the symbol has been reduced (scoped to a local or symbolic) and
1541 	 *	reductions are being processed.
1542 	 *
1543 	 *  -	the -Bsymbolic flag is in use when building a shared object,
1544 	 *	and the symbol hasn't explicitly been defined as nodirect.
1545 	 *
1546 	 *  -	an executable (fixed address) is being created, and the symbol
1547 	 *	is defined in the executable.
1548 	 *
1549 	 *  -	the relocation is against a segment which will not be loaded
1550 	 *	into memory.  In this case, the relocation must be resolved
1551 	 *	now, as ld.so.1 can not process relocations against unmapped
1552 	 *	segments.
1553 	 */
1554 	local = FALSE;
1555 	if (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL) {
1556 		local = TRUE;
1557 	} else if (!(reld->rel_flags & FLG_REL_LOAD)) {
1558 		local = TRUE;
1559 	} else if (sdp->sd_sym->st_shndx != SHN_UNDEF) {
1560 		if (reld->rel_isdesc &&
1561 		    reld->rel_isdesc->is_shdr->sh_type == SHT_SUNW_dof) {
1562 			local = TRUE;
1563 		} else if (!(flags & FLG_OF_RELOBJ) &&
1564 		    (IS_LOCALBND(rtype) || IS_SEG_RELATIVE(rtype))) {
1565 			local = TRUE;
1566 		} else if ((sdp->sd_ref == REF_REL_NEED) &&
1567 		    ((sdp->sd_flags & FLG_SY_CAP) == 0)) {
1568 			/*
1569 			 * Global symbols may have been individually reduced in
1570 			 * scope.  If the whole object is to be self contained,
1571 			 * such as when generating an executable or a symbolic
1572 			 * shared object, make sure all relocation symbol
1573 			 * references (sections too) are treated locally.  Note,
1574 			 * explicit no-direct symbols should not be bound to
1575 			 * locally.
1576 			 */
1577 			if ((sdp->sd_flags &
1578 			    (FLG_SY_HIDDEN | FLG_SY_PROTECT)))
1579 				local = TRUE;
1580 			else if ((flags & FLG_OF_EXEC) ||
1581 			    ((flags & FLG_OF_SYMBOLIC) &&
1582 			    ((sdp->sd_flags & FLG_SY_NDIR) == 0))) {
1583 				local = TRUE;
1584 			}
1585 		}
1586 	}
1587 
1588 	/*
1589 	 * If this is a PC_RELATIVE relocation, the relocation could be
1590 	 * compromised if the relocated address is later used as a copy
1591 	 * relocated symbol (PSARC 1999/636, bugid 4187211).  Scan the input
1592 	 * files symbol table to cross reference this relocation offset.
1593 	 */
1594 	if ((ofl->ofl_flags & FLG_OF_SHAROBJ) &&
1595 	    IS_PC_RELATIVE(rtype) &&
1596 	    (IS_GOT_PC(rtype) == 0) &&
1597 	    (IS_PLT(rtype) == 0)) {
1598 		if (disp_inspect(ofl, reld, local) == S_ERROR)
1599 			return (S_ERROR);
1600 	}
1601 
1602 	/*
1603 	 * GOT based relocations must bind to the object being built - since
1604 	 * they are relevant to the current GOT.  If not building a relocatable
1605 	 * object - give a appropriate error message.
1606 	 */
1607 	if (!local && !(flags & FLG_OF_RELOBJ) &&
1608 	    IS_GOT_BASED(rtype)) {
1609 		Ifl_desc	*ifl = reld->rel_isdesc->is_file;
1610 
1611 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_BADGOTBASED),
1612 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
1613 		    0, &inv_buf), ifl->ifl_name, demangle(sdp->sd_name));
1614 		return (S_ERROR);
1615 	}
1616 
1617 	/*
1618 	 * TLS symbols can only have TLS relocations.
1619 	 */
1620 	if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_TLS) &&
1621 	    (IS_TLS_INS(rtype) == 0)) {
1622 		/*
1623 		 * The above test is relaxed if the target section is
1624 		 * non-allocable.
1625 		 */
1626 		if (RELAUX_GET_OSDESC(reld)->os_shdr->sh_flags & SHF_ALLOC) {
1627 			Ifl_desc	*ifl = reld->rel_isdesc->is_file;
1628 
1629 			ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_BADTLS),
1630 			    conv_reloc_type(ifl->ifl_ehdr->e_machine,
1631 			    rtype, 0, &inv_buf), ifl->ifl_name,
1632 			    demangle(sdp->sd_name));
1633 			return (S_ERROR);
1634 		}
1635 	}
1636 
1637 	/*
1638 	 * Select the relocation to perform.
1639 	 */
1640 	if (IS_REGISTER(rtype)) {
1641 		if (ld_targ.t_mr.mr_reloc_register == NULL) {
1642 			ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_NOREG));
1643 			return (S_ERROR);
1644 		}
1645 		return ((*ld_targ.t_mr.mr_reloc_register)(reld, isp, ofl));
1646 	}
1647 
1648 	if (flags & FLG_OF_RELOBJ)
1649 		return (reloc_relobj(local, reld, ofl));
1650 
1651 	if (IS_TLS_INS(rtype))
1652 		return (reloc_TLS(local, reld, ofl));
1653 
1654 	if (IS_GOT_OPINS(rtype)) {
1655 		if (ld_targ.t_mr.mr_reloc_GOTOP == NULL) {
1656 			assert(0);
1657 			return (S_ERROR);
1658 		}
1659 		return ((*ld_targ.t_mr.mr_reloc_GOTOP)(local, reld, ofl));
1660 	}
1661 
1662 	if (IS_GOT_RELATIVE(rtype))
1663 		return (ld_reloc_GOT_relative(local, reld, ofl));
1664 
1665 	if (local)
1666 		return ((*ld_targ.t_mr.mr_reloc_local)(reld, ofl));
1667 
1668 	if ((IS_PLT(rtype) || ((sdp->sd_flags & FLG_SY_CAP) &&
1669 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_FUNC))) &&
1670 	    ((flags & FLG_OF_BFLAG) == 0))
1671 		return (ld_reloc_plt(reld, ofl));
1672 
1673 	if ((sdp->sd_ref == REF_REL_NEED) ||
1674 	    (flags & FLG_OF_BFLAG) || (flags & FLG_OF_SHAROBJ) ||
1675 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_NOTYPE))
1676 		return ((*ld_targ.t_mr.mr_add_outrel)(NULL, reld, ofl));
1677 
1678 	if (sdp->sd_ref == REF_DYN_NEED)
1679 		return (reloc_exec(reld, ofl));
1680 
1681 	/*
1682 	 * IS_NOT_REL(rtype)
1683 	 */
1684 	return (reloc_generic(reld, ofl));
1685 }
1686 
1687 /*
1688  * Given a relocation that references a local symbol from a discarded COMDAT
1689  * section, replace the symbol with the corresponding symbol from the section
1690  * that was kept.
1691  *
1692  * entry:
1693  *	reld - Relocation
1694  *	sdp - Symbol to be replaced. Must be a local symbol (STB_LOCAL).
1695  *	reject - Address of variable to receive rejection code
1696  *		if no replacement symbol is found.
1697  *
1698  * exit:
1699  *	Returns address of replacement symbol descriptor if one was
1700  *	found, and NULL otherwise. The result is also cached in
1701  *	ofl->ofl_sr_cache as an optimization to speed following calls
1702  *	for the same value of sdp.
1703  *
1704  *	On success (non-NULL result), *reject is set to RLXREL_REJ_NONE.
1705  *	On failure (NULL result), *reject is filled in with a code
1706  *	describing the underlying reason.
1707  *
1708  * note:
1709  *	The word "COMDAT" is used to refer to actual COMDAT sections, COMDAT
1710  *	groups tied together with an SHF_GROUP section, and .gnu.linkonce
1711  *	sections which provide a simplified COMDAT requirement.  COMDAT
1712  *	sections are identified with the FLG_IS_COMDAT section flag.
1713  *
1714  *	In principle, this sort of sloppy relocation remapping is
1715  *	a questionable practice. All self-referential sections should
1716  *	be in a common SHF_GROUP so that they are all kept or removed
1717  *	together. The problem is that there is no way to ensure that the
1718  *	two sections are similar enough that the replacement section will
1719  *	really supply the correct information. However, we see a couple of
1720  *	situations where it is useful to do this: (1) Older Sun C compilers
1721  *	generated DWARF sections that would refer to one of the COMDAT
1722  *	sections, and (2) gcc, when its GNU linkonce COMDAT feature is enabled.
1723  *	It turns out that the GNU ld does these sloppy remappings.
1724  *
1725  *	The GNU ld takes an approach that hard wires special section
1726  *	names and treats them specially. We avoid that practice and
1727  *	try to get the necessary work done relying only on the ELF
1728  *	attributes of the sections and symbols involved. This means
1729  *	that our heuristic is somewhat different than theirs, but the
1730  *	end result is close enough to solve the same problem.
1731  *
1732  *	gcc is in the process of converting to SHF_GROUP. This will
1733  *	eventually phase out the need for sloppy relocations, and
1734  *	then this logic won't be needed. In the meantime, relaxed relocation
1735  *	processing allows us to interoperate.
1736  */
1737 static Sym_desc *
1738 sloppy_comdat_reloc(Ofl_desc *ofl, Rel_desc *reld, Sym_desc *sdp,
1739     Rlxrel_rej *reject)
1740 {
1741 	Is_desc		*rep_isp;
1742 	Sym		*sym, *rep_sym;
1743 	Is_desc		*isp;
1744 	Ifl_desc	*ifl;
1745 	Conv_inv_buf_t	inv_buf;
1746 	Word		scnndx, symscnt;
1747 	Sym_desc	**oldndx, *rep_sdp;
1748 	const char	*is_name;
1749 
1750 
1751 	/*
1752 	 * Sloppy relocations are never applied to .eh_frame or
1753 	 * .gcc_except_table sections. The entries in these sections
1754 	 * for discarded sections are better left uninitialized.
1755 	 *
1756 	 * We match these sections by name, because on most platforms they
1757 	 * are SHT_PROGBITS, and cannot be identified otherwise. On amd64
1758 	 * architectures, .eh_frame is SHT_AMD64_UNWIND, but that is ambiguous
1759 	 * (.eh_frame_hdr is also SHT_AMD64_UNWIND), so we still match it by
1760 	 * name.
1761 	 */
1762 	is_name = reld->rel_isdesc->is_name;
1763 	if (((is_name[1] == 'e') &&
1764 	    (strcmp(is_name, MSG_ORIG(MSG_SCN_EHFRAME)) == 0)) ||
1765 	    ((is_name[1] == 'g') &&
1766 	    (strcmp(is_name, MSG_ORIG(MSG_SCN_GCC_X_TBL)) == 0))) {
1767 		*reject = RLXREL_REJ_TARGET;
1768 		return (NULL);
1769 	}
1770 
1771 	/*
1772 	 * If we looked up the same symbol on the previous call, we can
1773 	 * return the cached value.
1774 	 */
1775 	if (sdp == ofl->ofl_sr_cache.sr_osdp) {
1776 		*reject = ofl->ofl_sr_cache.sr_rej;
1777 		return (ofl->ofl_sr_cache.sr_rsdp);
1778 	}
1779 
1780 	ofl->ofl_sr_cache.sr_osdp = sdp;
1781 	sym = sdp->sd_sym;
1782 	isp = sdp->sd_isc;
1783 	ifl = sdp->sd_file;
1784 
1785 	/*
1786 	 * When a COMDAT section is discarded in favor of another COMDAT
1787 	 * section, the replacement is recorded in its section descriptor
1788 	 * (is_comdatkeep). We must validate the replacement before using
1789 	 * it. The replacement section must:
1790 	 *	- Not have been discarded
1791 	 *	- Have the same size (*)
1792 	 *	- Have the same section type
1793 	 *	- Have the same SHF_GROUP flag setting (either on or off)
1794 	 *	- Must be a COMDAT section of one form or the other.
1795 	 *
1796 	 * (*) One might imagine that the replacement section could be
1797 	 * larger than the original, rather than the exact size. However,
1798 	 * we have verified that this is the same policy used by the GNU
1799 	 * ld. If the sections are not the same size, the chance of them
1800 	 * being interchangeable drops significantly.
1801 	 */
1802 	if (((rep_isp = isp->is_comdatkeep) == NULL) ||
1803 	    ((rep_isp->is_flags & FLG_IS_DISCARD) != 0) ||
1804 	    ((rep_isp->is_flags & FLG_IS_COMDAT) == 0) ||
1805 	    (isp->is_indata->d_size != rep_isp->is_indata->d_size) ||
1806 	    (isp->is_shdr->sh_type != rep_isp->is_shdr->sh_type) ||
1807 	    ((isp->is_shdr->sh_flags & SHF_GROUP) !=
1808 	    (rep_isp->is_shdr->sh_flags & SHF_GROUP))) {
1809 		*reject = ofl->ofl_sr_cache.sr_rej = RLXREL_REJ_SECTION;
1810 		return (ofl->ofl_sr_cache.sr_rsdp = NULL);
1811 	}
1812 
1813 	/*
1814 	 * We found the kept COMDAT section. Now, look at all of the
1815 	 * symbols from the input file that contains it to find the
1816 	 * symbol that corresponds to the one we started with:
1817 	 *	- Hasn't been discarded
1818 	 *	- Has section index of kept section
1819 	 *	- If one symbol has a name, the other must have
1820 	 *		the same name. The st_name field of a symbol
1821 	 *		is 0 if there is no name, and is a string
1822 	 *		table offset otherwise. The string table
1823 	 *		offsets may well not agree --- it is the
1824 	 *		actual string that matters.
1825 	 *	- Type and binding attributes match (st_info)
1826 	 *	- Values match (st_value)
1827 	 *	- Sizes match (st_size)
1828 	 *	- Visibility matches (st_other)
1829 	 */
1830 	scnndx = rep_isp->is_scnndx;
1831 	oldndx = rep_isp->is_file->ifl_oldndx;
1832 	symscnt = rep_isp->is_file->ifl_symscnt;
1833 	while (symscnt--) {
1834 		rep_sdp = *oldndx++;
1835 		if ((rep_sdp == NULL) || (rep_sdp->sd_flags & FLG_SY_ISDISC) ||
1836 		    ((rep_sym = rep_sdp->sd_sym)->st_shndx != scnndx) ||
1837 		    ((sym->st_name == 0) != (rep_sym->st_name == 0)) ||
1838 		    ((sym->st_name != 0) &&
1839 		    (strcmp(sdp->sd_name, rep_sdp->sd_name) != 0)) ||
1840 		    (sym->st_info != rep_sym->st_info) ||
1841 		    (sym->st_value != rep_sym->st_value) ||
1842 		    (sym->st_size != rep_sym->st_size) ||
1843 		    (sym->st_other != rep_sym->st_other))
1844 			continue;
1845 
1846 
1847 		if (ofl->ofl_flags & FLG_OF_VERBOSE) {
1848 			if (sym->st_name != 0) {
1849 				ld_eprintf(ofl, ERR_WARNING,
1850 				    MSG_INTL(MSG_REL_SLOPCDATNAM),
1851 				    conv_reloc_type(ifl->ifl_ehdr->e_machine,
1852 				    reld->rel_rtype, 0, &inv_buf),
1853 				    ifl->ifl_name,
1854 				    EC_WORD(reld->rel_isdesc->is_scnndx),
1855 				    reld->rel_isdesc->is_name,
1856 				    rep_sdp->sd_name,
1857 				    EC_WORD(isp->is_scnndx), isp->is_name,
1858 				    rep_sdp->sd_file->ifl_name);
1859 			} else {
1860 				ld_eprintf(ofl, ERR_WARNING,
1861 				    MSG_INTL(MSG_REL_SLOPCDATNONAM),
1862 				    conv_reloc_type(ifl->ifl_ehdr->e_machine,
1863 				    reld->rel_rtype, 0, &inv_buf),
1864 				    ifl->ifl_name,
1865 				    EC_WORD(reld->rel_isdesc->is_scnndx),
1866 				    reld->rel_isdesc->is_name,
1867 				    EC_WORD(isp->is_scnndx), isp->is_name,
1868 				    rep_sdp->sd_file->ifl_name);
1869 			}
1870 		}
1871 		DBG_CALL(Dbg_reloc_sloppycomdat(ofl->ofl_lml, rep_sdp));
1872 		*reject = ofl->ofl_sr_cache.sr_rej = RLXREL_REJ_NONE;
1873 		return (ofl->ofl_sr_cache.sr_rsdp = rep_sdp);
1874 	}
1875 
1876 	/* If didn't return above, we didn't find it */
1877 	*reject = ofl->ofl_sr_cache.sr_rej = RLXREL_REJ_SYMBOL;
1878 	return (ofl->ofl_sr_cache.sr_rsdp = NULL);
1879 }
1880 
1881 /*
1882  * Generate relocation descriptor and dispatch
1883  */
1884 static uintptr_t
1885 process_reld(Ofl_desc *ofl, Is_desc *isp, Rel_desc *reld, Word rsndx,
1886     Rel *reloc)
1887 {
1888 	Ifl_desc	*ifl = isp->is_file;
1889 	Word		rtype = reld->rel_rtype;
1890 	Sym_desc	*sdp;
1891 	Conv_inv_buf_t	inv_buf;
1892 
1893 	/*
1894 	 * Make sure the relocation is in the valid range.
1895 	 */
1896 	if (rtype >= ld_targ.t_m.m_r_num) {
1897 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_INVALRELT),
1898 		    ifl->ifl_name, EC_WORD(isp->is_scnndx), isp->is_name,
1899 		    rtype);
1900 		return (S_ERROR);
1901 	}
1902 
1903 	ofl->ofl_entrelscnt++;
1904 
1905 	/*
1906 	 * Special case: a register symbol associated with symbol index 0 is
1907 	 * initialized (i.e., relocated) to a constant from the r_addend field
1908 	 * rather than from a symbol value.
1909 	 */
1910 	if (IS_REGISTER(rtype) && (rsndx == 0)) {
1911 		reld->rel_sym = NULL;
1912 		DBG_CALL(Dbg_reloc_in(ofl->ofl_lml, ELF_DBG_LD,
1913 		    ld_targ.t_m.m_mach, isp->is_shdr->sh_type,
1914 		    (void *)reloc, isp->is_name, isp->is_scnndx,
1915 		    ld_reloc_sym_name(reld)));
1916 		if (ld_targ.t_mr.mr_reloc_register == NULL) {
1917 			ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_NOREG));
1918 			return (S_ERROR);
1919 		}
1920 		return ((*ld_targ.t_mr.mr_reloc_register)(reld, isp, ofl));
1921 	}
1922 
1923 	/*
1924 	 * If this is a STT_SECTION symbol, make sure the associated
1925 	 * section has a descriptive non-NULL is_sym_name field that can
1926 	 * be accessed by ld_reloc_sym_name() to satisfy debugging output
1927 	 * and errors.
1928 	 *
1929 	 * In principle, we could add this string to every input section
1930 	 * as it is created, but we defer it until we see a relocation
1931 	 * symbol that might need it. Not every section will have such
1932 	 * a relocation, so we create fewer of them this way.
1933 	 */
1934 	sdp = reld->rel_sym = ifl->ifl_oldndx[rsndx];
1935 	if ((sdp != NULL) &&
1936 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) &&
1937 	    (sdp->sd_isc != NULL) && (sdp->sd_isc->is_name != NULL) &&
1938 	    (sdp->sd_isc->is_sym_name == NULL) &&
1939 	    (ld_stt_section_sym_name(sdp->sd_isc) == NULL))
1940 		return (S_ERROR);
1941 
1942 	/*
1943 	 * If for some reason we have a null relocation record issue a
1944 	 * warning and continue (the compiler folks can get into this
1945 	 * state some time).  Normal users should never see this error.
1946 	 */
1947 	if (rtype == ld_targ.t_m.m_r_none) {
1948 		DBG_CALL(Dbg_reloc_in(ofl->ofl_lml, ELF_DBG_LD,
1949 		    ld_targ.t_m.m_mach, ld_targ.t_m.m_rel_sht_type,
1950 		    (void *)reloc, isp->is_name, isp->is_scnndx,
1951 		    ld_reloc_sym_name(reld)));
1952 		ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_REL_NULL),
1953 		    ifl->ifl_name, EC_WORD(isp->is_scnndx), isp->is_name);
1954 		return (1);
1955 	}
1956 
1957 	if (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) &&
1958 	    IS_NOTSUP(rtype)) {
1959 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_NOTSUP),
1960 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
1961 		    0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx),
1962 		    isp->is_name);
1963 		return (S_ERROR);
1964 	}
1965 
1966 	/*
1967 	 * If we are here, we know that the relocation requires reference
1968 	 * symbol. If no symbol is assigned, this is a fatal error.
1969 	 */
1970 	if (sdp == NULL) {
1971 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_NOSYMBOL),
1972 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
1973 		    0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx),
1974 		    isp->is_name, EC_XWORD(reloc->r_offset));
1975 		return (S_ERROR);
1976 	}
1977 
1978 	if (sdp->sd_flags & FLG_SY_IGNORE)
1979 		return (1);
1980 
1981 	/*
1982 	 * If this symbol is part of a DISCARDED section attempt to find another
1983 	 * definition.
1984 	 */
1985 	if (sdp->sd_flags & FLG_SY_ISDISC) {
1986 		Sym_desc	*nsdp = NULL;
1987 		Rlxrel_rej	reject;
1988 
1989 		if (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL) {
1990 			/*
1991 			 * If "-z relaxreloc", and the input section is COMDAT
1992 			 * that has been assigned to an output section, then
1993 			 * determine if this is a reference to a discarded
1994 			 * COMDAT section that can be replaced with a COMDAT
1995 			 * that has been kept.
1996 			 */
1997 			if ((ofl->ofl_flags1 & FLG_OF1_RLXREL) &&
1998 			    sdp->sd_isc->is_osdesc &&
1999 			    (sdp->sd_isc->is_flags & FLG_IS_COMDAT) &&
2000 			    ((nsdp = sloppy_comdat_reloc(ofl, reld,
2001 			    sdp, &reject)) == NULL)) {
2002 				Shdr	*is_shdr = reld->rel_isdesc->is_shdr;
2003 
2004 				/*
2005 				 * A matching symbol was not found. We will
2006 				 * ignore this relocation.  Determine whether
2007 				 * or not to issue a warning.
2008 				 * Warnings are always issued under -z verbose,
2009 				 * but otherwise, we will follow the lead of
2010 				 * the GNU ld and suppress them for certain
2011 				 * cases:
2012 				 *
2013 				 *  -	It is a non-allocable debug section.
2014 				 *	The GNU ld tests for these by name,
2015 				 *	but we are willing to extend it to
2016 				 *	any non-allocable section.
2017 				 *  -	The target section is excluded from
2018 				 *	sloppy relocations by policy.
2019 				 */
2020 				if (((ofl->ofl_flags & FLG_OF_VERBOSE) != 0) ||
2021 				    ((is_shdr->sh_flags & SHF_ALLOC) &&
2022 				    (reject != RLXREL_REJ_TARGET)))
2023 					ld_eprintf(ofl, ERR_WARNING,
2024 					    MSG_INTL(MSG_REL_SLOPCDATNOSYM),
2025 					    conv_reloc_type(
2026 					    ifl->ifl_ehdr->e_machine,
2027 					    reld->rel_rtype, 0, &inv_buf),
2028 					    ifl->ifl_name,
2029 					    EC_WORD(isp->is_scnndx),
2030 					    isp->is_name,
2031 					    ld_reloc_sym_name(reld),
2032 					    EC_WORD(sdp->sd_isc->is_scnndx),
2033 					    sdp->sd_isc->is_name);
2034 				return (1);
2035 			}
2036 		} else if ((sdp != NULL) && sdp->sd_name && *sdp->sd_name)
2037 			nsdp = ld_sym_find(sdp->sd_name, SYM_NOHASH, NULL, ofl);
2038 
2039 		if (nsdp == NULL) {
2040 			ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_SYMDISC),
2041 			    conv_reloc_type(ifl->ifl_ehdr->e_machine,
2042 			    reld->rel_rtype, 0, &inv_buf), ifl->ifl_name,
2043 			    EC_WORD(isp->is_scnndx), isp->is_name,
2044 			    ld_reloc_sym_name(reld),
2045 			    EC_WORD(sdp->sd_isc->is_scnndx),
2046 			    sdp->sd_isc->is_name);
2047 			return (S_ERROR);
2048 		}
2049 		ifl->ifl_oldndx[rsndx] = sdp = nsdp;
2050 		if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) &&
2051 		    (sdp->sd_isc != NULL) && (sdp->sd_isc->is_name != NULL) &&
2052 		    (sdp->sd_isc->is_sym_name == NULL) &&
2053 		    (ld_stt_section_sym_name(sdp->sd_isc) == NULL))
2054 			return (S_ERROR);
2055 	}
2056 
2057 	/*
2058 	 * If this is a global symbol, determine whether its visibility needs
2059 	 * adjusting.
2060 	 */
2061 	if (sdp->sd_aux && ((sdp->sd_flags & FLG_SY_VISIBLE) == 0))
2062 		ld_sym_adjust_vis(sdp, ofl);
2063 
2064 	/*
2065 	 * Ignore any relocation against a section that will not be in the
2066 	 * output file (has been stripped).
2067 	 */
2068 	if ((sdp->sd_isc == 0) &&
2069 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION))
2070 		return (1);
2071 
2072 	/*
2073 	 * If the input section exists, but the section has not been associated
2074 	 * to an output section, then this is a little suspicious.
2075 	 */
2076 	if (sdp->sd_isc && (sdp->sd_isc->is_osdesc == 0) &&
2077 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION)) {
2078 		ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_RELINVSEC),
2079 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
2080 		    0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx),
2081 		    isp->is_name, EC_WORD(sdp->sd_isc->is_scnndx),
2082 		    sdp->sd_isc->is_name);
2083 		return (1);
2084 	}
2085 
2086 	/*
2087 	 * If the symbol for this relocation is invalid (which should have
2088 	 * generated a message during symbol processing), or the relocation
2089 	 * record's symbol reference is in any other way invalid, then it's
2090 	 * about time we gave up.
2091 	 */
2092 	if ((sdp->sd_flags & FLG_SY_INVALID) || (rsndx == 0) ||
2093 	    (rsndx >= ifl->ifl_symscnt)) {
2094 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_UNKNWSYM),
2095 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
2096 		    0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx),
2097 		    isp->is_name, ld_reloc_sym_name(reld),
2098 		    EC_XWORD(reloc->r_offset), EC_WORD(rsndx));
2099 		return (S_ERROR);
2100 	}
2101 
2102 	/*
2103 	 * Size relocations against section symbols are presently unsupported.
2104 	 * There is a question as to whether the input section size, or output
2105 	 * section size would be used.  Until an explicit requirement is
2106 	 * established for either case, we'll punt.
2107 	 */
2108 	if (IS_SIZE(rtype) &&
2109 	    (ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION)) {
2110 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_UNSUPSIZE),
2111 		    conv_reloc_type(ifl->ifl_ehdr->e_machine, rtype,
2112 		    0, &inv_buf), ifl->ifl_name, EC_WORD(isp->is_scnndx),
2113 		    isp->is_name);
2114 		return (S_ERROR);
2115 	}
2116 
2117 	reld->rel_sym = sdp;
2118 	if (reld->rel_aux)
2119 		reld->rel_aux->ra_usym = sdp;
2120 	return (ld_process_sym_reloc(ofl, reld, reloc, isp, isp->is_name,
2121 	    isp->is_scnndx));
2122 }
2123 
2124 static uintptr_t
2125 reloc_section(Ofl_desc *ofl, Is_desc *isect, Is_desc *rsect, Os_desc *osect)
2126 {
2127 	Rel		*rend;		/* end of relocation section data */
2128 	Rel		*reloc;		/* current relocation entry */
2129 	Xword		rsize;		/* size of relocation section data */
2130 	Xword		entsize;	/* size of relocation entry */
2131 	Rel_desc	reld;		/* relocation descriptor */
2132 	Rel_aux	rel_aux;
2133 	Shdr *		shdr;
2134 	Word		flags = 0;
2135 	uintptr_t	ret = 1;
2136 
2137 	shdr = rsect->is_shdr;
2138 	rsize = shdr->sh_size;
2139 	reloc = (Rel *)rsect->is_indata->d_buf;
2140 
2141 	/*
2142 	 * Decide entry size.
2143 	 */
2144 	if (((entsize = shdr->sh_entsize) == 0) || (entsize > rsize)) {
2145 		if (shdr->sh_type == SHT_RELA)
2146 			entsize = sizeof (Rela);
2147 		else
2148 			entsize = sizeof (Rel);
2149 	}
2150 
2151 	/*
2152 	 * Build up the basic information in for the Rel_desc structure.
2153 	 */
2154 	reld.rel_isdesc = isect;
2155 	reld.rel_aux = &rel_aux;
2156 	ld_init_rel_aux(&reld);
2157 	rel_aux.ra_osdesc = osect;
2158 
2159 	if ((ofl->ofl_flags & FLG_OF_RELOBJ) ||
2160 	    (osect && (osect->os_sgdesc->sg_phdr.p_type == PT_LOAD)))
2161 		flags |= FLG_REL_LOAD;
2162 
2163 	if (shdr->sh_info == 0)
2164 		flags |= FLG_REL_NOINFO;
2165 
2166 	DBG_CALL(Dbg_reloc_proc(ofl->ofl_lml, osect, isect, rsect));
2167 
2168 	for (rend = (Rel *)((uintptr_t)reloc + (uintptr_t)rsize);
2169 	    reloc < rend;
2170 	    reloc = (Rel *)((uintptr_t)reloc + (uintptr_t)entsize)) {
2171 		Word	rsndx;
2172 
2173 		/*
2174 		 * Initialize the relocation record information and process
2175 		 * the individual relocation.  Reinitialize the flags to
2176 		 * insure we don't carry any state over from the previous
2177 		 * relocation records processing.
2178 		 */
2179 		reld.rel_flags = flags;
2180 		rsndx = (*ld_targ.t_mr.mr_init_rel)(&reld,
2181 		    &rel_aux.ra_typedata, (void *)reloc);
2182 
2183 		/*
2184 		 * Determine whether or not to pass an auxiliary block
2185 		 * in with this Rel_desc. It is not needed if both the
2186 		 * osdesc and typedata fields have default values.
2187 		 */
2188 		reld.rel_aux =
2189 		    (RELAUX_ISDEFAULT_OSDESC(&reld, rel_aux.ra_osdesc) &&
2190 		    RELAUX_ISDEFAULT_TYPEDATA(&reld, rel_aux.ra_typedata)) ?
2191 		    NULL : &rel_aux;
2192 
2193 		if (process_reld(ofl, rsect, &reld, rsndx, reloc) == S_ERROR)
2194 			ret = S_ERROR;
2195 	}
2196 	return (ret);
2197 }
2198 
2199 static uintptr_t
2200 reloc_segments(int wr_flag, Ofl_desc *ofl)
2201 {
2202 	Aliste		idx1;
2203 	Sg_desc		*sgp;
2204 	Is_desc		*isp;
2205 
2206 	for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
2207 		Os_desc	*osp;
2208 		Aliste	idx2;
2209 
2210 		if ((sgp->sg_phdr.p_flags & PF_W) != wr_flag)
2211 			continue;
2212 
2213 		for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
2214 			Is_desc	*risp;
2215 			Aliste	idx3;
2216 
2217 			osp->os_szoutrels = 0;
2218 			for (APLIST_TRAVERSE(osp->os_relisdescs, idx3, risp)) {
2219 				Word	indx;
2220 
2221 				/*
2222 				 * Determine the input section that this
2223 				 * relocation information refers to.
2224 				 */
2225 				indx = risp->is_shdr->sh_info;
2226 				isp = risp->is_file->ifl_isdesc[indx];
2227 
2228 				/*
2229 				 * Do not process relocations against sections
2230 				 * which are being discarded (COMDAT)
2231 				 */
2232 				if (isp->is_flags & FLG_IS_DISCARD)
2233 					continue;
2234 
2235 				if (reloc_section(ofl, isp, risp, osp) ==
2236 				    S_ERROR)
2237 					return (S_ERROR);
2238 			}
2239 
2240 			/*
2241 			 * Check for relocations against non-writable
2242 			 * allocatable sections.
2243 			 */
2244 			if (osp->os_szoutrels &&
2245 			    (sgp->sg_phdr.p_type == PT_LOAD) &&
2246 			    ((sgp->sg_phdr.p_flags & PF_W) == 0)) {
2247 				ofl->ofl_flags |= FLG_OF_TEXTREL;
2248 				ofl->ofl_dtflags |= DF_TEXTREL;
2249 			}
2250 		}
2251 	}
2252 
2253 	return (1);
2254 }
2255 
2256 /*
2257  * Move Section related function
2258  * Get move entry
2259  */
2260 static Move *
2261 get_move_entry(Is_desc *rsect, Xword roffset)
2262 {
2263 	Ifl_desc	*ifile = rsect->is_file;
2264 	Shdr		*rshdr = rsect->is_shdr;
2265 	Is_desc		*misp;
2266 	Shdr		*mshdr;
2267 	Xword 		midx;
2268 	Move		*mvp;
2269 
2270 	/*
2271 	 * Set info for the target move section
2272 	 */
2273 	misp = ifile->ifl_isdesc[rshdr->sh_info];
2274 	mshdr = misp->is_shdr;
2275 
2276 	if (mshdr->sh_entsize == 0)
2277 		return (NULL);
2278 
2279 	/*
2280 	 * If this is an invalid entry, return NULL.
2281 	 */
2282 	midx = roffset / mshdr->sh_entsize;
2283 	if ((midx * mshdr->sh_entsize) >= mshdr->sh_size)
2284 		return (NULL);
2285 
2286 	mvp = (Move *)misp->is_indata->d_buf;
2287 	mvp += midx;
2288 	return (mvp);
2289 }
2290 
2291 /*
2292  * Relocation against Move Table.
2293  */
2294 static uintptr_t
2295 process_movereloc(Ofl_desc *ofl, Is_desc *rsect)
2296 {
2297 	Ifl_desc	*file = rsect->is_file;
2298 	Rel		*rend, *reloc;
2299 	Xword 		rsize, entsize;
2300 	Rel_desc 	reld;
2301 	Rel_aux	rel_aux;
2302 
2303 	rsize = rsect->is_shdr->sh_size;
2304 	reloc = (Rel *)rsect->is_indata->d_buf;
2305 
2306 	/*
2307 	 * Decide entry size.
2308 	 */
2309 	entsize = rsect->is_shdr->sh_entsize;
2310 	if ((entsize == 0) ||
2311 	    (entsize > rsect->is_shdr->sh_size)) {
2312 		if (rsect->is_shdr->sh_type == SHT_RELA)
2313 			entsize = sizeof (Rela);
2314 		else
2315 			entsize = sizeof (Rel);
2316 	}
2317 
2318 	/*
2319 	 * The requirement for move data ensures that we have to supply a
2320 	 * Rel_aux auxiliary block.
2321 	 */
2322 	reld.rel_aux = &rel_aux;
2323 	ld_init_rel_aux(&reld);
2324 
2325 	/*
2326 	 * Go through the relocation entries.
2327 	 */
2328 	for (rend = (Rel *)((uintptr_t)reloc + (uintptr_t)rsize);
2329 	    reloc < rend;
2330 	    reloc = (Rel *)((uintptr_t)reloc + (uintptr_t)entsize)) {
2331 		Sym_desc	*psdp;
2332 		Move		*mvp;
2333 		Word		rsndx;
2334 
2335 		/*
2336 		 * Initialize the relocation record information.
2337 		 */
2338 		reld.rel_flags = FLG_REL_LOAD;
2339 		rsndx = (*ld_targ.t_mr.mr_init_rel)(&reld,
2340 		    &rel_aux.ra_typedata, (void *)reloc);
2341 
2342 		if (((mvp = get_move_entry(rsect, reloc->r_offset)) == NULL) ||
2343 		    ((rel_aux.ra_move =
2344 		    libld_malloc(sizeof (Mv_reloc))) == NULL))
2345 			return (S_ERROR);
2346 
2347 		psdp = file->ifl_oldndx[ELF_M_SYM(mvp->m_info)];
2348 		rel_aux.ra_move->mr_move = mvp;
2349 		rel_aux.ra_move->mr_sym = psdp;
2350 
2351 		if (psdp->sd_flags & FLG_SY_PAREXPN) {
2352 			int	_num, num = mvp->m_repeat;
2353 
2354 			rel_aux.ra_osdesc = ofl->ofl_isparexpn->is_osdesc;
2355 			reld.rel_isdesc = ofl->ofl_isparexpn;
2356 			reld.rel_roffset = mvp->m_poffset;
2357 
2358 			for (_num = 0; _num < num; _num++) {
2359 				reld.rel_roffset +=
2360 				    /* LINTED */
2361 				    (_num * ELF_M_SIZE(mvp->m_info));
2362 
2363 				/*
2364 				 * Generate Reld
2365 				 */
2366 				if (process_reld(ofl,
2367 				    rsect, &reld, rsndx, reloc) == S_ERROR)
2368 					return (S_ERROR);
2369 			}
2370 		} else {
2371 			/*
2372 			 * Generate Reld
2373 			 */
2374 			reld.rel_flags |= FLG_REL_MOVETAB;
2375 			rel_aux.ra_osdesc = ofl->ofl_osmove;
2376 			reld.rel_isdesc = ld_os_first_isdesc(ofl->ofl_osmove);
2377 
2378 			if (process_reld(ofl,
2379 			    rsect, &reld, rsndx, reloc) == S_ERROR)
2380 				return (S_ERROR);
2381 		}
2382 	}
2383 	return (1);
2384 }
2385 
2386 /*
2387  * This function is similar to reloc_init().
2388  *
2389  * This function is called when the SHT_SUNW_move table is expanded and there
2390  * are relocations against the SHT_SUNW_move section.
2391  */
2392 static uintptr_t
2393 reloc_movesections(Ofl_desc *ofl)
2394 {
2395 	Aliste		idx;
2396 	Is_desc		*risp;
2397 	uintptr_t	ret = 1;
2398 
2399 	/*
2400 	 * Generate/Expand relocation entries
2401 	 */
2402 	for (APLIST_TRAVERSE(ofl->ofl_ismoverel, idx, risp)) {
2403 		if (process_movereloc(ofl, risp) == S_ERROR)
2404 			ret = S_ERROR;
2405 	}
2406 
2407 	return (ret);
2408 }
2409 
2410 /*
2411  * Count the number of output relocation entries, global offset table entries,
2412  * and procedure linkage table entries.  This function searches the segment and
2413  * outsect lists and passes each input reloc section to process_reloc().
2414  * It allocates space for any output relocations needed.  And builds up
2415  * the relocation structures for later processing.
2416  */
2417 uintptr_t
2418 ld_reloc_init(Ofl_desc *ofl)
2419 {
2420 	Aliste		idx;
2421 	Is_desc		*isp;
2422 	Sym_desc	*sdp;
2423 
2424 	DBG_CALL(Dbg_basic_collect(ofl->ofl_lml));
2425 
2426 	/*
2427 	 * At this point we have finished processing all input symbols.  Make
2428 	 * sure we add any absolute (internal) symbols before continuing with
2429 	 * any relocation processing.
2430 	 */
2431 	if (ld_sym_spec(ofl) == S_ERROR)
2432 		return (S_ERROR);
2433 
2434 	ofl->ofl_gotcnt = ld_targ.t_m.m_got_xnumber;
2435 
2436 	/*
2437 	 * Process all of the relocations against NON-writable segments
2438 	 * followed by relocations against the writable segments.
2439 	 *
2440 	 * This separation is so that when the writable segments are processed
2441 	 * we know whether or not a COPYRELOC will be produced for any symbols.
2442 	 * If relocations aren't processed in this order, a COPYRELOC and a
2443 	 * regular relocation can be produced against the same symbol.  The
2444 	 * regular relocation would be redundant.
2445 	 */
2446 	if (reloc_segments(0, ofl) == S_ERROR)
2447 		return (S_ERROR);
2448 
2449 	if (reloc_segments(PF_W, ofl) == S_ERROR)
2450 		return (S_ERROR);
2451 
2452 	/*
2453 	 * Process any extra relocations.  These are relocation sections that
2454 	 * have a NULL sh_info.
2455 	 */
2456 	for (APLIST_TRAVERSE(ofl->ofl_extrarels, idx, isp)) {
2457 		if (reloc_section(ofl, NULL, isp, NULL) == S_ERROR)
2458 			return (S_ERROR);
2459 	}
2460 
2461 	/*
2462 	 * If there were relocation against move table,
2463 	 * process the relocation sections.
2464 	 */
2465 	if (reloc_movesections(ofl) == S_ERROR)
2466 		return (S_ERROR);
2467 
2468 	/*
2469 	 * Now all the relocations are pre-processed,
2470 	 * check the validity of copy relocations.
2471 	 */
2472 	if (ofl->ofl_copyrels) {
2473 		Copy_rel	*crp;
2474 
2475 		for (ALIST_TRAVERSE(ofl->ofl_copyrels, idx, crp)) {
2476 			/*
2477 			 * If there were no displacement relocation
2478 			 * in this file, don't worry about it.
2479 			 */
2480 			if (crp->c_sdp->sd_file->ifl_flags &
2481 			    (FLG_IF_DISPPEND | FLG_IF_DISPDONE))
2482 				is_disp_copied(ofl, crp);
2483 		}
2484 	}
2485 
2486 	/*
2487 	 * GOT sections are created for dynamic executables and shared objects
2488 	 * if the FLG_OF_BLDGOT is set, or explicit reference has been made to
2489 	 * a GOT symbol.
2490 	 */
2491 	if (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) &&
2492 	    ((ofl->ofl_flags & FLG_OF_BLDGOT) ||
2493 	    ((((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL),
2494 	    SYM_NOHASH, NULL, ofl)) != NULL) ||
2495 	    ((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL_U),
2496 	    SYM_NOHASH, NULL, ofl)) != NULL)) &&
2497 	    (sdp->sd_ref != REF_DYN_SEEN)))) {
2498 		if (ld_make_got(ofl) == S_ERROR)
2499 			return (S_ERROR);
2500 
2501 		/* Allocate the GOT if required by target */
2502 		if ((ld_targ.t_mr.mr_allocate_got != NULL) &&
2503 		    ((*ld_targ.t_mr.mr_allocate_got)(ofl) == S_ERROR))
2504 			return (S_ERROR);
2505 	}
2506 
2507 	return (1);
2508 }
2509 
2510 /*
2511  * Simple comparison routine to be used by qsort() for
2512  * the sorting of the output relocation list.
2513  *
2514  * The reloc_compare() routine results in a relocation
2515  * table which is located on:
2516  *
2517  *	file referenced (NEEDED NDX)
2518  *	referenced symbol
2519  *	relocation offset
2520  *
2521  * This provides the most efficient traversal of the relocation
2522  * table at run-time.
2523  */
2524 static int
2525 reloc_compare(Reloc_list *i, Reloc_list *j)
2526 {
2527 
2528 	/*
2529 	 * first - sort on neededndx
2530 	 */
2531 	if (i->rl_key1 > j->rl_key1)
2532 		return (1);
2533 	if (i->rl_key1 < j->rl_key1)
2534 		return (-1);
2535 
2536 	/*
2537 	 * Then sort on symbol
2538 	 */
2539 	if ((uintptr_t)i->rl_key2 > (uintptr_t)j->rl_key2)
2540 		return (1);
2541 	if ((uintptr_t)i->rl_key2 < (uintptr_t)j->rl_key2)
2542 		return (-1);
2543 
2544 	/*
2545 	 * i->key2 == j->key2
2546 	 *
2547 	 * At this point we fall back to key2 (offsets) to
2548 	 * sort the output relocations.  Ideally this will
2549 	 * make for the most efficient processing of these
2550 	 * relocations at run-time.
2551 	 */
2552 	if (i->rl_key3 > j->rl_key3)
2553 		return (1);
2554 	if (i->rl_key3 < j->rl_key3)
2555 		return (-1);
2556 	return (0);
2557 }
2558 
2559 static uintptr_t
2560 do_sorted_outrelocs(Ofl_desc *ofl)
2561 {
2562 	Rel_desc	*orsp;
2563 	Rel_cachebuf	*rcbp;
2564 	Aliste		idx;
2565 	Reloc_list	*sorted_list;
2566 	Word		index = 0;
2567 	int		debug = 0;
2568 	uintptr_t	error = 1;
2569 	Boolean		remain_seen = FALSE;
2570 
2571 	if ((sorted_list = libld_malloc((size_t)(sizeof (Reloc_list) *
2572 	    ofl->ofl_reloccnt))) == NULL)
2573 		return (S_ERROR);
2574 
2575 	/*
2576 	 * All but the PLT output relocations are sorted in the output file
2577 	 * based upon their sym_desc.  By doing this multiple relocations
2578 	 * against the same symbol are grouped together, thus when the object
2579 	 * is later relocated by ld.so.1 it will take advantage of the symbol
2580 	 * cache that ld.so.1 has.  This can significantly reduce the runtime
2581 	 * relocation cost of a dynamic object.
2582 	 *
2583 	 * PLT relocations are not sorted because the order of the PLT
2584 	 * relocations is used by ld.so.1 to determine what symbol a PLT
2585 	 * relocation is against.
2586 	 */
2587 	REL_CACHE_TRAVERSE(&ofl->ofl_outrels, idx, rcbp, orsp) {
2588 		if (debug == 0) {
2589 			DBG_CALL(Dbg_reloc_dooutrel(ofl->ofl_lml,
2590 			    ld_targ.t_m.m_rel_sht_type));
2591 			debug = 1;
2592 		}
2593 
2594 		/*
2595 		 * If it's a PLT relocation we output it now in the
2596 		 * order that it was originally processed.
2597 		 */
2598 		if (orsp->rel_flags & FLG_REL_PLT) {
2599 			if ((*ld_targ.t_mr.mr_perform_outreloc)
2600 			    (orsp, ofl, &remain_seen) == S_ERROR)
2601 				error = S_ERROR;
2602 			continue;
2603 		}
2604 
2605 		if ((orsp->rel_rtype == ld_targ.t_m.m_r_relative) ||
2606 		    (orsp->rel_rtype == ld_targ.t_m.m_r_register)) {
2607 			sorted_list[index].rl_key1 = 0;
2608 			sorted_list[index].rl_key2 =
2609 			    /* LINTED */
2610 			    (Sym_desc *)(uintptr_t)orsp->rel_rtype;
2611 		} else {
2612 			sorted_list[index].rl_key1 =
2613 			    orsp->rel_sym->sd_file->ifl_neededndx;
2614 			sorted_list[index].rl_key2 = orsp->rel_sym;
2615 		}
2616 
2617 		if (orsp->rel_flags & FLG_REL_GOT) {
2618 			sorted_list[index].rl_key3 =
2619 			    (*ld_targ.t_mr.mr_calc_got_offset)(orsp, ofl);
2620 		} else {
2621 			if (orsp->rel_rtype == ld_targ.t_m.m_r_register) {
2622 					sorted_list[index].rl_key3 = 0;
2623 			} else {
2624 				sorted_list[index].rl_key3 = orsp->rel_roffset +
2625 				    (Xword)_elf_getxoff(orsp->
2626 				    rel_isdesc->is_indata) +
2627 				    orsp->rel_isdesc->is_osdesc->
2628 				    os_shdr->sh_addr;
2629 			}
2630 		}
2631 
2632 		sorted_list[index++].rl_rsp = orsp;
2633 	}
2634 
2635 	qsort(sorted_list, (size_t)ofl->ofl_reloccnt, sizeof (Reloc_list),
2636 	    (int (*)(const void *, const void *))reloc_compare);
2637 
2638 	/*
2639 	 * All output relocations have now been sorted, go through
2640 	 * and process each relocation.
2641 	 */
2642 	for (index = 0; index < ofl->ofl_reloccnt; index++) {
2643 		if ((*ld_targ.t_mr.mr_perform_outreloc)
2644 		    (sorted_list[index].rl_rsp, ofl, &remain_seen) == S_ERROR)
2645 			error = S_ERROR;
2646 	}
2647 
2648 	/* Guidance: Use -z text when building shared objects */
2649 	if (remain_seen && OFL_GUIDANCE(ofl, FLG_OFG_NO_TEXT))
2650 		ld_eprintf(ofl, ERR_GUIDANCE, MSG_INTL(MSG_GUIDE_TEXT));
2651 
2652 	return (error);
2653 }
2654 
2655 /*
2656  * Process relocations.  Finds every input relocation section for each output
2657  * section and invokes reloc_section() to relocate that section.
2658  */
2659 uintptr_t
2660 ld_reloc_process(Ofl_desc *ofl)
2661 {
2662 	Sg_desc		*sgp;
2663 	Os_desc		*osp;
2664 	Word		ndx = 0;
2665 	ofl_flag_t	flags = ofl->ofl_flags;
2666 	Shdr		*shdr;
2667 
2668 	DBG_CALL(Dbg_basic_relocate(ofl->ofl_lml));
2669 
2670 	/*
2671 	 * Determine the index of the symbol table that will be referenced by
2672 	 * the relocation entries.
2673 	 */
2674 	if (OFL_ALLOW_DYNSYM(ofl))
2675 		/* LINTED */
2676 		ndx = (Word)elf_ndxscn(ofl->ofl_osdynsym->os_scn);
2677 	else if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ))
2678 		/* LINTED */
2679 		ndx = (Word)elf_ndxscn(ofl->ofl_ossymtab->os_scn);
2680 
2681 	/*
2682 	 * Re-initialize counters. These are used to provide relocation
2683 	 * offsets within the output buffers.
2684 	 */
2685 	ofl->ofl_relocpltsz = 0;
2686 	ofl->ofl_relocgotsz = 0;
2687 	ofl->ofl_relocbsssz = 0;
2688 
2689 	/*
2690 	 * Now that the output file is created and symbol update has occurred,
2691 	 * process the relocations collected in process_reloc().
2692 	 */
2693 	if (do_sorted_outrelocs(ofl) == S_ERROR)
2694 		return (S_ERROR);
2695 
2696 	if ((*ld_targ.t_mr.mr_do_activerelocs)(ofl) == S_ERROR)
2697 		return (S_ERROR);
2698 
2699 	if ((flags & FLG_OF_COMREL) == 0) {
2700 		Aliste	idx1;
2701 
2702 		/*
2703 		 * Process the relocation sections.  For each relocation
2704 		 * section generated for the output image update its shdr
2705 		 * information to reflect the symbol table it needs (sh_link)
2706 		 * and the section to which the relocation must be applied
2707 		 * (sh_info).
2708 		 */
2709 		for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
2710 			Os_desc *osp;
2711 			Aliste	idx2;
2712 
2713 			for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
2714 				if (osp->os_relosdesc == 0)
2715 					continue;
2716 
2717 				shdr = osp->os_relosdesc->os_shdr;
2718 				shdr->sh_link = ndx;
2719 				/* LINTED */
2720 				shdr->sh_info = (Word)elf_ndxscn(osp->os_scn);
2721 			}
2722 		}
2723 
2724 		/*
2725 		 * Since the .rel[a] section is not tied to any specific
2726 		 * section, we'd not have found it above.
2727 		 */
2728 		if ((osp = ofl->ofl_osrel) != NULL) {
2729 			shdr = osp->os_shdr;
2730 			shdr->sh_link = ndx;
2731 			shdr->sh_info = 0;
2732 		}
2733 	} else {
2734 		/*
2735 		 * We only have two relocation sections here, (PLT's,
2736 		 * coalesced) so just hit them directly instead of stepping
2737 		 * over the output sections.
2738 		 */
2739 		if ((osp = ofl->ofl_osrelhead) != NULL) {
2740 			shdr = osp->os_shdr;
2741 			shdr->sh_link = ndx;
2742 			shdr->sh_info = 0;
2743 		}
2744 		if (((osp = ofl->ofl_osplt) != NULL) && osp->os_relosdesc) {
2745 			shdr = osp->os_relosdesc->os_shdr;
2746 			shdr->sh_link = ndx;
2747 			/* LINTED */
2748 			shdr->sh_info = (Word)elf_ndxscn(osp->os_scn);
2749 		}
2750 	}
2751 
2752 	/*
2753 	 * If the -z text option was given, and we have output relocations
2754 	 * against a non-writable, allocatable section, issue a diagnostic and
2755 	 * return (the actual entries that caused this error would have been
2756 	 * output during the relocating section phase).
2757 	 */
2758 	if ((flags & (FLG_OF_PURETXT | FLG_OF_TEXTREL)) ==
2759 	    (FLG_OF_PURETXT | FLG_OF_TEXTREL)) {
2760 		ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_REMAIN_3));
2761 		return (S_ERROR);
2762 	}
2763 
2764 	/*
2765 	 * Finally, initialize the first got entry with the address of the
2766 	 * .dynamic section (_DYNAMIC).
2767 	 */
2768 	if (flags & FLG_OF_DYNAMIC) {
2769 		if ((*ld_targ.t_mr.mr_fillin_gotplt)(ofl) == S_ERROR)
2770 			return (S_ERROR);
2771 	}
2772 
2773 	/*
2774 	 * Now that any GOT information has been written, display the debugging
2775 	 * information if required.
2776 	 */
2777 	if ((osp = ofl->ofl_osgot) != NULL)
2778 		DBG_CALL(Dbg_got_display(ofl, osp->os_shdr->sh_addr, 1,
2779 		    ld_targ.t_m.m_got_xnumber, ld_targ.t_m.m_got_entsize));
2780 
2781 	return (1);
2782 }
2783 
2784 /*
2785  * If the -z text option was given, and we have output relocations against a
2786  * non-writable, allocatable section, issue a diagnostic. Print offending
2787  * symbols in tabular form similar to the way undefined symbols are presented.
2788  * Called from reloc_count().  The actual fatal error condition is triggered on
2789  * in reloc_process() above.
2790  *
2791  * Note.  For historic reasons -ztext is not a default option (however all OS
2792  * shared object builds use this option).  It can be argued that this option
2793  * should also be default when generating an a.out (see 1163979).  However, if
2794  * an a.out contains text relocations it is either because the user is creating
2795  * something pretty weird (they've used the -b or -znodefs options), or because
2796  * the library against which they're building wasn't constructed correctly (ie.
2797  * a function has a NOTYPE type, in which case the a.out won't generate an
2798  * associated plt).  In the latter case the builder of the a.out can't do
2799  * anything to fix the error - thus we've chosen not to give the user an error,
2800  * or warning, for this case.
2801  */
2802 void
2803 ld_reloc_remain_entry(Rel_desc *orsp, Os_desc *osp, Ofl_desc *ofl,
2804     Boolean *remain_seen)
2805 {
2806 
2807 	/*
2808 	 * -ztextoff
2809 	 */
2810 	if (ofl->ofl_flags1 & FLG_OF1_TEXTOFF)
2811 		return;
2812 
2813 	/*
2814 	 * Only give relocation errors against loadable read-only segments.
2815 	 */
2816 	if ((orsp->rel_rtype == ld_targ.t_m.m_r_register) || (!osp) ||
2817 	    (osp->os_sgdesc->sg_phdr.p_type != PT_LOAD) ||
2818 	    (osp->os_sgdesc->sg_phdr.p_flags & PF_W))
2819 		return;
2820 
2821 	/*
2822 	 * If we are in -ztextwarn mode, it's a silent error if a relocation is
2823 	 * due to a 'WEAK REFERENCE'.  This is because if the symbol is not
2824 	 * provided at run-time we will not perform a text-relocation.
2825 	 */
2826 	if (((ofl->ofl_flags & FLG_OF_PURETXT) == 0) &&
2827 	    (ELF_ST_BIND(orsp->rel_sym->sd_sym->st_info) == STB_WEAK) &&
2828 	    (orsp->rel_sym->sd_sym->st_shndx == SHN_UNDEF))
2829 		return;
2830 
2831 	if (*remain_seen == FALSE) {
2832 		/*
2833 		 * If building with '-ztext' then emit a fatal error.  If
2834 		 * building a executable then only emit a 'warning'.
2835 		 */
2836 		const char *str1 = (ofl->ofl_flags & FLG_OF_PURETXT) ?
2837 		    MSG_INTL(MSG_REL_RMN_ITM_11) : MSG_INTL(MSG_REL_RMN_ITM_13);
2838 
2839 		ld_eprintf(ofl, ERR_NONE, MSG_INTL(MSG_REL_REMAIN_FMT_1), str1,
2840 		    MSG_INTL(MSG_REL_RMN_ITM_31), MSG_INTL(MSG_REL_RMN_ITM_12),
2841 		    MSG_INTL(MSG_REL_RMN_ITM_2), MSG_INTL(MSG_REL_RMN_ITM_32));
2842 
2843 		*remain_seen = TRUE;
2844 	}
2845 
2846 	ld_eprintf(ofl, ERR_NONE, MSG_INTL(MSG_REL_REMAIN_2),
2847 	    ld_reloc_sym_name(orsp), EC_OFF(orsp->rel_roffset),
2848 	    orsp->rel_isdesc->is_file->ifl_name);
2849 }
2850 
2851 /*
2852  * Generic encapsulation for generating a TLS got index.
2853  */
2854 uintptr_t
2855 ld_assign_got_TLS(Boolean local, Rel_desc *rsp, Ofl_desc *ofl, Sym_desc *sdp,
2856     Gotndx *gnp, Gotref gref, Word rflag, Word ortype, Word rtype1, Word rtype2)
2857 {
2858 	Word	rflags;
2859 
2860 	if ((*ld_targ.t_mr.mr_assign_got_ndx)(&(sdp->sd_GOTndxs), gnp,
2861 	    gref, ofl, rsp, sdp) == S_ERROR)
2862 		return (S_ERROR);
2863 
2864 	rflags = FLG_REL_GOT | rflag;
2865 	if (local)
2866 		rflags |= FLG_REL_SCNNDX;
2867 	rsp->rel_rtype = rtype1;
2868 
2869 	if ((*ld_targ.t_mr.mr_add_outrel)(rflags, rsp, ofl) == S_ERROR)
2870 		return (S_ERROR);
2871 
2872 	if (local && (gref == GOT_REF_TLSIE)) {
2873 		/*
2874 		 * If this is a local LE TLS symbol, then the symbol won't be
2875 		 * available at runtime.  The value of the local symbol will
2876 		 * be placed in the associated got entry, and the got
2877 		 * relocation is reassigned to a section symbol.
2878 		 */
2879 		if (ld_add_actrel(rflags, rsp, ofl) == S_ERROR)
2880 			return (S_ERROR);
2881 	}
2882 
2883 	if (rtype2) {
2884 		rflags = FLG_REL_GOT | rflag;
2885 		rsp->rel_rtype = rtype2;
2886 
2887 		if (local) {
2888 			if (ld_add_actrel(rflags, rsp, ofl) == S_ERROR)
2889 				return (S_ERROR);
2890 		} else {
2891 			if ((*ld_targ.t_mr.mr_add_outrel)(rflags, rsp, ofl) ==
2892 			    S_ERROR)
2893 				return (S_ERROR);
2894 		}
2895 	}
2896 
2897 	rsp->rel_rtype = ortype;
2898 
2899 	return (1);
2900 }
2901 
2902 /*
2903  * Move Section related function
2904  */
2905 static void
2906 newroffset_for_move(Sym_desc *sdp, Move *mvp, Xword offset1, Xword *offset2)
2907 {
2908 	Mv_desc		*mdp;
2909 	Aliste		idx;
2910 
2911 	/*
2912 	 * Search for matching move entry.
2913 	 */
2914 	for (ALIST_TRAVERSE(sdp->sd_move, idx, mdp)) {
2915 		if (mdp->md_move == mvp) {
2916 			/*
2917 			 * Update r_offset
2918 			 */
2919 			*offset2 = (Xword)((mdp->md_oidx - 1) * sizeof (Move) +
2920 			    offset1 % sizeof (Move));
2921 			return;
2922 		}
2923 	}
2924 }
2925 
2926 void
2927 ld_adj_movereloc(Ofl_desc *ofl, Rel_desc *arsp)
2928 {
2929 	Move		*move = arsp->rel_aux->ra_move->mr_move;
2930 	Sym_desc	*psdp = arsp->rel_aux->ra_move->mr_sym;
2931 	Xword		newoffset;
2932 
2933 	if (arsp->rel_flags & FLG_REL_MOVETAB) {
2934 		/*
2935 		 * We are relocating the move table itself.
2936 		 */
2937 		newroffset_for_move(psdp, move, arsp->rel_roffset,
2938 		    &newoffset);
2939 		DBG_CALL(Dbg_move_adjmovereloc(ofl->ofl_lml, arsp->rel_roffset,
2940 		    newoffset, psdp->sd_name));
2941 		arsp->rel_roffset = newoffset;
2942 	} else {
2943 		/*
2944 		 * We are expanding the partial symbol.  So we are generating
2945 		 * the relocation entry relocating the expanded partial symbol.
2946 		 */
2947 		arsp->rel_roffset += psdp->sd_sym->st_value -
2948 		    ofl->ofl_isparexpn->is_osdesc->os_shdr->sh_addr;
2949 		DBG_CALL(Dbg_move_adjexpandreloc(ofl->ofl_lml,
2950 		    arsp->rel_roffset, psdp->sd_name));
2951 	}
2952 }
2953 
2954 /*
2955  * Partially Initialized Symbol Handling routines
2956  * For RELA architecture, the second argument is reld->rel_raddend.  For REL
2957  * architecure, the second argument is the value stored at the relocation
2958  * target address.
2959  */
2960 Sym_desc *
2961 ld_am_I_partial(Rel_desc *reld, Xword val)
2962 {
2963 	Ifl_desc	*ifile = reld->rel_sym->sd_isc->is_file;
2964 	int 		nlocs = ifile->ifl_locscnt, i;
2965 
2966 	for (i = 1; i < nlocs; i++) {
2967 		Sym		*osym;
2968 		Sym_desc	*symd = ifile->ifl_oldndx[i];
2969 
2970 		if ((osym = symd->sd_osym) == 0)
2971 			continue;
2972 		if ((symd->sd_flags & FLG_SY_PAREXPN) == 0)
2973 			continue;
2974 		if ((osym->st_value <= val) &&
2975 		    (osym->st_value + osym->st_size > val))
2976 			return (symd);
2977 	}
2978 	return (NULL);
2979 }
2980 
2981 /*
2982  * Return True (1) if the code processing the given relocation
2983  * needs to perform byte swapping when accessing the section data.
2984  */
2985 int
2986 ld_swap_reloc_data(Ofl_desc *ofl, Rel_desc *rsp)
2987 {
2988 	/*
2989 	 * In a cross-link situation where the linker host and target
2990 	 * have opposite byte orders, it can be necessary to swap bytes
2991 	 * when doing relocation processing. This is indicated by the
2992 	 * presence of the FLG_OF1_ENCDIFF flag bit. However, swapping
2993 	 * is only needed for the section types that libelf doesn't
2994 	 * automatically xlate.
2995 	 */
2996 	if ((ofl->ofl_flags1 & FLG_OF1_ENCDIFF) != 0) {
2997 		switch (RELAUX_GET_OSDESC(rsp)->os_shdr->sh_type) {
2998 		case SHT_PROGBITS:
2999 			return (1);
3000 
3001 		case SHT_SPARC_GOTDATA:
3002 			if (ld_targ.t_m.m_mach ==
3003 			    LD_TARG_BYCLASS(EM_SPARC, EM_SPARCV9))
3004 				return (1);
3005 			break;
3006 
3007 		case SHT_AMD64_UNWIND:
3008 			if (ld_targ.t_m.m_mach == EM_AMD64)
3009 				return (1);
3010 			break;
3011 		}
3012 	}
3013 
3014 	/*
3015 	 * If FLG_OF1_ENCDIFF isn't set, or the section isn't
3016 	 * progbits (or similar), then no swapping is needed.
3017 	 */
3018 	return (0);
3019 }
3020 
3021 
3022 
3023 /*
3024  * Obtain the current value at the given relocation target.
3025  *
3026  * entry:
3027  *	ofl - Output file descriptor
3028  *	rsp - Relocation record
3029  *	data - Pointer to relocation target
3030  *	value - Address of variable to recieve value
3031  *
3032  * exit:
3033  *	The value of the data at the relocation target has
3034  *	been stored in value.
3035  */
3036 int
3037 ld_reloc_targval_get(Ofl_desc *ofl, Rel_desc *rsp, uchar_t *data, Xword *value)
3038 {
3039 	const Rel_entry	*rep;
3040 
3041 	rep = &ld_targ.t_mr.mr_reloc_table[rsp->rel_rtype];
3042 
3043 	switch (rep->re_fsize) {
3044 	case 1:
3045 		/* LINTED */
3046 		*value = (Xword) *((uchar_t *)data);
3047 		break;
3048 	case 2:
3049 		{
3050 			Half	v;
3051 			uchar_t	*v_bytes = (uchar_t *)&v;
3052 
3053 			if (OFL_SWAP_RELOC_DATA(ofl, rsp)) {
3054 				UL_ASSIGN_BSWAP_HALF(v_bytes, data);
3055 			} else {
3056 				UL_ASSIGN_HALF(v_bytes, data);
3057 			}
3058 			*value = (Xword) v;
3059 		}
3060 		break;
3061 	case 4:
3062 		{
3063 			Word	v;
3064 			uchar_t	*v_bytes = (uchar_t *)&v;
3065 
3066 			if (OFL_SWAP_RELOC_DATA(ofl, rsp)) {
3067 				UL_ASSIGN_BSWAP_WORD(v_bytes, data);
3068 			} else {
3069 				UL_ASSIGN_WORD(v_bytes, data);
3070 			}
3071 			*value = (Xword) v;
3072 		}
3073 		break;
3074 	default:
3075 		{
3076 			Conv_inv_buf_t inv_buf;
3077 			ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_UNSUPSZ),
3078 			    conv_reloc_type(ld_targ.t_m.m_mach, rsp->rel_rtype,
3079 			    0, &inv_buf), rsp->rel_isdesc->is_file->ifl_name,
3080 			    ld_reloc_sym_name(rsp), (int)rep->re_fsize);
3081 		}
3082 		return (0);
3083 	}
3084 	return (1);
3085 }
3086 
3087 
3088 /*
3089  * Set the value at the given relocation target.
3090  *
3091  * entry:
3092  *	ofl - Output file descriptor
3093  *	rsp - Relocation record
3094  *	data - Pointer to relocation target
3095  *	value - Address of variable to recieve value
3096  *
3097  * exit:
3098  *	The value of the data at the relocation target has
3099  *	been stored in value.
3100  */
3101 int
3102 ld_reloc_targval_set(Ofl_desc *ofl, Rel_desc *rsp, uchar_t *data, Xword value)
3103 {
3104 	const Rel_entry	*rep;
3105 
3106 	rep = &ld_targ.t_mr.mr_reloc_table[rsp->rel_rtype];
3107 
3108 	switch (rep->re_fsize) {
3109 	case 1:
3110 		/* LINTED */
3111 		*((uchar_t *)data) = (uchar_t)value;
3112 		break;
3113 	case 2:
3114 		{
3115 			Half	v = (Half)value;
3116 			uchar_t	*v_bytes = (uchar_t *)&v;
3117 
3118 			if (OFL_SWAP_RELOC_DATA(ofl, rsp)) {
3119 				UL_ASSIGN_BSWAP_HALF(data, v_bytes);
3120 			} else {
3121 				UL_ASSIGN_HALF(data, v_bytes);
3122 			}
3123 		}
3124 		break;
3125 	case 4:
3126 		{
3127 			Word	v = (Word)value;
3128 			uchar_t	*v_bytes = (uchar_t *)&v;
3129 
3130 			if (OFL_SWAP_RELOC_DATA(ofl, rsp)) {
3131 				UL_ASSIGN_BSWAP_WORD(data, v_bytes);
3132 			} else {
3133 				UL_ASSIGN_WORD(data, v_bytes);
3134 			}
3135 		}
3136 		break;
3137 	default:
3138 		{
3139 			Conv_inv_buf_t inv_buf;
3140 			ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_REL_UNSUPSZ),
3141 			    conv_reloc_type(ld_targ.t_m.m_mach, rsp->rel_rtype,
3142 			    0, &inv_buf), rsp->rel_isdesc->is_file->ifl_name,
3143 			    ld_reloc_sym_name(rsp), (int)rep->re_fsize);
3144 		}
3145 		return (0);
3146 	}
3147 	return (1);
3148 }
3149 
3150 
3151 /*
3152  * Because of the combinations of 32-bit lib providing 64-bit support, and
3153  * visa-versa, the use of krtld's dorelocs can result in differing message
3154  * requirements that make msg.c/msg.h creation and chkmsg "interesting".
3155  * Thus the actual message files contain a couple of entries to satisfy
3156  * each architectures build.  Here we add dummy calls to quieten chkmsg.
3157  *
3158  * chkmsg: MSG_INTL(MSG_REL_NOFIT)
3159  * chkmsg: MSG_INTL(MSG_REL_NONALIGN)
3160  */
3161