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