xref: /titanic_41/usr/src/cmd/sgs/libld/common/sections.c (revision 324cda3f21f9097cdcd624ad530cd65eed5e93ae)
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  * Module sections. Initialize special sections
31  */
32 
33 #define	ELF_TARGET_AMD64
34 
35 #include	<string.h>
36 #include	<strings.h>
37 #include	<stdio.h>
38 #include	<link.h>
39 #include	<debug.h>
40 #include	"msg.h"
41 #include	"_libld.h"
42 
43 inline static void
remove_local(Ofl_desc * ofl,Sym_desc * sdp,int allow_ldynsym)44 remove_local(Ofl_desc *ofl, Sym_desc *sdp, int allow_ldynsym)
45 {
46 	Sym	*sym = sdp->sd_sym;
47 	uchar_t	type = ELF_ST_TYPE(sym->st_info);
48 	/* LINTED - only used for assert() */
49 	int	err;
50 
51 	if ((ofl->ofl_flags & FLG_OF_REDLSYM) == 0) {
52 		ofl->ofl_locscnt--;
53 
54 		err = st_delstring(ofl->ofl_strtab, sdp->sd_name);
55 		assert(err != -1);
56 
57 		if (allow_ldynsym && ldynsym_symtype[type]) {
58 			ofl->ofl_dynlocscnt--;
59 
60 			err = st_delstring(ofl->ofl_dynstrtab, sdp->sd_name);
61 			assert(err != -1);
62 			/* Remove from sort section? */
63 			DYNSORT_COUNT(sdp, sym, type, --);
64 		}
65 	}
66 	sdp->sd_flags |= FLG_SY_ISDISC;
67 }
68 
69 inline static void
remove_scoped(Ofl_desc * ofl,Sym_desc * sdp,int allow_ldynsym)70 remove_scoped(Ofl_desc *ofl, Sym_desc *sdp, int allow_ldynsym)
71 {
72 	Sym	*sym = sdp->sd_sym;
73 	uchar_t	type = ELF_ST_TYPE(sym->st_info);
74 	/* LINTED - only used for assert() */
75 	int	err;
76 
77 	ofl->ofl_scopecnt--;
78 	ofl->ofl_elimcnt++;
79 
80 	err = st_delstring(ofl->ofl_strtab, sdp->sd_name);
81 	assert(err != -1);
82 
83 	if (allow_ldynsym && ldynsym_symtype[type]) {
84 		ofl->ofl_dynscopecnt--;
85 
86 		err = st_delstring(ofl->ofl_dynstrtab, sdp->sd_name);
87 		assert(err != -1);
88 		/* Remove from sort section? */
89 		DYNSORT_COUNT(sdp, sym, type, --);
90 	}
91 	sdp->sd_flags |= FLG_SY_ELIM;
92 }
93 
94 inline static void
ignore_sym(Ofl_desc * ofl,Ifl_desc * ifl,Sym_desc * sdp,int allow_ldynsym)95 ignore_sym(Ofl_desc *ofl, Ifl_desc *ifl, Sym_desc *sdp, int allow_ldynsym)
96 {
97 	Os_desc	*osp;
98 	Is_desc	*isp = sdp->sd_isc;
99 	uchar_t	bind = ELF_ST_BIND(sdp->sd_sym->st_info);
100 
101 	if (bind == STB_LOCAL) {
102 		uchar_t	type = ELF_ST_TYPE(sdp->sd_sym->st_info);
103 
104 		/*
105 		 * Skip section symbols, these were never collected in the
106 		 * first place.
107 		 */
108 		if (type == STT_SECTION)
109 			return;
110 
111 		/*
112 		 * Determine if the whole file is being removed.  Remove any
113 		 * file symbol, and any symbol that is not associated with a
114 		 * section, provided the symbol has not been identified as
115 		 * (update) required.
116 		 */
117 		if (((ifl->ifl_flags & FLG_IF_FILEREF) == 0) &&
118 		    ((type == STT_FILE) || ((isp == NULL) &&
119 		    ((sdp->sd_flags & FLG_SY_UPREQD) == 0)))) {
120 			DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml, sdp));
121 			if (ifl->ifl_flags & FLG_IF_IGNORE)
122 				remove_local(ofl, sdp, allow_ldynsym);
123 			return;
124 		}
125 
126 	} else {
127 		/*
128 		 * Global symbols can only be eliminated when the interfaces of
129 		 * an object have been defined via versioning/scoping.
130 		 */
131 		if (!SYM_IS_HIDDEN(sdp))
132 			return;
133 
134 		/*
135 		 * Remove any unreferenced symbols that are not associated with
136 		 * a section.
137 		 */
138 		if ((isp == NULL) && ((sdp->sd_flags & FLG_SY_UPREQD) == 0)) {
139 			DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml, sdp));
140 			if (ifl->ifl_flags & FLG_IF_IGNORE)
141 				remove_scoped(ofl, sdp, allow_ldynsym);
142 			return;
143 		}
144 	}
145 
146 	/*
147 	 * Do not discard any symbols that are associated with non-allocable
148 	 * segments.
149 	 */
150 	if (isp && ((isp->is_flags & FLG_IS_SECTREF) == 0) &&
151 	    ((osp = isp->is_osdesc) != 0) &&
152 	    (osp->os_sgdesc->sg_phdr.p_type == PT_LOAD)) {
153 		DBG_CALL(Dbg_syms_discarded(ofl->ofl_lml, sdp));
154 		if (ifl->ifl_flags & FLG_IF_IGNORE) {
155 			if (bind == STB_LOCAL)
156 				remove_local(ofl, sdp, allow_ldynsym);
157 			else
158 				remove_scoped(ofl, sdp, allow_ldynsym);
159 		}
160 	}
161 }
162 
163 static Boolean
isdesc_discarded(Is_desc * isp)164 isdesc_discarded(Is_desc *isp)
165 {
166 	Ifl_desc	*ifl = isp->is_file;
167 	Os_desc		*osp = isp->is_osdesc;
168 	Word		ptype = osp->os_sgdesc->sg_phdr.p_type;
169 
170 	if (isp->is_flags & FLG_IS_DISCARD)
171 		return (TRUE);
172 
173 	/*
174 	 * If the file is discarded, it will take
175 	 * the section with it.
176 	 */
177 	if (ifl &&
178 	    (((ifl->ifl_flags & FLG_IF_FILEREF) == 0) ||
179 	    ((ptype == PT_LOAD) &&
180 	    ((isp->is_flags & FLG_IS_SECTREF) == 0) &&
181 	    (isp->is_shdr->sh_size > 0))) &&
182 	    (ifl->ifl_flags & FLG_IF_IGNORE))
183 		return (TRUE);
184 
185 	return (FALSE);
186 }
187 
188 /*
189  * There are situations where we may count output sections (ofl_shdrcnt)
190  * that are subsequently eliminated from the output object. Whether or
191  * not this happens cannot be known until all input has been seen and
192  * section elimination code has run. However, the situations where this
193  * outcome is possible are known, and are flagged by setting FLG_OF_ADJOSCNT.
194  *
195  * If FLG_OF_ADJOSCNT is set, this routine makes a pass over the output
196  * sections. If an unused output section is encountered, we decrement
197  * ofl->ofl_shdrcnt and remove the section name from the .shstrtab string
198  * table (ofl->ofl_shdrsttab).
199  *
200  * This code must be kept in sync with the similar code
201  * found in outfile.c:ld_create_outfile().
202  */
203 static void
adjust_os_count(Ofl_desc * ofl)204 adjust_os_count(Ofl_desc *ofl)
205 {
206 	Sg_desc		*sgp;
207 	Is_desc		*isp;
208 	Os_desc		*osp;
209 	Aliste		idx1;
210 
211 	if ((ofl->ofl_flags & FLG_OF_ADJOSCNT) == 0)
212 		return;
213 
214 	/*
215 	 * For each output section, look at the input sections to find at least
216 	 * one input section that has not been eliminated. If none are found,
217 	 * the -z ignore processing above has eliminated that output section.
218 	 */
219 	for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
220 		Aliste	idx2;
221 
222 		for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
223 			Aliste	idx3;
224 			int	keep = 0, os_isdescs_idx;
225 
226 			OS_ISDESCS_TRAVERSE(os_isdescs_idx, osp, idx3, isp) {
227 				/*
228 				 * We have found a kept input section,
229 				 * so the output section will be created.
230 				 */
231 				if (!isdesc_discarded(isp)) {
232 					keep = 1;
233 					break;
234 				}
235 			}
236 			/*
237 			 * If no section of this name was kept, decrement
238 			 * the count and remove the name from .shstrtab.
239 			 */
240 			if (keep == 0) {
241 				/* LINTED - only used for assert() */
242 				int err;
243 
244 				ofl->ofl_shdrcnt--;
245 				err = st_delstring(ofl->ofl_shdrsttab,
246 				    osp->os_name);
247 				assert(err != -1);
248 			}
249 		}
250 	}
251 }
252 
253 /*
254  * If -zignore has been in effect, scan all input files to determine if the
255  * file, or sections from the file, have been referenced.  If not, the file or
256  * some of the files sections can be discarded. If sections are to be
257  * discarded, rescan the output relocations and the symbol table and remove
258  * the relocations and symbol entries that are no longer required.
259  *
260  * Note:  It's possible that a section which is being discarded has contributed
261  *	  to the GOT table or the PLT table.  However, we can't at this point
262  *	  eliminate the corresponding entries.  This is because there could well
263  *	  be other sections referencing those same entries, but we don't have
264  *	  the infrastructure to determine this.  So, keep the PLT and GOT
265  *	  entries in the table in case someone wants them.
266  * Note:  The section to be affected needs to be allocatable.
267  *	  So even if -zignore is in effect, if the section is not allocatable,
268  *	  we do not eliminate it.
269  */
270 static uintptr_t
ignore_section_processing(Ofl_desc * ofl)271 ignore_section_processing(Ofl_desc *ofl)
272 {
273 	Sg_desc		*sgp;
274 	Is_desc		*isp;
275 	Os_desc		*osp;
276 	Ifl_desc	*ifl;
277 	Rel_cachebuf	*rcbp;
278 	Rel_desc	*rsp;
279 	int		allow_ldynsym = OFL_ALLOW_LDYNSYM(ofl);
280 	Aliste		idx1;
281 
282 	for (APLIST_TRAVERSE(ofl->ofl_objs, idx1, ifl)) {
283 		uint_t	num, discard;
284 
285 		/*
286 		 * Diagnose (-D unused) a completely unreferenced file.
287 		 */
288 		if ((ifl->ifl_flags & FLG_IF_FILEREF) == 0)
289 			DBG_CALL(Dbg_unused_file(ofl->ofl_lml,
290 			    ifl->ifl_name, 0, 0));
291 		if (((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0) ||
292 		    ((ifl->ifl_flags & FLG_IF_IGNORE) == 0))
293 			continue;
294 
295 		/*
296 		 * Before scanning the whole symbol table to determine if
297 		 * symbols should be discard - quickly (relatively) scan the
298 		 * sections to determine if any are to be discarded.
299 		 */
300 		discard = 0;
301 		if (ifl->ifl_flags & FLG_IF_FILEREF) {
302 			for (num = 1; num < ifl->ifl_shnum; num++) {
303 				if (((isp = ifl->ifl_isdesc[num]) != NULL) &&
304 				    ((isp->is_flags & FLG_IS_SECTREF) == 0) &&
305 				    ((osp = isp->is_osdesc) != NULL) &&
306 				    ((sgp = osp->os_sgdesc) != NULL) &&
307 				    (sgp->sg_phdr.p_type == PT_LOAD)) {
308 					discard++;
309 					break;
310 				}
311 			}
312 		}
313 
314 		/*
315 		 * No sections are to be 'ignored'
316 		 */
317 		if ((discard == 0) && (ifl->ifl_flags & FLG_IF_FILEREF))
318 			continue;
319 
320 		/*
321 		 * We know that we have discarded sections.  Scan the symbol
322 		 * table for this file to determine if symbols need to be
323 		 * discarded that are associated with the 'ignored' sections.
324 		 */
325 		for (num = 1; num < ifl->ifl_symscnt; num++) {
326 			Sym_desc	*sdp;
327 
328 			/*
329 			 * If the symbol definition has been resolved to another
330 			 * file, or the symbol has already been discarded or
331 			 * eliminated, skip it.
332 			 */
333 			sdp = ifl->ifl_oldndx[num];
334 			if ((sdp->sd_file != ifl) ||
335 			    (sdp->sd_flags &
336 			    (FLG_SY_ISDISC | FLG_SY_INVALID | FLG_SY_ELIM)))
337 				continue;
338 
339 			/*
340 			 * Complete the investigation of the symbol.
341 			 */
342 			ignore_sym(ofl, ifl, sdp, allow_ldynsym);
343 		}
344 	}
345 
346 	/*
347 	 * If we were only here to solicit debugging diagnostics, we're done.
348 	 */
349 	if ((ofl->ofl_flags1 & FLG_OF1_IGNPRC) == 0)
350 		return (1);
351 
352 	/*
353 	 * Scan all output relocations searching for those against discarded or
354 	 * ignored sections.  If one is found, decrement the total outrel count.
355 	 */
356 	REL_CACHE_TRAVERSE(&ofl->ofl_outrels, idx1, rcbp, rsp) {
357 		Is_desc		*isc = rsp->rel_isdesc;
358 		uint_t		flags, entsize;
359 		Shdr		*shdr;
360 
361 		if ((isc == NULL) || ((isc->is_flags & (FLG_IS_SECTREF))) ||
362 		    ((ifl = isc->is_file) == NULL) ||
363 		    ((ifl->ifl_flags & FLG_IF_IGNORE) == 0) ||
364 		    ((shdr = isc->is_shdr) == NULL) ||
365 		    ((shdr->sh_flags & SHF_ALLOC) == 0))
366 			continue;
367 
368 		flags = rsp->rel_flags;
369 
370 		if (flags & (FLG_REL_GOT | FLG_REL_BSS |
371 		    FLG_REL_NOINFO | FLG_REL_PLT))
372 			continue;
373 
374 		osp = RELAUX_GET_OSDESC(rsp);
375 
376 		if (rsp->rel_flags & FLG_REL_RELA)
377 			entsize = sizeof (Rela);
378 		else
379 			entsize = sizeof (Rel);
380 
381 		assert(osp->os_szoutrels > 0);
382 		osp->os_szoutrels -= entsize;
383 
384 		if (!(flags & FLG_REL_PLT))
385 			ofl->ofl_reloccntsub++;
386 
387 		if (rsp->rel_rtype == ld_targ.t_m.m_r_relative)
388 			ofl->ofl_relocrelcnt--;
389 	}
390 
391 	/*
392 	 * As a result of our work here, the number of output sections may
393 	 * have decreased. Trigger a call to adjust_os_count().
394 	 */
395 	ofl->ofl_flags |= FLG_OF_ADJOSCNT;
396 
397 	return (1);
398 }
399 
400 /*
401  * Allocate Elf_Data, Shdr, and Is_desc structures for a new
402  * section.
403  *
404  * entry:
405  *	ofl - Output file descriptor
406  *	shtype - SHT_ type code for section.
407  *	shname - String giving the name for the new section.
408  *	entcnt - # of items contained in the data part of the new section.
409  *		This value is multiplied against the known element size
410  *		for the section type to determine the size of the data
411  *		area for the section. It is only meaningful in cases where
412  *		the section type has a non-zero element size. In other cases,
413  *		the caller must set the size fields in the *ret_data and
414  *		*ret_shdr structs manually.
415  *	ret_isec, ret_shdr, ret_data - Address of pointers to
416  *		receive address of newly allocated structs.
417  *
418  * exit:
419  *	On error, returns S_ERROR. On success, returns (1), and the
420  *	ret_ pointers have been updated to point at the new structures,
421  *	which have been filled in. To finish the task, the caller must
422  *	update any fields within the supplied descriptors that differ
423  *	from its needs, and then call ld_place_section().
424  */
425 static uintptr_t
new_section(Ofl_desc * ofl,Word shtype,const char * shname,Xword entcnt,Is_desc ** ret_isec,Shdr ** ret_shdr,Elf_Data ** ret_data)426 new_section(Ofl_desc *ofl, Word shtype, const char *shname, Xword entcnt,
427 	Is_desc **ret_isec, Shdr **ret_shdr, Elf_Data **ret_data)
428 {
429 	typedef struct sec_info {
430 		Word d_type;
431 		Word align;	/* Used in both data and section header */
432 		Word sh_flags;
433 		Word sh_entsize;
434 	} SEC_INFO_T;
435 
436 	const SEC_INFO_T	*sec_info;
437 
438 	Shdr		*shdr;
439 	Elf_Data	*data;
440 	Is_desc		*isec;
441 	size_t		size;
442 
443 	/*
444 	 * For each type of section, we have a distinct set of
445 	 * SEC_INFO_T values. This macro defines a static structure
446 	 * containing those values and generates code to set the sec_info
447 	 * pointer to refer to it. The pointer in sec_info remains valid
448 	 * outside of the declaration scope because the info_s struct is static.
449 	 *
450 	 * We can't determine the value of M_WORD_ALIGN at compile time, so
451 	 * a different variant is used for those cases.
452 	 */
453 #define	SET_SEC_INFO(d_type, d_align, sh_flags, sh_entsize) \
454 	{ \
455 		static const SEC_INFO_T info_s = { d_type, d_align, sh_flags, \
456 		    sh_entsize}; \
457 		sec_info = &info_s; \
458 	}
459 #define	SET_SEC_INFO_WORD_ALIGN(d_type, sh_flags, sh_entsize) \
460 	{ \
461 		static SEC_INFO_T info_s = { d_type, 0, sh_flags, \
462 		    sh_entsize}; \
463 		info_s.align = ld_targ.t_m.m_word_align; \
464 		sec_info = &info_s; \
465 	}
466 
467 	switch (shtype) {
468 	case SHT_PROGBITS:
469 		/*
470 		 * SHT_PROGBITS sections contain are used for many
471 		 * different sections. Alignments and flags differ.
472 		 * Some have a standard entsize, and others don't.
473 		 * We set some defaults here, but there is no expectation
474 		 * that they are correct or complete for any specific
475 		 * purpose. The caller must provide the correct values.
476 		 */
477 		SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, SHF_ALLOC, 0)
478 		break;
479 
480 	case SHT_SYMTAB:
481 		SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM, 0, sizeof (Sym))
482 		break;
483 
484 	case SHT_DYNSYM:
485 		SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM, SHF_ALLOC, sizeof (Sym))
486 		break;
487 
488 	case SHT_SUNW_LDYNSYM:
489 		ofl->ofl_flags |= FLG_OF_OSABI;
490 		SET_SEC_INFO_WORD_ALIGN(ELF_T_SYM, SHF_ALLOC, sizeof (Sym))
491 		break;
492 
493 	case SHT_STRTAB:
494 		/*
495 		 * A string table may or may not be allocable, depending
496 		 * on context, so we leave that flag unset and leave it to
497 		 * the caller to add it if necessary.
498 		 *
499 		 * String tables do not have a standard entsize, so
500 		 * we set it to 0.
501 		 */
502 		SET_SEC_INFO(ELF_T_BYTE, 1, SHF_STRINGS, 0)
503 		break;
504 
505 	case SHT_RELA:
506 		/*
507 		 * Relocations with an addend (Everything except 32-bit X86).
508 		 * The caller is expected to set all section header flags.
509 		 */
510 		SET_SEC_INFO_WORD_ALIGN(ELF_T_RELA, 0, sizeof (Rela))
511 		break;
512 
513 	case SHT_REL:
514 		/*
515 		 * Relocations without an addend (32-bit X86 only).
516 		 * The caller is expected to set all section header flags.
517 		 */
518 		SET_SEC_INFO_WORD_ALIGN(ELF_T_REL, 0, sizeof (Rel))
519 		break;
520 
521 	case SHT_HASH:
522 		SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, SHF_ALLOC, sizeof (Word))
523 		break;
524 
525 	case SHT_SUNW_symsort:
526 	case SHT_SUNW_tlssort:
527 		ofl->ofl_flags |= FLG_OF_OSABI;
528 		SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, SHF_ALLOC, sizeof (Word))
529 		break;
530 
531 	case SHT_DYNAMIC:
532 		/*
533 		 * A dynamic section may or may not be allocable, and may or
534 		 * may not be writable, depending on context, so we leave the
535 		 * flags unset and leave it to the caller to add them if
536 		 * necessary.
537 		 */
538 		SET_SEC_INFO_WORD_ALIGN(ELF_T_DYN, 0, sizeof (Dyn))
539 		break;
540 
541 	case SHT_NOBITS:
542 		/*
543 		 * SHT_NOBITS is used for BSS-type sections. The size and
544 		 * alignment depend on the specific use and must be adjusted
545 		 * by the caller.
546 		 */
547 		SET_SEC_INFO(ELF_T_BYTE, 0, SHF_ALLOC | SHF_WRITE, 0)
548 		break;
549 
550 	case SHT_INIT_ARRAY:
551 	case SHT_FINI_ARRAY:
552 	case SHT_PREINIT_ARRAY:
553 		SET_SEC_INFO(ELF_T_ADDR, sizeof (Addr), SHF_ALLOC | SHF_WRITE,
554 		    sizeof (Addr))
555 		break;
556 
557 	case SHT_SYMTAB_SHNDX:
558 		/*
559 		 * Note that these sections are created to be associated
560 		 * with both symtab and dynsym symbol tables. However, they
561 		 * are non-allocable in all cases, because the runtime
562 		 * linker has no need for this information. It is purely
563 		 * informational, used by elfdump(1), debuggers, etc.
564 		 */
565 		SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, 0, sizeof (Word));
566 		break;
567 
568 	case SHT_SUNW_cap:
569 		ofl->ofl_flags |= FLG_OF_OSABI;
570 		SET_SEC_INFO_WORD_ALIGN(ELF_T_CAP, SHF_ALLOC, sizeof (Cap));
571 		break;
572 
573 	case SHT_SUNW_capchain:
574 		ofl->ofl_flags |= FLG_OF_OSABI;
575 		SET_SEC_INFO_WORD_ALIGN(ELF_T_WORD, SHF_ALLOC,
576 		    sizeof (Capchain));
577 		break;
578 
579 	case SHT_SUNW_capinfo:
580 		ofl->ofl_flags |= FLG_OF_OSABI;
581 #if	_ELF64
582 		SET_SEC_INFO(ELF_T_XWORD, sizeof (Xword), SHF_ALLOC,
583 		    sizeof (Capinfo));
584 #else
585 		SET_SEC_INFO(ELF_T_WORD, sizeof (Word), SHF_ALLOC,
586 		    sizeof (Capinfo));
587 #endif
588 		break;
589 
590 	case SHT_SUNW_move:
591 		ofl->ofl_flags |= FLG_OF_OSABI;
592 		SET_SEC_INFO(ELF_T_BYTE, sizeof (Lword),
593 		    SHF_ALLOC | SHF_WRITE, sizeof (Move));
594 		break;
595 
596 	case SHT_SUNW_syminfo:
597 		ofl->ofl_flags |= FLG_OF_OSABI;
598 		/*
599 		 * The sh_info field of the SHT_*_syminfo section points
600 		 * to the header index of the associated .dynamic section,
601 		 * so we also set SHF_INFO_LINK.
602 		 */
603 		SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE,
604 		    SHF_ALLOC | SHF_INFO_LINK, sizeof (Syminfo));
605 		break;
606 
607 	case SHT_SUNW_verneed:
608 	case SHT_SUNW_verdef:
609 		ofl->ofl_flags |= FLG_OF_OSABI;
610 		/*
611 		 * The info for verneed and versym happen to be the same.
612 		 * The entries in these sections are not of uniform size,
613 		 * so we set the entsize to 0.
614 		 */
615 		SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, SHF_ALLOC, 0);
616 		break;
617 
618 	case SHT_SUNW_versym:
619 		ofl->ofl_flags |= FLG_OF_OSABI;
620 		SET_SEC_INFO_WORD_ALIGN(ELF_T_BYTE, SHF_ALLOC,
621 		    sizeof (Versym));
622 		break;
623 
624 	default:
625 		/* Should not happen: fcn called with unknown section type */
626 		assert(0);
627 		return (S_ERROR);
628 	}
629 #undef	SET_SEC_INFO
630 #undef	SET_SEC_INFO_WORD_ALIGN
631 
632 	size = entcnt * sec_info->sh_entsize;
633 
634 	/*
635 	 * Allocate and initialize the Elf_Data structure.
636 	 */
637 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == NULL)
638 		return (S_ERROR);
639 	data->d_type = sec_info->d_type;
640 	data->d_size = size;
641 	data->d_align = sec_info->align;
642 	data->d_version = ofl->ofl_dehdr->e_version;
643 
644 	/*
645 	 * Allocate and initialize the Shdr structure.
646 	 */
647 	if ((shdr = libld_calloc(sizeof (Shdr), 1)) == NULL)
648 		return (S_ERROR);
649 	shdr->sh_type = shtype;
650 	shdr->sh_size = size;
651 	shdr->sh_flags = sec_info->sh_flags;
652 	shdr->sh_addralign = sec_info->align;
653 	shdr->sh_entsize = sec_info->sh_entsize;
654 
655 	/*
656 	 * Allocate and initialize the Is_desc structure.
657 	 */
658 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == NULL)
659 		return (S_ERROR);
660 	isec->is_name = shname;
661 	isec->is_shdr = shdr;
662 	isec->is_indata = data;
663 
664 
665 	*ret_isec = isec;
666 	*ret_shdr = shdr;
667 	*ret_data = data;
668 	return (1);
669 }
670 
671 /*
672  * Use an existing input section as a template to create a new
673  * input section with the same values as the original, other than
674  * the size of the data area which is supplied by the caller.
675  *
676  * entry:
677  *	ofl - Output file descriptor
678  *	ifl - Input file section to use as a template
679  *	size - Size of data area for new section
680  *	ret_isec, ret_shdr, ret_data - Address of pointers to
681  *		receive address of newly allocated structs.
682  *
683  * exit:
684  *	On error, returns S_ERROR. On success, returns (1), and the
685  *	ret_ pointers have been updated to point at the new structures,
686  *	which have been filled in. To finish the task, the caller must
687  *	update any fields within the supplied descriptors that differ
688  *	from its needs, and then call ld_place_section().
689  */
690 static uintptr_t
new_section_from_template(Ofl_desc * ofl,Is_desc * tmpl_isp,size_t size,Is_desc ** ret_isec,Shdr ** ret_shdr,Elf_Data ** ret_data)691 new_section_from_template(Ofl_desc *ofl, Is_desc *tmpl_isp, size_t size,
692 	Is_desc **ret_isec, Shdr **ret_shdr, Elf_Data **ret_data)
693 {
694 	Shdr		*shdr;
695 	Elf_Data	*data;
696 	Is_desc		*isec;
697 
698 	/*
699 	 * Allocate and initialize the Elf_Data structure.
700 	 */
701 	if ((data = libld_calloc(sizeof (Elf_Data), 1)) == NULL)
702 		return (S_ERROR);
703 	data->d_type = tmpl_isp->is_indata->d_type;
704 	data->d_size = size;
705 	data->d_align = tmpl_isp->is_shdr->sh_addralign;
706 	data->d_version = ofl->ofl_dehdr->e_version;
707 
708 	/*
709 	 * Allocate and initialize the Shdr structure.
710 	 */
711 	if ((shdr = libld_malloc(sizeof (Shdr))) == NULL)
712 		return (S_ERROR);
713 	*shdr = *tmpl_isp->is_shdr;
714 	shdr->sh_addr = 0;
715 	shdr->sh_offset = 0;
716 	shdr->sh_size = size;
717 
718 	/*
719 	 * Allocate and initialize the Is_desc structure.
720 	 */
721 	if ((isec = libld_calloc(1, sizeof (Is_desc))) == NULL)
722 		return (S_ERROR);
723 	isec->is_name = tmpl_isp->is_name;
724 	isec->is_shdr = shdr;
725 	isec->is_indata = data;
726 
727 
728 	*ret_isec = isec;
729 	*ret_shdr = shdr;
730 	*ret_data = data;
731 	return (1);
732 }
733 
734 /*
735  * Build a .bss section for allocation of tentative definitions.  Any `static'
736  * .bss definitions would have been associated to their own .bss sections and
737  * thus collected from the input files.  `global' .bss definitions are tagged
738  * as COMMON and do not cause any associated .bss section elements to be
739  * generated.  Here we add up all these COMMON symbols and generate the .bss
740  * section required to represent them.
741  */
742 uintptr_t
ld_make_bss(Ofl_desc * ofl,Xword size,Xword align,uint_t ident)743 ld_make_bss(Ofl_desc *ofl, Xword size, Xword align, uint_t ident)
744 {
745 	Shdr		*shdr;
746 	Elf_Data	*data;
747 	Is_desc		*isec;
748 	Os_desc		*osp;
749 	Xword		rsize = (Xword)ofl->ofl_relocbsssz;
750 
751 	/*
752 	 * Allocate header structs. We will set the name ourselves below,
753 	 * and there is no entcnt for a BSS. So, the shname and entcnt
754 	 * arguments are 0.
755 	 */
756 	if (new_section(ofl, SHT_NOBITS, NULL, 0,
757 	    &isec, &shdr, &data) == S_ERROR)
758 		return (S_ERROR);
759 
760 	data->d_size = (size_t)size;
761 	data->d_align = (size_t)align;
762 
763 	shdr->sh_size = size;
764 	shdr->sh_addralign = align;
765 
766 	if (ident == ld_targ.t_id.id_tlsbss) {
767 		isec->is_name = MSG_ORIG(MSG_SCN_TBSS);
768 		ofl->ofl_istlsbss = isec;
769 		shdr->sh_flags |= SHF_TLS;
770 
771 	} else if (ident == ld_targ.t_id.id_bss) {
772 		isec->is_name = MSG_ORIG(MSG_SCN_BSS);
773 		ofl->ofl_isbss = isec;
774 
775 #if	defined(_ELF64)
776 	} else if ((ld_targ.t_m.m_mach == EM_AMD64) &&
777 	    (ident == ld_targ.t_id.id_lbss)) {
778 		isec->is_name = MSG_ORIG(MSG_SCN_LBSS);
779 		ofl->ofl_islbss = isec;
780 		shdr->sh_flags |= SHF_AMD64_LARGE;
781 #endif
782 	}
783 
784 	/*
785 	 * Retain this .*bss input section as this will be where global symbol
786 	 * references are added.
787 	 */
788 	if ((osp = ld_place_section(ofl, isec, NULL, ident, NULL)) ==
789 	    (Os_desc *)S_ERROR)
790 		return (S_ERROR);
791 
792 	/*
793 	 * If relocations exist against a .*bss section, a section symbol must
794 	 * be created for the section in the .dynsym symbol table.
795 	 */
796 	if (!(osp->os_flags & FLG_OS_OUTREL)) {
797 		ofl_flag_t	flagtotest;
798 
799 		if (ident == ld_targ.t_id.id_tlsbss)
800 			flagtotest = FLG_OF1_TLSOREL;
801 		else
802 			flagtotest = FLG_OF1_BSSOREL;
803 
804 		if (ofl->ofl_flags1 & flagtotest) {
805 			ofl->ofl_dynshdrcnt++;
806 			osp->os_flags |= FLG_OS_OUTREL;
807 		}
808 	}
809 
810 	osp->os_szoutrels = rsize;
811 	return (1);
812 }
813 
814 /*
815  * Build a SHT_{INIT|FINI|PREINIT}ARRAY section (specified via
816  * ld -z *array=name).
817  */
818 static uintptr_t
make_array(Ofl_desc * ofl,Word shtype,const char * sectname,APlist * alp)819 make_array(Ofl_desc *ofl, Word shtype, const char *sectname, APlist *alp)
820 {
821 	uint_t		entcount;
822 	Aliste		idx;
823 	Elf_Data	*data;
824 	Is_desc		*isec;
825 	Shdr		*shdr;
826 	Sym_desc	*sdp;
827 	Rel_desc	reld;
828 	Rela		reloc;
829 	Os_desc		*osp;
830 	uintptr_t	ret = 1;
831 
832 	if (alp == NULL)
833 		return (1);
834 
835 	entcount = 0;
836 	for (APLIST_TRAVERSE(alp, idx, sdp))
837 		entcount++;
838 
839 	if (new_section(ofl, shtype, sectname, entcount, &isec, &shdr, &data) ==
840 	    S_ERROR)
841 		return (S_ERROR);
842 
843 	if ((data->d_buf = libld_calloc(sizeof (Addr), entcount)) == NULL)
844 		return (S_ERROR);
845 
846 	if (ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_array, NULL) ==
847 	    (Os_desc *)S_ERROR)
848 		return (S_ERROR);
849 
850 	osp = isec->is_osdesc;
851 
852 	if ((ofl->ofl_osinitarray == NULL) && (shtype == SHT_INIT_ARRAY))
853 		ofl->ofl_osinitarray = osp;
854 	if ((ofl->ofl_ospreinitarray == NULL) && (shtype == SHT_PREINIT_ARRAY))
855 		ofl->ofl_ospreinitarray = osp;
856 	else if ((ofl->ofl_osfiniarray == NULL) && (shtype == SHT_FINI_ARRAY))
857 		ofl->ofl_osfiniarray = osp;
858 
859 	/*
860 	 * Create relocations against this section to initialize it to the
861 	 * function addresses.
862 	 */
863 	reld.rel_isdesc = isec;
864 	reld.rel_aux = NULL;
865 	reld.rel_flags = FLG_REL_LOAD;
866 
867 	/*
868 	 * Fabricate the relocation information (as if a relocation record had
869 	 * been input - see init_rel()).
870 	 */
871 	reld.rel_rtype = ld_targ.t_m.m_r_arrayaddr;
872 	reld.rel_roffset = 0;
873 	reld.rel_raddend = 0;
874 
875 	/*
876 	 * Create a minimal relocation record to satisfy process_sym_reloc()
877 	 * debugging requirements.
878 	 */
879 	reloc.r_offset = 0;
880 	reloc.r_info = ELF_R_INFO(0, ld_targ.t_m.m_r_arrayaddr);
881 	reloc.r_addend = 0;
882 
883 	DBG_CALL(Dbg_reloc_generate(ofl->ofl_lml, osp,
884 	    ld_targ.t_m.m_rel_sht_type));
885 	for (APLIST_TRAVERSE(alp, idx, sdp)) {
886 		reld.rel_sym = sdp;
887 
888 		if (ld_process_sym_reloc(ofl, &reld, (Rel *)&reloc, isec,
889 		    MSG_INTL(MSG_STR_COMMAND), 0) == S_ERROR) {
890 			ret = S_ERROR;
891 			continue;
892 		}
893 
894 		reld.rel_roffset += (Xword)sizeof (Addr);
895 		reloc.r_offset = reld.rel_roffset;
896 	}
897 
898 	return (ret);
899 }
900 
901 /*
902  * Build a comment section (-Qy option).
903  */
904 static uintptr_t
make_comment(Ofl_desc * ofl)905 make_comment(Ofl_desc *ofl)
906 {
907 	Shdr		*shdr;
908 	Elf_Data	*data;
909 	Is_desc		*isec;
910 
911 	if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_COMMENT), 0,
912 	    &isec, &shdr, &data) == S_ERROR)
913 		return (S_ERROR);
914 
915 	data->d_buf = (void *)ofl->ofl_sgsid;
916 	data->d_size = strlen(ofl->ofl_sgsid) + 1;
917 	data->d_align = 1;
918 
919 	shdr->sh_size = (Xword)data->d_size;
920 	shdr->sh_flags = 0;
921 	shdr->sh_addralign = 1;
922 
923 	return ((uintptr_t)ld_place_section(ofl, isec, NULL,
924 	    ld_targ.t_id.id_note, NULL));
925 }
926 
927 /*
928  * Make the dynamic section.  Calculate the size of any strings referenced
929  * within this structure, they will be added to the global string table
930  * (.dynstr).  This routine should be called before make_dynstr().
931  *
932  * This routine must be maintained in parallel with update_odynamic()
933  * in update.c
934  */
935 static uintptr_t
make_dynamic(Ofl_desc * ofl)936 make_dynamic(Ofl_desc *ofl)
937 {
938 	Shdr		*shdr;
939 	Os_desc		*osp;
940 	Elf_Data	*data;
941 	Is_desc		*isec;
942 	size_t		cnt = 0;
943 	Aliste		idx;
944 	Ifl_desc	*ifl;
945 	Sym_desc	*sdp;
946 	size_t		size;
947 	Str_tbl		*strtbl;
948 	ofl_flag_t	flags = ofl->ofl_flags;
949 	int		not_relobj = !(flags & FLG_OF_RELOBJ);
950 	int		unused = 0;
951 
952 	/*
953 	 * Select the required string table.
954 	 */
955 	if (OFL_IS_STATIC_OBJ(ofl))
956 		strtbl = ofl->ofl_strtab;
957 	else
958 		strtbl = ofl->ofl_dynstrtab;
959 
960 	/*
961 	 * Only a limited subset of DT_ entries apply to relocatable
962 	 * objects. See the comment at the head of update_odynamic() in
963 	 * update.c for details.
964 	 */
965 	if (new_section(ofl, SHT_DYNAMIC, MSG_ORIG(MSG_SCN_DYNAMIC), 0,
966 	    &isec, &shdr, &data) == S_ERROR)
967 		return (S_ERROR);
968 
969 	/*
970 	 * new_section() does not set SHF_ALLOC.  If we're building anything
971 	 * besides a relocatable object, then the .dynamic section should
972 	 * reside in allocatable memory.
973 	 */
974 	if (not_relobj)
975 		shdr->sh_flags |= SHF_ALLOC;
976 
977 	/*
978 	 * new_section() does not set SHF_WRITE.  If we're building an object
979 	 * that specifies an interpretor, then a DT_DEBUG entry is created,
980 	 * which is initialized to the applications link-map list at runtime.
981 	 */
982 	if (ofl->ofl_osinterp)
983 		shdr->sh_flags |= SHF_WRITE;
984 
985 	osp = ofl->ofl_osdynamic =
986 	    ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_dynamic, NULL);
987 
988 	/*
989 	 * Reserve entries for any needed dependencies.
990 	 */
991 	for (APLIST_TRAVERSE(ofl->ofl_sos, idx, ifl)) {
992 		if (!(ifl->ifl_flags & (FLG_IF_NEEDED | FLG_IF_NEEDSTR)))
993 			continue;
994 
995 		/*
996 		 * If this dependency didn't satisfy any symbol references,
997 		 * generate a debugging diagnostic (ld(1) -Dunused can be used
998 		 * to display these).  If this is a standard needed dependency,
999 		 * and -z ignore is in effect, drop the dependency.  Explicitly
1000 		 * defined dependencies (i.e., -N dep) don't get dropped, and
1001 		 * are flagged as being required to simplify update_odynamic()
1002 		 * processing.
1003 		 */
1004 		if ((ifl->ifl_flags & FLG_IF_NEEDSTR) ||
1005 		    ((ifl->ifl_flags & FLG_IF_DEPREQD) == 0)) {
1006 			if (unused++ == 0)
1007 				DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD));
1008 			DBG_CALL(Dbg_unused_file(ofl->ofl_lml, ifl->ifl_soname,
1009 			    (ifl->ifl_flags & FLG_IF_NEEDSTR), 0));
1010 
1011 			/*
1012 			 * Guidance: Remove unused dependency.
1013 			 *
1014 			 * If -z ignore is in effect, this warning is not
1015 			 * needed because we will quietly remove the unused
1016 			 * dependency.
1017 			 */
1018 			if (OFL_GUIDANCE(ofl, FLG_OFG_NO_UNUSED) &&
1019 			    ((ifl->ifl_flags & FLG_IF_IGNORE) == 0))
1020 				ld_eprintf(ofl, ERR_GUIDANCE,
1021 				    MSG_INTL(MSG_GUIDE_UNUSED),
1022 				    ifl->ifl_soname);
1023 
1024 			if (ifl->ifl_flags & FLG_IF_NEEDSTR)
1025 				ifl->ifl_flags |= FLG_IF_DEPREQD;
1026 			else if (ifl->ifl_flags & FLG_IF_IGNORE)
1027 				continue;
1028 		}
1029 
1030 		/*
1031 		 * If this object requires a DT_POSFLAG_1 entry, reserve it.
1032 		 */
1033 		if ((ifl->ifl_flags & MSK_IF_POSFLAG1) && not_relobj)
1034 			cnt++;
1035 
1036 		if (st_insert(strtbl, ifl->ifl_soname) == -1)
1037 			return (S_ERROR);
1038 		cnt++;
1039 
1040 		/*
1041 		 * If the needed entry contains the $ORIGIN token make sure
1042 		 * the associated DT_1_FLAGS entry is created.
1043 		 */
1044 		if (strstr(ifl->ifl_soname, MSG_ORIG(MSG_STR_ORIGIN))) {
1045 			ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
1046 			ofl->ofl_dtflags |= DF_ORIGIN;
1047 		}
1048 	}
1049 
1050 	if (unused)
1051 		DBG_CALL(Dbg_util_nl(ofl->ofl_lml, DBG_NL_STD));
1052 
1053 	if (not_relobj) {
1054 		/*
1055 		 * Reserve entries for any per-symbol auxiliary/filter strings.
1056 		 */
1057 		cnt += alist_nitems(ofl->ofl_dtsfltrs);
1058 
1059 		/*
1060 		 * Reserve entries for _init() and _fini() section addresses.
1061 		 */
1062 		if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_INIT_U),
1063 		    SYM_NOHASH, NULL, ofl)) != NULL) &&
1064 		    (sdp->sd_ref == REF_REL_NEED) &&
1065 		    (sdp->sd_sym->st_shndx != SHN_UNDEF)) {
1066 			sdp->sd_flags |= FLG_SY_UPREQD;
1067 			cnt++;
1068 		}
1069 		if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_FINI_U),
1070 		    SYM_NOHASH, NULL, ofl)) != NULL) &&
1071 		    (sdp->sd_ref == REF_REL_NEED) &&
1072 		    (sdp->sd_sym->st_shndx != SHN_UNDEF)) {
1073 			sdp->sd_flags |= FLG_SY_UPREQD;
1074 			cnt++;
1075 		}
1076 
1077 		/*
1078 		 * Reserve entries for any soname, filter name (shared libs
1079 		 * only), run-path pointers, cache names and audit requirements.
1080 		 */
1081 		if (ofl->ofl_soname) {
1082 			cnt++;
1083 			if (st_insert(strtbl, ofl->ofl_soname) == -1)
1084 				return (S_ERROR);
1085 		}
1086 		if (ofl->ofl_filtees) {
1087 			cnt++;
1088 			if (st_insert(strtbl, ofl->ofl_filtees) == -1)
1089 				return (S_ERROR);
1090 
1091 			/*
1092 			 * If the filtees entry contains the $ORIGIN token
1093 			 * make sure the associated DT_1_FLAGS entry is created.
1094 			 */
1095 			if (strstr(ofl->ofl_filtees,
1096 			    MSG_ORIG(MSG_STR_ORIGIN))) {
1097 				ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
1098 				ofl->ofl_dtflags |= DF_ORIGIN;
1099 			}
1100 		}
1101 	}
1102 
1103 	if (ofl->ofl_rpath) {
1104 		cnt += 2;	/* DT_RPATH & DT_RUNPATH */
1105 		if (st_insert(strtbl, ofl->ofl_rpath) == -1)
1106 			return (S_ERROR);
1107 
1108 		/*
1109 		 * If the rpath entry contains the $ORIGIN token make sure
1110 		 * the associated DT_1_FLAGS entry is created.
1111 		 */
1112 		if (strstr(ofl->ofl_rpath, MSG_ORIG(MSG_STR_ORIGIN))) {
1113 			ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
1114 			ofl->ofl_dtflags |= DF_ORIGIN;
1115 		}
1116 	}
1117 
1118 	if (not_relobj) {
1119 		Aliste	idx;
1120 		Sg_desc	*sgp;
1121 
1122 		if (ofl->ofl_config) {
1123 			cnt++;
1124 			if (st_insert(strtbl, ofl->ofl_config) == -1)
1125 				return (S_ERROR);
1126 
1127 			/*
1128 			 * If the config entry contains the $ORIGIN token
1129 			 * make sure the associated DT_1_FLAGS entry is created.
1130 			 */
1131 			if (strstr(ofl->ofl_config, MSG_ORIG(MSG_STR_ORIGIN))) {
1132 				ofl->ofl_dtflags_1 |= DF_1_ORIGIN;
1133 				ofl->ofl_dtflags |= DF_ORIGIN;
1134 			}
1135 		}
1136 		if (ofl->ofl_depaudit) {
1137 			cnt++;
1138 			if (st_insert(strtbl, ofl->ofl_depaudit) == -1)
1139 				return (S_ERROR);
1140 		}
1141 		if (ofl->ofl_audit) {
1142 			cnt++;
1143 			if (st_insert(strtbl, ofl->ofl_audit) == -1)
1144 				return (S_ERROR);
1145 		}
1146 
1147 		/*
1148 		 * Reserve entries for the DT_HASH, DT_STRTAB, DT_STRSZ,
1149 		 * DT_SYMTAB, DT_SYMENT, and DT_CHECKSUM.
1150 		 */
1151 		cnt += 6;
1152 
1153 		/*
1154 		 * If we are including local functions at the head of
1155 		 * the dynsym, then also reserve entries for DT_SUNW_SYMTAB
1156 		 * and DT_SUNW_SYMSZ.
1157 		 */
1158 		if (OFL_ALLOW_LDYNSYM(ofl))
1159 			cnt += 2;
1160 
1161 		if ((ofl->ofl_dynsymsortcnt > 0) ||
1162 		    (ofl->ofl_dyntlssortcnt > 0))
1163 			cnt++;		/* DT_SUNW_SORTENT */
1164 
1165 		if (ofl->ofl_dynsymsortcnt > 0)
1166 			cnt += 2;	/* DT_SUNW_[SYMSORT|SYMSORTSZ] */
1167 
1168 		if (ofl->ofl_dyntlssortcnt > 0)
1169 			cnt += 2;	/* DT_SUNW_[TLSSORT|TLSSORTSZ] */
1170 
1171 		if ((flags & (FLG_OF_VERDEF | FLG_OF_NOVERSEC)) ==
1172 		    FLG_OF_VERDEF)
1173 			cnt += 2;		/* DT_VERDEF & DT_VERDEFNUM */
1174 
1175 		if ((flags & (FLG_OF_VERNEED | FLG_OF_NOVERSEC)) ==
1176 		    FLG_OF_VERNEED)
1177 			cnt += 2;		/* DT_VERNEED & DT_VERNEEDNUM */
1178 
1179 		if ((flags & FLG_OF_COMREL) && ofl->ofl_relocrelcnt)
1180 			cnt++;			/* DT_RELACOUNT */
1181 
1182 		if (flags & FLG_OF_TEXTREL)	/* DT_TEXTREL */
1183 			cnt++;
1184 
1185 		if (ofl->ofl_osfiniarray)	/* DT_FINI_ARRAY */
1186 			cnt += 2;		/*    DT_FINI_ARRAYSZ */
1187 
1188 		if (ofl->ofl_osinitarray)	/* DT_INIT_ARRAY */
1189 			cnt += 2;		/*    DT_INIT_ARRAYSZ */
1190 
1191 		if (ofl->ofl_ospreinitarray)	/* DT_PREINIT_ARRAY & */
1192 			cnt += 2;		/*    DT_PREINIT_ARRAYSZ */
1193 
1194 		/*
1195 		 * If we have plt's reserve a DT_PLTRELSZ, DT_PLTREL and
1196 		 * DT_JMPREL.
1197 		 */
1198 		if (ofl->ofl_pltcnt)
1199 			cnt += 3;
1200 
1201 		/*
1202 		 * If plt padding is needed (Sparcv9).
1203 		 */
1204 		if (ofl->ofl_pltpad)
1205 			cnt += 2;		/* DT_PLTPAD & DT_PLTPADSZ */
1206 
1207 		/*
1208 		 * If we have any relocations reserve a DT_REL, DT_RELSZ and
1209 		 * DT_RELENT entry.
1210 		 */
1211 		if (ofl->ofl_relocsz)
1212 			cnt += 3;
1213 
1214 		/*
1215 		 * If a syminfo section is required create DT_SYMINFO,
1216 		 * DT_SYMINSZ, and DT_SYMINENT entries.
1217 		 */
1218 		if (flags & FLG_OF_SYMINFO)
1219 			cnt += 3;
1220 
1221 		/*
1222 		 * If there are any partially initialized sections allocate
1223 		 * DT_MOVETAB, DT_MOVESZ and DT_MOVEENT.
1224 		 */
1225 		if (ofl->ofl_osmove)
1226 			cnt += 3;
1227 
1228 		/*
1229 		 * Allocate one DT_REGISTER entry for every register symbol.
1230 		 */
1231 		cnt += ofl->ofl_regsymcnt;
1232 
1233 		/*
1234 		 * Reserve a entry for each '-zrtldinfo=...' specified
1235 		 * on the command line.
1236 		 */
1237 		for (APLIST_TRAVERSE(ofl->ofl_rtldinfo, idx, sdp))
1238 			cnt++;
1239 
1240 		/*
1241 		 * The following entry should only be placed in a segment that
1242 		 * is writable.
1243 		 */
1244 		if (((sgp = osp->os_sgdesc) != NULL) &&
1245 		    (sgp->sg_phdr.p_flags & PF_W) && ofl->ofl_osinterp)
1246 			cnt++;		/* DT_DEBUG */
1247 
1248 		/*
1249 		 * Capabilities require a .dynamic entry for the .SUNW_cap
1250 		 * section.
1251 		 */
1252 		if (ofl->ofl_oscap)
1253 			cnt++;			/* DT_SUNW_CAP */
1254 
1255 		/*
1256 		 * Symbol capabilities require a .dynamic entry for the
1257 		 * .SUNW_capinfo section.
1258 		 */
1259 		if (ofl->ofl_oscapinfo)
1260 			cnt++;			/* DT_SUNW_CAPINFO */
1261 
1262 		/*
1263 		 * Capabilities chain information requires a .SUNW_capchain
1264 		 * entry (DT_SUNW_CAPCHAIN), entry size (DT_SUNW_CAPCHAINENT),
1265 		 * and total size (DT_SUNW_CAPCHAINSZ).
1266 		 */
1267 		if (ofl->ofl_oscapchain)
1268 			cnt += 3;
1269 
1270 		if (flags & FLG_OF_SYMBOLIC)
1271 			cnt++;			/* DT_SYMBOLIC */
1272 	}
1273 
1274 	/*
1275 	 * Account for Architecture dependent .dynamic entries, and defaults.
1276 	 */
1277 	(*ld_targ.t_mr.mr_mach_make_dynamic)(ofl, &cnt);
1278 
1279 	/*
1280 	 * DT_FLAGS, DT_FLAGS_1, DT_SUNW_STRPAD, and DT_NULL. Also,
1281 	 * allow room for the unused extra DT_NULLs. These are included
1282 	 * to allow an ELF editor room to add items later.
1283 	 */
1284 	cnt += 4 + DYNAMIC_EXTRA_ELTS;
1285 
1286 	/*
1287 	 * DT_SUNW_LDMACH. Used to hold the ELF machine code of the
1288 	 * linker that produced the output object. This information
1289 	 * allows us to determine whether a given object was linked
1290 	 * natively, or by a linker running on a different type of
1291 	 * system. This information can be valuable if one suspects
1292 	 * that a problem might be due to alignment or byte order issues.
1293 	 */
1294 	cnt++;
1295 
1296 	/*
1297 	 * Determine the size of the section from the number of entries.
1298 	 */
1299 	size = cnt * (size_t)shdr->sh_entsize;
1300 
1301 	shdr->sh_size = (Xword)size;
1302 	data->d_size = size;
1303 
1304 	/*
1305 	 * There are several tags that are specific to the Solaris osabi
1306 	 * range which we unconditionally put into any dynamic section
1307 	 * we create (e.g. DT_SUNW_STRPAD or DT_SUNW_LDMACH). As such,
1308 	 * any Solaris object with a dynamic section should be tagged as
1309 	 * ELFOSABI_SOLARIS.
1310 	 */
1311 	ofl->ofl_flags |= FLG_OF_OSABI;
1312 
1313 	return ((uintptr_t)ofl->ofl_osdynamic);
1314 }
1315 
1316 /*
1317  * Build the GOT section and its associated relocation entries.
1318  */
1319 uintptr_t
ld_make_got(Ofl_desc * ofl)1320 ld_make_got(Ofl_desc *ofl)
1321 {
1322 	Elf_Data	*data;
1323 	Shdr	*shdr;
1324 	Is_desc	*isec;
1325 	size_t	size = (size_t)ofl->ofl_gotcnt * ld_targ.t_m.m_got_entsize;
1326 	size_t	rsize = (size_t)ofl->ofl_relocgotsz;
1327 
1328 	if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_GOT), 0,
1329 	    &isec, &shdr, &data) == S_ERROR)
1330 		return (S_ERROR);
1331 
1332 	data->d_size = size;
1333 
1334 	shdr->sh_flags |= SHF_WRITE;
1335 	shdr->sh_size = (Xword)size;
1336 	shdr->sh_entsize = ld_targ.t_m.m_got_entsize;
1337 
1338 	ofl->ofl_osgot = ld_place_section(ofl, isec, NULL,
1339 	    ld_targ.t_id.id_got, NULL);
1340 	if (ofl->ofl_osgot == (Os_desc *)S_ERROR)
1341 		return (S_ERROR);
1342 
1343 	ofl->ofl_osgot->os_szoutrels = (Xword)rsize;
1344 
1345 	return (1);
1346 }
1347 
1348 /*
1349  * Build an interpreter section.
1350  */
1351 static uintptr_t
make_interp(Ofl_desc * ofl)1352 make_interp(Ofl_desc *ofl)
1353 {
1354 	Shdr		*shdr;
1355 	Elf_Data	*data;
1356 	Is_desc		*isec;
1357 	const char	*iname = ofl->ofl_interp;
1358 	size_t		size;
1359 
1360 	/*
1361 	 * If -z nointerp is in effect, don't create an interpreter section.
1362 	 */
1363 	if (ofl->ofl_flags1 & FLG_OF1_NOINTRP)
1364 		return (1);
1365 
1366 	/*
1367 	 * An .interp section is always created for a dynamic executable.
1368 	 * A user can define the interpreter to use.  This definition overrides
1369 	 * the default that would be recorded in an executable, and triggers
1370 	 * the creation of an .interp section in any other object.  Presumably
1371 	 * the user knows what they are doing.  Refer to the generic ELF ABI
1372 	 * section 5-4, and the ld(1) -I option.
1373 	 */
1374 	if (((ofl->ofl_flags & (FLG_OF_DYNAMIC | FLG_OF_EXEC |
1375 	    FLG_OF_RELOBJ)) != (FLG_OF_DYNAMIC | FLG_OF_EXEC)) && !iname)
1376 		return (1);
1377 
1378 	/*
1379 	 * In the case of a dynamic executable, supply a default interpreter
1380 	 * if the user has not specified their own.
1381 	 */
1382 	if (iname == NULL)
1383 		iname = ofl->ofl_interp = ld_targ.t_m.m_def_interp;
1384 
1385 	size = strlen(iname) + 1;
1386 
1387 	if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_INTERP), 0,
1388 	    &isec, &shdr, &data) == S_ERROR)
1389 		return (S_ERROR);
1390 
1391 	data->d_size = size;
1392 	shdr->sh_size = (Xword)size;
1393 	data->d_align = shdr->sh_addralign = 1;
1394 
1395 	ofl->ofl_osinterp =
1396 	    ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_interp, NULL);
1397 	return ((uintptr_t)ofl->ofl_osinterp);
1398 }
1399 
1400 /*
1401  * Common function used to build the SHT_SUNW_versym section, SHT_SUNW_syminfo
1402  * section, and SHT_SUNW_capinfo section.  Each of these sections provide
1403  * additional symbol information, and their size parallels the associated
1404  * symbol table.
1405  */
1406 static Os_desc *
make_sym_sec(Ofl_desc * ofl,const char * sectname,Word stype,int ident)1407 make_sym_sec(Ofl_desc *ofl, const char *sectname, Word stype, int ident)
1408 {
1409 	Shdr		*shdr;
1410 	Elf_Data	*data;
1411 	Is_desc		*isec;
1412 
1413 	/*
1414 	 * We don't know the size of this section yet, so set it to 0.  The
1415 	 * size gets filled in after the associated symbol table is sized.
1416 	 */
1417 	if (new_section(ofl, stype, sectname, 0, &isec, &shdr, &data) ==
1418 	    S_ERROR)
1419 		return ((Os_desc *)S_ERROR);
1420 
1421 	return (ld_place_section(ofl, isec, NULL, ident, NULL));
1422 }
1423 
1424 /*
1425  * Determine whether a symbol capability is redundant because the object
1426  * capabilities are more restrictive.
1427  */
1428 inline static int
is_cap_redundant(Objcapset * ocapset,Objcapset * scapset)1429 is_cap_redundant(Objcapset *ocapset, Objcapset *scapset)
1430 {
1431 	Alist		*oalp, *salp;
1432 	elfcap_mask_t	omsk, smsk;
1433 
1434 	/*
1435 	 * Inspect any platform capabilities.  If the object defines platform
1436 	 * capabilities, then the object will only be loaded for those
1437 	 * platforms.  A symbol capability set that doesn't define the same
1438 	 * platforms is redundant, and a symbol capability that does not provide
1439 	 * at least one platform name that matches a platform name in the object
1440 	 * capabilities will never execute (as the object wouldn't have been
1441 	 * loaded).
1442 	 */
1443 	oalp = ocapset->oc_plat.cl_val;
1444 	salp = scapset->oc_plat.cl_val;
1445 	if (oalp && ((salp == NULL) || cap_names_match(oalp, salp)))
1446 		return (1);
1447 
1448 	/*
1449 	 * If the symbol capability set defines platforms, and the object
1450 	 * doesn't, then the symbol set is more restrictive.
1451 	 */
1452 	if (salp && (oalp == NULL))
1453 		return (0);
1454 
1455 	/*
1456 	 * Next, inspect any machine name capabilities.  If the object defines
1457 	 * machine name capabilities, then the object will only be loaded for
1458 	 * those machines.  A symbol capability set that doesn't define the same
1459 	 * machine names is redundant, and a symbol capability that does not
1460 	 * provide at least one machine name that matches a machine name in the
1461 	 * object capabilities will never execute (as the object wouldn't have
1462 	 * been loaded).
1463 	 */
1464 	oalp = ocapset->oc_plat.cl_val;
1465 	salp = scapset->oc_plat.cl_val;
1466 	if (oalp && ((salp == NULL) || cap_names_match(oalp, salp)))
1467 		return (1);
1468 
1469 	/*
1470 	 * If the symbol capability set defines machine names, and the object
1471 	 * doesn't, then the symbol set is more restrictive.
1472 	 */
1473 	if (salp && (oalp == NULL))
1474 		return (0);
1475 
1476 	/*
1477 	 * Next, inspect any hardware capabilities.  If the objects hardware
1478 	 * capabilities are greater than or equal to that of the symbols
1479 	 * capabilities, then the symbol capability set is redundant.  If the
1480 	 * symbols hardware capabilities are greater that the objects, then the
1481 	 * symbol set is more restrictive.
1482 	 *
1483 	 * Note that this is a somewhat arbitrary definition, as each capability
1484 	 * bit is independent of the others, and some of the higher order bits
1485 	 * could be considered to be less important than lower ones.  However,
1486 	 * this is the only reasonable non-subjective definition.
1487 	 */
1488 	omsk = ocapset->oc_hw_2.cm_val;
1489 	smsk = scapset->oc_hw_2.cm_val;
1490 	if ((omsk > smsk) || (omsk && (omsk == smsk)))
1491 		return (1);
1492 	if (omsk < smsk)
1493 		return (0);
1494 
1495 	/*
1496 	 * Finally, inspect the remaining hardware capabilities.
1497 	 */
1498 	omsk = ocapset->oc_hw_1.cm_val;
1499 	smsk = scapset->oc_hw_1.cm_val;
1500 	if ((omsk > smsk) || (omsk && (omsk == smsk)))
1501 		return (1);
1502 
1503 	return (0);
1504 }
1505 
1506 /*
1507  * Capabilities values might have been assigned excluded values.  These
1508  * excluded values should be removed before calculating any capabilities
1509  * sections size.
1510  */
1511 static void
capmask_value(Lm_list * lml,Word type,Capmask * capmask,int * title)1512 capmask_value(Lm_list *lml, Word type, Capmask *capmask, int *title)
1513 {
1514 	/*
1515 	 * First determine whether any bits should be excluded.
1516 	 */
1517 	if ((capmask->cm_val & capmask->cm_exc) == 0)
1518 		return;
1519 
1520 	DBG_CALL(Dbg_cap_post_title(lml, title));
1521 
1522 	DBG_CALL(Dbg_cap_val_entry(lml, DBG_STATE_CURRENT, type,
1523 	    capmask->cm_val, ld_targ.t_m.m_mach));
1524 	DBG_CALL(Dbg_cap_val_entry(lml, DBG_STATE_EXCLUDE, type,
1525 	    capmask->cm_exc, ld_targ.t_m.m_mach));
1526 
1527 	capmask->cm_val &= ~capmask->cm_exc;
1528 
1529 	DBG_CALL(Dbg_cap_val_entry(lml, DBG_STATE_RESOLVED, type,
1530 	    capmask->cm_val, ld_targ.t_m.m_mach));
1531 }
1532 
1533 static void
capstr_value(Lm_list * lml,Word type,Caplist * caplist,int * title)1534 capstr_value(Lm_list *lml, Word type, Caplist *caplist, int *title)
1535 {
1536 	Aliste	idx1, idx2;
1537 	char	*estr;
1538 	Capstr	*capstr;
1539 	Boolean	found = FALSE;
1540 
1541 	/*
1542 	 * First determine whether any strings should be excluded.
1543 	 */
1544 	for (APLIST_TRAVERSE(caplist->cl_exc, idx1, estr)) {
1545 		for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
1546 			if (strcmp(estr, capstr->cs_str) == 0) {
1547 				found = TRUE;
1548 				break;
1549 			}
1550 		}
1551 	}
1552 
1553 	if (found == FALSE)
1554 		return;
1555 
1556 	/*
1557 	 * Traverse the current strings, then delete the excluded strings,
1558 	 * and finally display the resolved strings.
1559 	 */
1560 	if (DBG_ENABLED) {
1561 		Dbg_cap_post_title(lml, title);
1562 		for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
1563 			Dbg_cap_ptr_entry(lml, DBG_STATE_CURRENT, type,
1564 			    capstr->cs_str);
1565 		}
1566 	}
1567 	for (APLIST_TRAVERSE(caplist->cl_exc, idx1, estr)) {
1568 		for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
1569 			if (strcmp(estr, capstr->cs_str) == 0) {
1570 				DBG_CALL(Dbg_cap_ptr_entry(lml,
1571 				    DBG_STATE_EXCLUDE, type, capstr->cs_str));
1572 				alist_delete(caplist->cl_val, &idx2);
1573 				break;
1574 			}
1575 		}
1576 	}
1577 	if (DBG_ENABLED) {
1578 		for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
1579 			Dbg_cap_ptr_entry(lml, DBG_STATE_RESOLVED, type,
1580 			    capstr->cs_str);
1581 		}
1582 	}
1583 }
1584 
1585 /*
1586  * Build a capabilities section.
1587  */
1588 #define	CAP_UPDATE(cap, capndx, tag, val)	\
1589 	cap->c_tag = tag; \
1590 	cap->c_un.c_val = val; \
1591 	cap++, capndx++;
1592 
1593 static uintptr_t
make_cap(Ofl_desc * ofl,Word shtype,const char * shname,int ident)1594 make_cap(Ofl_desc *ofl, Word shtype, const char *shname, int ident)
1595 {
1596 	Shdr		*shdr;
1597 	Elf_Data	*data;
1598 	Is_desc		*isec;
1599 	Cap		*cap;
1600 	size_t		size = 0;
1601 	Word		capndx = 0;
1602 	Str_tbl		*strtbl;
1603 	Objcapset	*ocapset = &ofl->ofl_ocapset;
1604 	Aliste		idx1;
1605 	Capstr		*capstr;
1606 	int		title = 0;
1607 
1608 	/*
1609 	 * Determine which string table to use for any CA_SUNW_MACH,
1610 	 * CA_SUNW_PLAT, or CA_SUNW_ID strings.
1611 	 */
1612 	if (OFL_IS_STATIC_OBJ(ofl))
1613 		strtbl = ofl->ofl_strtab;
1614 	else
1615 		strtbl = ofl->ofl_dynstrtab;
1616 
1617 	/*
1618 	 * If symbol capabilities have been requested, but none have been
1619 	 * created, warn the user.  This scenario can occur if none of the
1620 	 * input relocatable objects defined any object capabilities.
1621 	 */
1622 	if ((ofl->ofl_flags & FLG_OF_OTOSCAP) && (ofl->ofl_capsymcnt == 0))
1623 		ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_CAP_NOSYMSFOUND));
1624 
1625 	/*
1626 	 * If symbol capabilities have been collected, but no symbols are left
1627 	 * referencing these capabilities, promote the capability groups back
1628 	 * to an object capability definition.
1629 	 */
1630 	if ((ofl->ofl_flags & FLG_OF_OTOSCAP) && ofl->ofl_capsymcnt &&
1631 	    (ofl->ofl_capfamilies == NULL)) {
1632 		ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_CAP_NOSYMSFOUND));
1633 		ld_cap_move_symtoobj(ofl);
1634 		ofl->ofl_capsymcnt = 0;
1635 		ofl->ofl_capgroups = NULL;
1636 		ofl->ofl_flags &= ~FLG_OF_OTOSCAP;
1637 	}
1638 
1639 	/*
1640 	 * Remove any excluded capabilities.
1641 	 */
1642 	capstr_value(ofl->ofl_lml, CA_SUNW_PLAT, &ocapset->oc_plat, &title);
1643 	capstr_value(ofl->ofl_lml, CA_SUNW_MACH, &ocapset->oc_mach, &title);
1644 	capmask_value(ofl->ofl_lml, CA_SUNW_HW_2, &ocapset->oc_hw_2, &title);
1645 	capmask_value(ofl->ofl_lml, CA_SUNW_HW_1, &ocapset->oc_hw_1, &title);
1646 	capmask_value(ofl->ofl_lml, CA_SUNW_SF_1, &ocapset->oc_sf_1, &title);
1647 
1648 	/*
1649 	 * Determine how many entries are required for any object capabilities.
1650 	 */
1651 	size += alist_nitems(ocapset->oc_plat.cl_val);
1652 	size += alist_nitems(ocapset->oc_mach.cl_val);
1653 	if (ocapset->oc_hw_2.cm_val)
1654 		size++;
1655 	if (ocapset->oc_hw_1.cm_val)
1656 		size++;
1657 	if (ocapset->oc_sf_1.cm_val)
1658 		size++;
1659 
1660 	/*
1661 	 * Only identify a capabilities group if the group has content.  If a
1662 	 * capabilities identifier exists, and no other capabilities have been
1663 	 * supplied, remove the identifier.  This scenario could exist if a
1664 	 * user mistakenly defined a lone identifier, or if an identified group
1665 	 * was overridden so as to clear the existing capabilities and the
1666 	 * identifier was not also cleared.
1667 	 */
1668 	if (ocapset->oc_id.cs_str) {
1669 		if (size)
1670 			size++;
1671 		else
1672 			ocapset->oc_id.cs_str = NULL;
1673 	}
1674 	if (size)
1675 		size++;			/* Add CA_SUNW_NULL */
1676 
1677 	/*
1678 	 * Determine how many entries are required for any symbol capabilities.
1679 	 */
1680 	if (ofl->ofl_capsymcnt) {
1681 		/*
1682 		 * If there are no object capabilities, a CA_SUNW_NULL entry
1683 		 * is required before any symbol capabilities.
1684 		 */
1685 		if (size == 0)
1686 			size++;
1687 		size += ofl->ofl_capsymcnt;
1688 	}
1689 
1690 	if (size == 0)
1691 		return (NULL);
1692 
1693 	if (new_section(ofl, shtype, shname, size, &isec,
1694 	    &shdr, &data) == S_ERROR)
1695 		return (S_ERROR);
1696 
1697 	if ((data->d_buf = libld_malloc(shdr->sh_size)) == NULL)
1698 		return (S_ERROR);
1699 
1700 	cap = (Cap *)data->d_buf;
1701 
1702 	/*
1703 	 * Fill in any object capabilities.  If there is an identifier, then the
1704 	 * identifier comes first.  The remaining items follow in precedence
1705 	 * order, although the order isn't important for runtime verification.
1706 	 */
1707 	if (ocapset->oc_id.cs_str) {
1708 		ofl->ofl_flags |= FLG_OF_CAPSTRS;
1709 		if (st_insert(strtbl, ocapset->oc_id.cs_str) == -1)
1710 			return (S_ERROR);
1711 		ocapset->oc_id.cs_ndx = capndx;
1712 		CAP_UPDATE(cap, capndx, CA_SUNW_ID, 0);
1713 	}
1714 	if (ocapset->oc_plat.cl_val) {
1715 		ofl->ofl_flags |= (FLG_OF_PTCAP | FLG_OF_CAPSTRS);
1716 
1717 		/*
1718 		 * Insert any platform name strings in the appropriate string
1719 		 * table.  The capability value can't be filled in yet, as the
1720 		 * final offset of the strings isn't known until later.
1721 		 */
1722 		for (ALIST_TRAVERSE(ocapset->oc_plat.cl_val, idx1, capstr)) {
1723 			if (st_insert(strtbl, capstr->cs_str) == -1)
1724 				return (S_ERROR);
1725 			capstr->cs_ndx = capndx;
1726 			CAP_UPDATE(cap, capndx, CA_SUNW_PLAT, 0);
1727 		}
1728 	}
1729 	if (ocapset->oc_mach.cl_val) {
1730 		ofl->ofl_flags |= (FLG_OF_PTCAP | FLG_OF_CAPSTRS);
1731 
1732 		/*
1733 		 * Insert the machine name strings in the appropriate string
1734 		 * table.  The capability value can't be filled in yet, as the
1735 		 * final offset of the strings isn't known until later.
1736 		 */
1737 		for (ALIST_TRAVERSE(ocapset->oc_mach.cl_val, idx1, capstr)) {
1738 			if (st_insert(strtbl, capstr->cs_str) == -1)
1739 				return (S_ERROR);
1740 			capstr->cs_ndx = capndx;
1741 			CAP_UPDATE(cap, capndx, CA_SUNW_MACH, 0);
1742 		}
1743 	}
1744 	if (ocapset->oc_hw_2.cm_val) {
1745 		ofl->ofl_flags |= FLG_OF_PTCAP;
1746 		CAP_UPDATE(cap, capndx, CA_SUNW_HW_2, ocapset->oc_hw_2.cm_val);
1747 	}
1748 	if (ocapset->oc_hw_1.cm_val) {
1749 		ofl->ofl_flags |= FLG_OF_PTCAP;
1750 		CAP_UPDATE(cap, capndx, CA_SUNW_HW_1, ocapset->oc_hw_1.cm_val);
1751 	}
1752 	if (ocapset->oc_sf_1.cm_val) {
1753 		ofl->ofl_flags |= FLG_OF_PTCAP;
1754 		CAP_UPDATE(cap, capndx, CA_SUNW_SF_1, ocapset->oc_sf_1.cm_val);
1755 	}
1756 	CAP_UPDATE(cap, capndx, CA_SUNW_NULL, 0);
1757 
1758 	/*
1759 	 * Fill in any symbol capabilities.
1760 	 */
1761 	if (ofl->ofl_capgroups) {
1762 		Cap_group	*cgp;
1763 
1764 		for (APLIST_TRAVERSE(ofl->ofl_capgroups, idx1, cgp)) {
1765 			Objcapset	*scapset = &cgp->cg_set;
1766 			Aliste		idx2;
1767 			Is_desc		*isp;
1768 
1769 			cgp->cg_ndx = capndx;
1770 
1771 			if (scapset->oc_id.cs_str) {
1772 				ofl->ofl_flags |= FLG_OF_CAPSTRS;
1773 				/*
1774 				 * Insert the identifier string in the
1775 				 * appropriate string table.  The capability
1776 				 * value can't be filled in yet, as the final
1777 				 * offset of the string isn't known until later.
1778 				 */
1779 				if (st_insert(strtbl,
1780 				    scapset->oc_id.cs_str) == -1)
1781 					return (S_ERROR);
1782 				scapset->oc_id.cs_ndx = capndx;
1783 				CAP_UPDATE(cap, capndx, CA_SUNW_ID, 0);
1784 			}
1785 
1786 			if (scapset->oc_plat.cl_val) {
1787 				ofl->ofl_flags |= FLG_OF_CAPSTRS;
1788 
1789 				/*
1790 				 * Insert the platform name string in the
1791 				 * appropriate string table.  The capability
1792 				 * value can't be filled in yet, as the final
1793 				 * offset of the string isn't known until later.
1794 				 */
1795 				for (ALIST_TRAVERSE(scapset->oc_plat.cl_val,
1796 				    idx2, capstr)) {
1797 					if (st_insert(strtbl,
1798 					    capstr->cs_str) == -1)
1799 						return (S_ERROR);
1800 					capstr->cs_ndx = capndx;
1801 					CAP_UPDATE(cap, capndx,
1802 					    CA_SUNW_PLAT, 0);
1803 				}
1804 			}
1805 			if (scapset->oc_mach.cl_val) {
1806 				ofl->ofl_flags |= FLG_OF_CAPSTRS;
1807 
1808 				/*
1809 				 * Insert the machine name string in the
1810 				 * appropriate string table.  The capability
1811 				 * value can't be filled in yet, as the final
1812 				 * offset of the string isn't known until later.
1813 				 */
1814 				for (ALIST_TRAVERSE(scapset->oc_mach.cl_val,
1815 				    idx2, capstr)) {
1816 					if (st_insert(strtbl,
1817 					    capstr->cs_str) == -1)
1818 						return (S_ERROR);
1819 					capstr->cs_ndx = capndx;
1820 					CAP_UPDATE(cap, capndx,
1821 					    CA_SUNW_MACH, 0);
1822 				}
1823 			}
1824 			if (scapset->oc_hw_2.cm_val) {
1825 				CAP_UPDATE(cap, capndx, CA_SUNW_HW_2,
1826 				    scapset->oc_hw_2.cm_val);
1827 			}
1828 			if (scapset->oc_hw_1.cm_val) {
1829 				CAP_UPDATE(cap, capndx, CA_SUNW_HW_1,
1830 				    scapset->oc_hw_1.cm_val);
1831 			}
1832 			if (scapset->oc_sf_1.cm_val) {
1833 				CAP_UPDATE(cap, capndx, CA_SUNW_SF_1,
1834 				    scapset->oc_sf_1.cm_val);
1835 			}
1836 			CAP_UPDATE(cap, capndx, CA_SUNW_NULL, 0);
1837 
1838 			/*
1839 			 * If any object capabilities are available, determine
1840 			 * whether these symbol capabilities are less
1841 			 * restrictive, and hence redundant.
1842 			 */
1843 			if (((ofl->ofl_flags & FLG_OF_PTCAP) == 0) ||
1844 			    (is_cap_redundant(ocapset, scapset) == 0))
1845 				continue;
1846 
1847 			/*
1848 			 * Indicate any files that provide redundant symbol
1849 			 * capabilities.
1850 			 */
1851 			for (APLIST_TRAVERSE(cgp->cg_secs, idx2, isp)) {
1852 				ld_eprintf(ofl, ERR_WARNING,
1853 				    MSG_INTL(MSG_CAP_REDUNDANT),
1854 				    isp->is_file->ifl_name,
1855 				    EC_WORD(isp->is_scnndx), isp->is_name);
1856 			}
1857 		}
1858 	}
1859 
1860 	/*
1861 	 * If capabilities strings are required, the sh_info field of the
1862 	 * section header will be set to the associated string table.
1863 	 */
1864 	if (ofl->ofl_flags & FLG_OF_CAPSTRS)
1865 		shdr->sh_flags |= SHF_INFO_LINK;
1866 
1867 	/*
1868 	 * Place these capabilities in the output file.
1869 	 */
1870 	if ((ofl->ofl_oscap = ld_place_section(ofl, isec,
1871 	    NULL, ident, NULL)) == (Os_desc *)S_ERROR)
1872 		return (S_ERROR);
1873 
1874 	/*
1875 	 * If symbol capabilities are required, then a .SUNW_capinfo section is
1876 	 * also created.  This table will eventually be sized to match the
1877 	 * associated symbol table.
1878 	 */
1879 	if (ofl->ofl_capfamilies) {
1880 		if ((ofl->ofl_oscapinfo = make_sym_sec(ofl,
1881 		    MSG_ORIG(MSG_SCN_SUNWCAPINFO), SHT_SUNW_capinfo,
1882 		    ld_targ.t_id.id_capinfo)) == (Os_desc *)S_ERROR)
1883 			return (S_ERROR);
1884 
1885 		/*
1886 		 * If we're generating a dynamic object, capabilities family
1887 		 * members are maintained in a .SUNW_capchain section.
1888 		 */
1889 		if (ofl->ofl_capchaincnt &&
1890 		    ((ofl->ofl_flags & FLG_OF_RELOBJ) == 0)) {
1891 			if (new_section(ofl, SHT_SUNW_capchain,
1892 			    MSG_ORIG(MSG_SCN_SUNWCAPCHAIN),
1893 			    ofl->ofl_capchaincnt, &isec, &shdr,
1894 			    &data) == S_ERROR)
1895 				return (S_ERROR);
1896 
1897 			ofl->ofl_oscapchain = ld_place_section(ofl, isec,
1898 			    NULL, ld_targ.t_id.id_capchain, NULL);
1899 			if (ofl->ofl_oscapchain == (Os_desc *)S_ERROR)
1900 				return (S_ERROR);
1901 
1902 		}
1903 	}
1904 	return (1);
1905 }
1906 #undef	CAP_UPDATE
1907 
1908 /*
1909  * Build the PLT section and its associated relocation entries.
1910  */
1911 static uintptr_t
make_plt(Ofl_desc * ofl)1912 make_plt(Ofl_desc *ofl)
1913 {
1914 	Shdr		*shdr;
1915 	Elf_Data	*data;
1916 	Is_desc		*isec;
1917 	size_t		size = ld_targ.t_m.m_plt_reservsz +
1918 	    (((size_t)ofl->ofl_pltcnt + (size_t)ofl->ofl_pltpad) *
1919 	    ld_targ.t_m.m_plt_entsize);
1920 	size_t		rsize = (size_t)ofl->ofl_relocpltsz;
1921 
1922 	/*
1923 	 * On sparc, account for the NOP at the end of the plt.
1924 	 */
1925 	if (ld_targ.t_m.m_mach == LD_TARG_BYCLASS(EM_SPARC, EM_SPARCV9))
1926 		size += sizeof (Word);
1927 
1928 	if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_PLT), 0,
1929 	    &isec, &shdr, &data) == S_ERROR)
1930 		return (S_ERROR);
1931 
1932 	data->d_size = size;
1933 	data->d_align = ld_targ.t_m.m_plt_align;
1934 
1935 	shdr->sh_flags = ld_targ.t_m.m_plt_shf_flags;
1936 	shdr->sh_size = (Xword)size;
1937 	shdr->sh_addralign = ld_targ.t_m.m_plt_align;
1938 	shdr->sh_entsize = ld_targ.t_m.m_plt_entsize;
1939 
1940 	ofl->ofl_osplt = ld_place_section(ofl, isec, NULL,
1941 	    ld_targ.t_id.id_plt, NULL);
1942 	if (ofl->ofl_osplt == (Os_desc *)S_ERROR)
1943 		return (S_ERROR);
1944 
1945 	ofl->ofl_osplt->os_szoutrels = (Xword)rsize;
1946 
1947 	return (1);
1948 }
1949 
1950 /*
1951  * Make the hash table.  Only built for dynamic executables and shared
1952  * libraries, and provides hashed lookup into the global symbol table
1953  * (.dynsym) for the run-time linker to resolve symbol lookups.
1954  */
1955 static uintptr_t
make_hash(Ofl_desc * ofl)1956 make_hash(Ofl_desc *ofl)
1957 {
1958 	Shdr		*shdr;
1959 	Elf_Data	*data;
1960 	Is_desc		*isec;
1961 	size_t		size;
1962 	Word		nsyms = ofl->ofl_globcnt;
1963 	size_t		cnt;
1964 
1965 	/*
1966 	 * Allocate section header structures. We set entcnt to 0
1967 	 * because it's going to change after we place this section.
1968 	 */
1969 	if (new_section(ofl, SHT_HASH, MSG_ORIG(MSG_SCN_HASH), 0,
1970 	    &isec, &shdr, &data) == S_ERROR)
1971 		return (S_ERROR);
1972 
1973 	/*
1974 	 * Place the section first since it will affect the local symbol
1975 	 * count.
1976 	 */
1977 	ofl->ofl_oshash =
1978 	    ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_hash, NULL);
1979 	if (ofl->ofl_oshash == (Os_desc *)S_ERROR)
1980 		return (S_ERROR);
1981 
1982 	/*
1983 	 * Calculate the number of output hash buckets.
1984 	 */
1985 	ofl->ofl_hashbkts = findprime(nsyms);
1986 
1987 	/*
1988 	 * The size of the hash table is determined by
1989 	 *
1990 	 *	i.	the initial nbucket and nchain entries (2)
1991 	 *	ii.	the number of buckets (calculated above)
1992 	 *	iii.	the number of chains (this is based on the number of
1993 	 *		symbols in the .dynsym array).
1994 	 */
1995 	cnt = 2 + ofl->ofl_hashbkts + DYNSYM_ALL_CNT(ofl);
1996 	size = cnt * shdr->sh_entsize;
1997 
1998 	/*
1999 	 * Finalize the section header and data buffer initialization.
2000 	 */
2001 	if ((data->d_buf = libld_calloc(size, 1)) == NULL)
2002 		return (S_ERROR);
2003 	data->d_size = size;
2004 	shdr->sh_size = (Xword)size;
2005 
2006 	return (1);
2007 }
2008 
2009 /*
2010  * Generate the standard symbol table.  Contains all locals and globals,
2011  * and resides in a non-allocatable section (ie. it can be stripped).
2012  */
2013 static uintptr_t
make_symtab(Ofl_desc * ofl)2014 make_symtab(Ofl_desc *ofl)
2015 {
2016 	Shdr		*shdr;
2017 	Elf_Data	*data;
2018 	Is_desc		*isec;
2019 	Is_desc		*xisec = 0;
2020 	size_t		size;
2021 	Word		symcnt;
2022 
2023 	/*
2024 	 * Create the section headers. Note that we supply an ent_cnt
2025 	 * of 0. We won't know the count until the section has been placed.
2026 	 */
2027 	if (new_section(ofl, SHT_SYMTAB, MSG_ORIG(MSG_SCN_SYMTAB), 0,
2028 	    &isec, &shdr, &data) == S_ERROR)
2029 		return (S_ERROR);
2030 
2031 	/*
2032 	 * Place the section first since it will affect the local symbol
2033 	 * count.
2034 	 */
2035 	if ((ofl->ofl_ossymtab = ld_place_section(ofl, isec, NULL,
2036 	    ld_targ.t_id.id_symtab, NULL)) == (Os_desc *)S_ERROR)
2037 		return (S_ERROR);
2038 
2039 	/*
2040 	 * At this point we've created all but the 'shstrtab' section.
2041 	 * Determine if we have to use 'Extended Sections'.  If so - then
2042 	 * also create a SHT_SYMTAB_SHNDX section.
2043 	 */
2044 	if ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE) {
2045 		Shdr		*xshdr;
2046 		Elf_Data	*xdata;
2047 
2048 		if (new_section(ofl, SHT_SYMTAB_SHNDX,
2049 		    MSG_ORIG(MSG_SCN_SYMTAB_SHNDX), 0, &xisec,
2050 		    &xshdr, &xdata) == S_ERROR)
2051 			return (S_ERROR);
2052 
2053 		if ((ofl->ofl_ossymshndx = ld_place_section(ofl, xisec, NULL,
2054 		    ld_targ.t_id.id_symtab_ndx, NULL)) == (Os_desc *)S_ERROR)
2055 			return (S_ERROR);
2056 	}
2057 
2058 	/*
2059 	 * Calculated number of symbols, which need to be augmented by
2060 	 * the (yet to be created) .shstrtab entry.
2061 	 */
2062 	symcnt = (size_t)(1 + SYMTAB_ALL_CNT(ofl));
2063 	size = symcnt * shdr->sh_entsize;
2064 
2065 	/*
2066 	 * Finalize the section header and data buffer initialization.
2067 	 */
2068 	data->d_size = size;
2069 	shdr->sh_size = (Xword)size;
2070 
2071 	/*
2072 	 * If we created a SHT_SYMTAB_SHNDX - then set it's sizes too.
2073 	 */
2074 	if (xisec) {
2075 		size_t	xsize = symcnt * sizeof (Word);
2076 
2077 		xisec->is_indata->d_size = xsize;
2078 		xisec->is_shdr->sh_size = (Xword)xsize;
2079 	}
2080 
2081 	return (1);
2082 }
2083 
2084 /*
2085  * Build a dynamic symbol table. These tables reside in the text
2086  * segment of a dynamic executable or shared library.
2087  *
2088  *	.SUNW_ldynsym contains local function symbols
2089  *	.dynsym contains only globals symbols
2090  *
2091  * The two tables are created adjacent to each other, with .SUNW_ldynsym
2092  * coming first.
2093  */
2094 static uintptr_t
make_dynsym(Ofl_desc * ofl)2095 make_dynsym(Ofl_desc *ofl)
2096 {
2097 	Shdr		*shdr, *lshdr;
2098 	Elf_Data	*data, *ldata;
2099 	Is_desc		*isec, *lisec;
2100 	size_t		size;
2101 	Xword		cnt;
2102 	int		allow_ldynsym;
2103 
2104 	/*
2105 	 * Unless explicitly disabled, always produce a .SUNW_ldynsym section
2106 	 * when it is allowed by the file type, even if the resulting
2107 	 * table only ends up with a single STT_FILE in it. There are
2108 	 * two reasons: (1) It causes the generation of the DT_SUNW_SYMTAB
2109 	 * entry in the .dynamic section, which is something we would
2110 	 * like to encourage, and (2) Without it, we cannot generate
2111 	 * the associated .SUNW_dyn[sym|tls]sort sections, which are of
2112 	 * value to DTrace.
2113 	 *
2114 	 * In practice, it is extremely rare for an object not to have
2115 	 * local symbols for .SUNW_ldynsym, so 99% of the time, we'd be
2116 	 * doing it anyway.
2117 	 */
2118 	allow_ldynsym = OFL_ALLOW_LDYNSYM(ofl);
2119 
2120 	/*
2121 	 * Create the section headers. Note that we supply an ent_cnt
2122 	 * of 0. We won't know the count until the section has been placed.
2123 	 */
2124 	if (allow_ldynsym && new_section(ofl, SHT_SUNW_LDYNSYM,
2125 	    MSG_ORIG(MSG_SCN_LDYNSYM), 0, &lisec, &lshdr, &ldata) == S_ERROR)
2126 		return (S_ERROR);
2127 
2128 	if (new_section(ofl, SHT_DYNSYM, MSG_ORIG(MSG_SCN_DYNSYM), 0,
2129 	    &isec, &shdr, &data) == S_ERROR)
2130 		return (S_ERROR);
2131 
2132 	/*
2133 	 * Place the section(s) first since it will affect the local symbol
2134 	 * count.
2135 	 */
2136 	if (allow_ldynsym &&
2137 	    ((ofl->ofl_osldynsym = ld_place_section(ofl, lisec, NULL,
2138 	    ld_targ.t_id.id_ldynsym, NULL)) == (Os_desc *)S_ERROR))
2139 		return (S_ERROR);
2140 	ofl->ofl_osdynsym =
2141 	    ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_dynsym, NULL);
2142 	if (ofl->ofl_osdynsym == (Os_desc *)S_ERROR)
2143 		return (S_ERROR);
2144 
2145 	cnt = DYNSYM_ALL_CNT(ofl);
2146 	size = (size_t)cnt * shdr->sh_entsize;
2147 
2148 	/*
2149 	 * Finalize the section header and data buffer initialization.
2150 	 */
2151 	data->d_size = size;
2152 	shdr->sh_size = (Xword)size;
2153 
2154 	/*
2155 	 * An ldynsym contains local function symbols. It is not
2156 	 * used for linking, but if present, serves to allow better
2157 	 * stack traces to be generated in contexts where the symtab
2158 	 * is not available. (dladdr(), or stripped executable/library files).
2159 	 */
2160 	if (allow_ldynsym) {
2161 		cnt = 1 + ofl->ofl_dynlocscnt + ofl->ofl_dynscopecnt;
2162 		size = (size_t)cnt * shdr->sh_entsize;
2163 
2164 		ldata->d_size = size;
2165 		lshdr->sh_size = (Xword)size;
2166 	}
2167 
2168 	return (1);
2169 }
2170 
2171 /*
2172  * Build .SUNW_dynsymsort and/or .SUNW_dyntlssort sections. These are
2173  * index sections for the .SUNW_ldynsym/.dynsym pair that present data
2174  * and function symbols sorted by address.
2175  */
2176 static uintptr_t
make_dynsort(Ofl_desc * ofl)2177 make_dynsort(Ofl_desc *ofl)
2178 {
2179 	Shdr		*shdr;
2180 	Elf_Data	*data;
2181 	Is_desc		*isec;
2182 
2183 	/* Only do it if the .SUNW_ldynsym section is present */
2184 	if (!OFL_ALLOW_LDYNSYM(ofl))
2185 		return (1);
2186 
2187 	/* .SUNW_dynsymsort */
2188 	if (ofl->ofl_dynsymsortcnt > 0) {
2189 		if (new_section(ofl, SHT_SUNW_symsort,
2190 		    MSG_ORIG(MSG_SCN_DYNSYMSORT), ofl->ofl_dynsymsortcnt,
2191 		    &isec, &shdr, &data) == S_ERROR)
2192 		return (S_ERROR);
2193 
2194 		if ((ofl->ofl_osdynsymsort = ld_place_section(ofl, isec, NULL,
2195 		    ld_targ.t_id.id_dynsort, NULL)) == (Os_desc *)S_ERROR)
2196 			return (S_ERROR);
2197 	}
2198 
2199 	/* .SUNW_dyntlssort */
2200 	if (ofl->ofl_dyntlssortcnt > 0) {
2201 		if (new_section(ofl, SHT_SUNW_tlssort,
2202 		    MSG_ORIG(MSG_SCN_DYNTLSSORT),
2203 		    ofl->ofl_dyntlssortcnt, &isec, &shdr, &data) == S_ERROR)
2204 		return (S_ERROR);
2205 
2206 		if ((ofl->ofl_osdyntlssort = ld_place_section(ofl, isec, NULL,
2207 		    ld_targ.t_id.id_dynsort, NULL)) == (Os_desc *)S_ERROR)
2208 			return (S_ERROR);
2209 	}
2210 
2211 	return (1);
2212 }
2213 
2214 /*
2215  * Helper routine for make_dynsym_shndx. Builds a
2216  * a SHT_SYMTAB_SHNDX for .dynsym or .SUNW_ldynsym, without knowing
2217  * which one it is.
2218  */
2219 static uintptr_t
make_dyn_shndx(Ofl_desc * ofl,const char * shname,Os_desc * symtab,Os_desc ** ret_os)2220 make_dyn_shndx(Ofl_desc *ofl, const char *shname, Os_desc *symtab,
2221     Os_desc **ret_os)
2222 {
2223 	Is_desc		*isec;
2224 	Is_desc		*dynsymisp;
2225 	Shdr		*shdr, *dynshdr;
2226 	Elf_Data	*data;
2227 
2228 	dynsymisp = ld_os_first_isdesc(symtab);
2229 	dynshdr = dynsymisp->is_shdr;
2230 
2231 	if (new_section(ofl, SHT_SYMTAB_SHNDX, shname,
2232 	    (dynshdr->sh_size / dynshdr->sh_entsize),
2233 	    &isec, &shdr, &data) == S_ERROR)
2234 		return (S_ERROR);
2235 
2236 	if ((*ret_os = ld_place_section(ofl, isec, NULL,
2237 	    ld_targ.t_id.id_dynsym_ndx, NULL)) == (Os_desc *)S_ERROR)
2238 		return (S_ERROR);
2239 
2240 	assert(*ret_os);
2241 
2242 	return (1);
2243 }
2244 
2245 /*
2246  * Build a SHT_SYMTAB_SHNDX for the .dynsym, and .SUNW_ldynsym
2247  */
2248 static uintptr_t
make_dynsym_shndx(Ofl_desc * ofl)2249 make_dynsym_shndx(Ofl_desc *ofl)
2250 {
2251 	/*
2252 	 * If there is a .SUNW_ldynsym, generate a section for its extended
2253 	 * index section as well.
2254 	 */
2255 	if (OFL_ALLOW_LDYNSYM(ofl)) {
2256 		if (make_dyn_shndx(ofl, MSG_ORIG(MSG_SCN_LDYNSYM_SHNDX),
2257 		    ofl->ofl_osldynsym, &ofl->ofl_osldynshndx) == S_ERROR)
2258 			return (S_ERROR);
2259 	}
2260 
2261 	/* The Generate a section for the dynsym */
2262 	if (make_dyn_shndx(ofl, MSG_ORIG(MSG_SCN_DYNSYM_SHNDX),
2263 	    ofl->ofl_osdynsym, &ofl->ofl_osdynshndx) == S_ERROR)
2264 		return (S_ERROR);
2265 
2266 	return (1);
2267 }
2268 
2269 
2270 /*
2271  * Build a string table for the section headers.
2272  */
2273 static uintptr_t
make_shstrtab(Ofl_desc * ofl)2274 make_shstrtab(Ofl_desc *ofl)
2275 {
2276 	Shdr		*shdr;
2277 	Elf_Data	*data;
2278 	Is_desc		*isec;
2279 	size_t		size;
2280 
2281 	if (new_section(ofl, SHT_STRTAB, MSG_ORIG(MSG_SCN_SHSTRTAB),
2282 	    0, &isec, &shdr, &data) == S_ERROR)
2283 		return (S_ERROR);
2284 
2285 	/*
2286 	 * Place the section first, as it may effect the number of section
2287 	 * headers to account for.
2288 	 */
2289 	ofl->ofl_osshstrtab =
2290 	    ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_note, NULL);
2291 	if (ofl->ofl_osshstrtab == (Os_desc *)S_ERROR)
2292 		return (S_ERROR);
2293 
2294 	size = st_getstrtab_sz(ofl->ofl_shdrsttab);
2295 	assert(size > 0);
2296 
2297 	data->d_size = size;
2298 	shdr->sh_size = (Xword)size;
2299 
2300 	return (1);
2301 }
2302 
2303 /*
2304  * Build a string section for the standard symbol table.
2305  */
2306 static uintptr_t
make_strtab(Ofl_desc * ofl)2307 make_strtab(Ofl_desc *ofl)
2308 {
2309 	Shdr		*shdr;
2310 	Elf_Data	*data;
2311 	Is_desc		*isec;
2312 	size_t		size;
2313 
2314 	/*
2315 	 * This string table consists of all the global and local symbols.
2316 	 * Account for null bytes at end of the file name and the beginning
2317 	 * of section.
2318 	 */
2319 	if (st_insert(ofl->ofl_strtab, ofl->ofl_name) == -1)
2320 		return (S_ERROR);
2321 
2322 	size = st_getstrtab_sz(ofl->ofl_strtab);
2323 	assert(size > 0);
2324 
2325 	if (new_section(ofl, SHT_STRTAB, MSG_ORIG(MSG_SCN_STRTAB),
2326 	    0, &isec, &shdr, &data) == S_ERROR)
2327 		return (S_ERROR);
2328 
2329 	/* Set the size of the data area */
2330 	data->d_size = size;
2331 	shdr->sh_size = (Xword)size;
2332 
2333 	ofl->ofl_osstrtab =
2334 	    ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_strtab, NULL);
2335 	return ((uintptr_t)ofl->ofl_osstrtab);
2336 }
2337 
2338 /*
2339  * Build a string table for the dynamic symbol table.
2340  */
2341 static uintptr_t
make_dynstr(Ofl_desc * ofl)2342 make_dynstr(Ofl_desc *ofl)
2343 {
2344 	Shdr		*shdr;
2345 	Elf_Data	*data;
2346 	Is_desc		*isec;
2347 	size_t		size;
2348 
2349 	/*
2350 	 * If producing a .SUNW_ldynsym, account for the initial STT_FILE
2351 	 * symbol that precedes the scope reduced global symbols.
2352 	 */
2353 	if (OFL_ALLOW_LDYNSYM(ofl)) {
2354 		if (st_insert(ofl->ofl_dynstrtab, ofl->ofl_name) == -1)
2355 			return (S_ERROR);
2356 		ofl->ofl_dynscopecnt++;
2357 	}
2358 
2359 	/*
2360 	 * Account for any local, named register symbols.  These locals are
2361 	 * required for reference from DT_REGISTER .dynamic entries.
2362 	 */
2363 	if (ofl->ofl_regsyms) {
2364 		int	ndx;
2365 
2366 		for (ndx = 0; ndx < ofl->ofl_regsymsno; ndx++) {
2367 			Sym_desc	*sdp;
2368 
2369 			if ((sdp = ofl->ofl_regsyms[ndx]) == NULL)
2370 				continue;
2371 
2372 			if (!SYM_IS_HIDDEN(sdp) &&
2373 			    (ELF_ST_BIND(sdp->sd_sym->st_info) != STB_LOCAL))
2374 				continue;
2375 
2376 			if (sdp->sd_sym->st_name == NULL)
2377 				continue;
2378 
2379 			if (st_insert(ofl->ofl_dynstrtab, sdp->sd_name) == -1)
2380 				return (S_ERROR);
2381 		}
2382 	}
2383 
2384 	/*
2385 	 * Reserve entries for any per-symbol auxiliary/filter strings.
2386 	 */
2387 	if (ofl->ofl_dtsfltrs != NULL) {
2388 		Dfltr_desc	*dftp;
2389 		Aliste		idx;
2390 
2391 		for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, idx, dftp))
2392 			if (st_insert(ofl->ofl_dynstrtab, dftp->dft_str) == -1)
2393 				return (S_ERROR);
2394 	}
2395 
2396 	size = st_getstrtab_sz(ofl->ofl_dynstrtab);
2397 	assert(size > 0);
2398 
2399 	if (new_section(ofl, SHT_STRTAB, MSG_ORIG(MSG_SCN_DYNSTR),
2400 	    0, &isec, &shdr, &data) == S_ERROR)
2401 		return (S_ERROR);
2402 
2403 	/* Make it allocable if necessary */
2404 	if (!(ofl->ofl_flags & FLG_OF_RELOBJ))
2405 		shdr->sh_flags |= SHF_ALLOC;
2406 
2407 	/* Set the size of the data area */
2408 	data->d_size = size + DYNSTR_EXTRA_PAD;
2409 
2410 	shdr->sh_size = (Xword)size;
2411 
2412 	ofl->ofl_osdynstr =
2413 	    ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_dynstr, NULL);
2414 	return ((uintptr_t)ofl->ofl_osdynstr);
2415 }
2416 
2417 /*
2418  * Generate an output relocation section which will contain the relocation
2419  * information to be applied to the `osp' section.
2420  *
2421  * If (osp == NULL) then we are creating the coalesced relocation section
2422  * for an executable and/or a shared object.
2423  */
2424 static uintptr_t
make_reloc(Ofl_desc * ofl,Os_desc * osp)2425 make_reloc(Ofl_desc *ofl, Os_desc *osp)
2426 {
2427 	Shdr		*shdr;
2428 	Elf_Data	*data;
2429 	Is_desc		*isec;
2430 	size_t		size;
2431 	Xword		sh_flags;
2432 	char 		*sectname;
2433 	Os_desc		*rosp;
2434 	Word		relsize;
2435 	const char	*rel_prefix;
2436 
2437 	/* LINTED */
2438 	if (ld_targ.t_m.m_rel_sht_type == SHT_REL) {
2439 		/* REL */
2440 		relsize = sizeof (Rel);
2441 		rel_prefix = MSG_ORIG(MSG_SCN_REL);
2442 	} else {
2443 		/* RELA */
2444 		relsize = sizeof (Rela);
2445 		rel_prefix = MSG_ORIG(MSG_SCN_RELA);
2446 	}
2447 
2448 	if (osp) {
2449 		size = osp->os_szoutrels;
2450 		sh_flags = osp->os_shdr->sh_flags;
2451 		if ((sectname = libld_malloc(strlen(rel_prefix) +
2452 		    strlen(osp->os_name) + 1)) == 0)
2453 			return (S_ERROR);
2454 		(void) strcpy(sectname, rel_prefix);
2455 		(void) strcat(sectname, osp->os_name);
2456 	} else if (ofl->ofl_flags & FLG_OF_COMREL) {
2457 		size = (ofl->ofl_reloccnt - ofl->ofl_reloccntsub) * relsize;
2458 		sh_flags = SHF_ALLOC;
2459 		sectname = (char *)MSG_ORIG(MSG_SCN_SUNWRELOC);
2460 	} else {
2461 		size = ofl->ofl_relocrelsz;
2462 		sh_flags = SHF_ALLOC;
2463 		sectname = (char *)rel_prefix;
2464 	}
2465 
2466 	/*
2467 	 * Keep track of total size of 'output relocations' (to be stored
2468 	 * in .dynamic)
2469 	 */
2470 	/* LINTED */
2471 	ofl->ofl_relocsz += (Xword)size;
2472 
2473 	if (new_section(ofl, ld_targ.t_m.m_rel_sht_type, sectname, 0, &isec,
2474 	    &shdr, &data) == S_ERROR)
2475 		return (S_ERROR);
2476 
2477 	data->d_size = size;
2478 
2479 	shdr->sh_size = (Xword)size;
2480 	if (OFL_ALLOW_DYNSYM(ofl) && (sh_flags & SHF_ALLOC))
2481 		shdr->sh_flags = SHF_ALLOC;
2482 
2483 	if (osp) {
2484 		/*
2485 		 * The sh_info field of the SHT_REL* sections points to the
2486 		 * section the relocations are to be applied to.
2487 		 */
2488 		shdr->sh_flags |= SHF_INFO_LINK;
2489 	}
2490 
2491 	rosp = ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_rel, NULL);
2492 	if (rosp == (Os_desc *)S_ERROR)
2493 		return (S_ERROR);
2494 
2495 	/*
2496 	 * Associate this relocation section to the section its going to
2497 	 * relocate.
2498 	 */
2499 	if (osp) {
2500 		Aliste	idx;
2501 		Is_desc	*risp;
2502 
2503 		/*
2504 		 * This is used primarily so that we can update
2505 		 * SHT_GROUP[sect_no] entries to point to the
2506 		 * created output relocation sections.
2507 		 */
2508 		for (APLIST_TRAVERSE(osp->os_relisdescs, idx, risp)) {
2509 			risp->is_osdesc = rosp;
2510 
2511 			/*
2512 			 * If the input relocation section had the SHF_GROUP
2513 			 * flag set - propagate it to the output relocation
2514 			 * section.
2515 			 */
2516 			if (risp->is_shdr->sh_flags & SHF_GROUP) {
2517 				rosp->os_shdr->sh_flags |= SHF_GROUP;
2518 				break;
2519 			}
2520 		}
2521 		osp->os_relosdesc = rosp;
2522 	} else
2523 		ofl->ofl_osrel = rosp;
2524 
2525 	/*
2526 	 * If this is the first relocation section we've encountered save it
2527 	 * so that the .dynamic entry can be initialized accordingly.
2528 	 */
2529 	if (ofl->ofl_osrelhead == (Os_desc *)0)
2530 		ofl->ofl_osrelhead = rosp;
2531 
2532 	return (1);
2533 }
2534 
2535 /*
2536  * Generate version needed section.
2537  */
2538 static uintptr_t
make_verneed(Ofl_desc * ofl)2539 make_verneed(Ofl_desc *ofl)
2540 {
2541 	Shdr		*shdr;
2542 	Elf_Data	*data;
2543 	Is_desc		*isec;
2544 
2545 	/*
2546 	 * verneed sections do not have a constant element size, so the
2547 	 * value of ent_cnt specified here (0) is meaningless.
2548 	 */
2549 	if (new_section(ofl, SHT_SUNW_verneed, MSG_ORIG(MSG_SCN_SUNWVERSION),
2550 	    0, &isec, &shdr, &data) == S_ERROR)
2551 		return (S_ERROR);
2552 
2553 	/* During version processing we calculated the total size. */
2554 	data->d_size = ofl->ofl_verneedsz;
2555 	shdr->sh_size = (Xword)ofl->ofl_verneedsz;
2556 
2557 	ofl->ofl_osverneed =
2558 	    ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_version, NULL);
2559 	return ((uintptr_t)ofl->ofl_osverneed);
2560 }
2561 
2562 /*
2563  * Generate a version definition section.
2564  *
2565  *  o	the SHT_SUNW_verdef section defines the versions that exist within this
2566  *	image.
2567  */
2568 static uintptr_t
make_verdef(Ofl_desc * ofl)2569 make_verdef(Ofl_desc *ofl)
2570 {
2571 	Shdr		*shdr;
2572 	Elf_Data	*data;
2573 	Is_desc		*isec;
2574 	Ver_desc	*vdp;
2575 	Str_tbl		*strtab;
2576 
2577 	/*
2578 	 * Reserve a string table entry for the base version dependency (other
2579 	 * dependencies have symbol representations, which will already be
2580 	 * accounted for during symbol processing).
2581 	 */
2582 	vdp = (Ver_desc *)ofl->ofl_verdesc->apl_data[0];
2583 
2584 	if (OFL_IS_STATIC_OBJ(ofl))
2585 		strtab = ofl->ofl_strtab;
2586 	else
2587 		strtab = ofl->ofl_dynstrtab;
2588 
2589 	if (st_insert(strtab, vdp->vd_name) == -1)
2590 		return (S_ERROR);
2591 
2592 	/*
2593 	 * verdef sections do not have a constant element size, so the
2594 	 * value of ent_cnt specified here (0) is meaningless.
2595 	 */
2596 	if (new_section(ofl, SHT_SUNW_verdef, MSG_ORIG(MSG_SCN_SUNWVERSION),
2597 	    0, &isec, &shdr, &data) == S_ERROR)
2598 		return (S_ERROR);
2599 
2600 	/* During version processing we calculated the total size. */
2601 	data->d_size = ofl->ofl_verdefsz;
2602 	shdr->sh_size = (Xword)ofl->ofl_verdefsz;
2603 
2604 	ofl->ofl_osverdef =
2605 	    ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_version, NULL);
2606 	return ((uintptr_t)ofl->ofl_osverdef);
2607 }
2608 
2609 /*
2610  * This routine is called when -z nopartial is in effect.
2611  */
2612 uintptr_t
ld_make_parexpn_data(Ofl_desc * ofl,size_t size,Xword align)2613 ld_make_parexpn_data(Ofl_desc *ofl, size_t size, Xword align)
2614 {
2615 	Shdr		*shdr;
2616 	Elf_Data	*data;
2617 	Is_desc		*isec;
2618 	Os_desc		*osp;
2619 
2620 	if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_DATA), 0,
2621 	    &isec, &shdr, &data) == S_ERROR)
2622 		return (S_ERROR);
2623 
2624 	shdr->sh_flags |= SHF_WRITE;
2625 	data->d_size = size;
2626 	shdr->sh_size = (Xword)size;
2627 	if (align != 0) {
2628 		data->d_align = align;
2629 		shdr->sh_addralign = align;
2630 	}
2631 
2632 	if ((data->d_buf = libld_calloc(size, 1)) == NULL)
2633 		return (S_ERROR);
2634 
2635 	/*
2636 	 * Retain handle to this .data input section. Variables using move
2637 	 * sections (partial initialization) will be redirected here when
2638 	 * such global references are added and '-z nopartial' is in effect.
2639 	 */
2640 	ofl->ofl_isparexpn = isec;
2641 	osp = ld_place_section(ofl, isec, NULL, ld_targ.t_id.id_data, NULL);
2642 	if (osp == (Os_desc *)S_ERROR)
2643 		return (S_ERROR);
2644 
2645 	if (!(osp->os_flags & FLG_OS_OUTREL)) {
2646 		ofl->ofl_dynshdrcnt++;
2647 		osp->os_flags |= FLG_OS_OUTREL;
2648 	}
2649 	return (1);
2650 }
2651 
2652 /*
2653  * Make .sunwmove section
2654  */
2655 uintptr_t
ld_make_sunwmove(Ofl_desc * ofl,int mv_nums)2656 ld_make_sunwmove(Ofl_desc *ofl, int mv_nums)
2657 {
2658 	Shdr		*shdr;
2659 	Elf_Data	*data;
2660 	Is_desc		*isec;
2661 	Aliste		idx;
2662 	Sym_desc	*sdp;
2663 	int 		cnt = 1;
2664 
2665 
2666 	if (new_section(ofl, SHT_SUNW_move, MSG_ORIG(MSG_SCN_SUNWMOVE),
2667 	    mv_nums, &isec, &shdr, &data) == S_ERROR)
2668 		return (S_ERROR);
2669 
2670 	if ((data->d_buf = libld_calloc(data->d_size, 1)) == NULL)
2671 		return (S_ERROR);
2672 
2673 	/*
2674 	 * Copy move entries
2675 	 */
2676 	for (APLIST_TRAVERSE(ofl->ofl_parsyms, idx, sdp)) {
2677 		Aliste		idx2;
2678 		Mv_desc		*mdp;
2679 
2680 		if (sdp->sd_flags & FLG_SY_PAREXPN)
2681 			continue;
2682 
2683 		for (ALIST_TRAVERSE(sdp->sd_move, idx2, mdp))
2684 			mdp->md_oidx = cnt++;
2685 	}
2686 
2687 	if ((ofl->ofl_osmove = ld_place_section(ofl, isec, NULL, 0, NULL)) ==
2688 	    (Os_desc *)S_ERROR)
2689 		return (S_ERROR);
2690 
2691 	return (1);
2692 }
2693 
2694 /*
2695  * Given a relocation descriptor that references a string table
2696  * input section, locate the string referenced and return a pointer
2697  * to it.
2698  */
2699 static const char *
strmerge_get_reloc_str(Ofl_desc * ofl,Rel_desc * rsp)2700 strmerge_get_reloc_str(Ofl_desc *ofl, Rel_desc *rsp)
2701 {
2702 	Sym_desc *sdp = rsp->rel_sym;
2703 	Xword	 str_off;
2704 
2705 	/*
2706 	 * In the case of an STT_SECTION symbol, the addend of the
2707 	 * relocation gives the offset into the string section. For
2708 	 * other symbol types, the symbol value is the offset.
2709 	 */
2710 
2711 	if (ELF_ST_TYPE(sdp->sd_sym->st_info) != STT_SECTION) {
2712 		str_off = sdp->sd_sym->st_value;
2713 	} else if ((rsp->rel_flags & FLG_REL_RELA) == FLG_REL_RELA) {
2714 		/*
2715 		 * For SHT_RELA, the addend value is found in the
2716 		 * rel_raddend field of the relocation.
2717 		 */
2718 		str_off = rsp->rel_raddend;
2719 	} else {	/* REL and STT_SECTION */
2720 		/*
2721 		 * For SHT_REL, the "addend" is not part of the relocation
2722 		 * record. Instead, it is found at the relocation target
2723 		 * address.
2724 		 */
2725 		uchar_t *addr = (uchar_t *)((uintptr_t)rsp->rel_roffset +
2726 		    (uintptr_t)rsp->rel_isdesc->is_indata->d_buf);
2727 
2728 		if (ld_reloc_targval_get(ofl, rsp, addr, &str_off) == 0)
2729 			return (0);
2730 	}
2731 
2732 	return (str_off + (char *)sdp->sd_isc->is_indata->d_buf);
2733 }
2734 
2735 /*
2736  * First pass over the relocation records for string table merging.
2737  * Build lists of relocations and symbols that will need modification,
2738  * and insert the strings they reference into the mstrtab string table.
2739  *
2740  * entry:
2741  *	ofl, osp - As passed to ld_make_strmerge().
2742  *	mstrtab - String table to receive input strings. This table
2743  *		must be in its first (initialization) pass and not
2744  *		yet cooked (st_getstrtab_sz() not yet called).
2745  *	rel_alpp - APlist to receive pointer to any relocation
2746  *		descriptors with STT_SECTION symbols that reference
2747  *		one of the input sections being merged.
2748  *	sym_alpp - APlist to receive pointer to any symbols that reference
2749  *		one of the input sections being merged.
2750  *	rcp - Pointer to cache of relocation descriptors to examine.
2751  *		Either &ofl->ofl_actrels (active relocations)
2752  *		or &ofl->ofl_outrels (output relocations).
2753  *
2754  * exit:
2755  *	On success, rel_alpp and sym_alpp are updated, and
2756  *	any strings in the mergeable input sections referenced by
2757  *	a relocation has been entered into mstrtab. True (1) is returned.
2758  *
2759  *	On failure, False (0) is returned.
2760  */
2761 static int
strmerge_pass1(Ofl_desc * ofl,Os_desc * osp,Str_tbl * mstrtab,APlist ** rel_alpp,APlist ** sym_alpp,Rel_cache * rcp)2762 strmerge_pass1(Ofl_desc *ofl, Os_desc *osp, Str_tbl *mstrtab,
2763     APlist **rel_alpp, APlist **sym_alpp, Rel_cache *rcp)
2764 {
2765 	Aliste		idx;
2766 	Rel_cachebuf	*rcbp;
2767 	Sym_desc	*sdp;
2768 	Sym_desc	*last_sdp = NULL;
2769 	Rel_desc	*rsp;
2770 	const char	*name;
2771 
2772 	REL_CACHE_TRAVERSE(rcp, idx, rcbp, rsp) {
2773 		sdp = rsp->rel_sym;
2774 		if ((sdp->sd_isc == NULL) || ((sdp->sd_isc->is_flags &
2775 		    (FLG_IS_DISCARD | FLG_IS_INSTRMRG)) != FLG_IS_INSTRMRG) ||
2776 		    (sdp->sd_isc->is_osdesc != osp))
2777 			continue;
2778 
2779 		/*
2780 		 * Remember symbol for use in the third pass. There is no
2781 		 * reason to save a given symbol more than once, so we take
2782 		 * advantage of the fact that relocations to a given symbol
2783 		 * tend to cluster in the list. If this is the same symbol
2784 		 * we saved last time, don't bother.
2785 		 */
2786 		if (last_sdp != sdp) {
2787 			if (aplist_append(sym_alpp, sdp, AL_CNT_STRMRGSYM) ==
2788 			    NULL)
2789 				return (0);
2790 			last_sdp = sdp;
2791 		}
2792 
2793 		/* Enter the string into our new string table */
2794 		name = strmerge_get_reloc_str(ofl, rsp);
2795 		if (st_insert(mstrtab, name) == -1)
2796 			return (0);
2797 
2798 		/*
2799 		 * If this is an STT_SECTION symbol, then the second pass
2800 		 * will need to modify this relocation, so hang on to it.
2801 		 */
2802 		if ((ELF_ST_TYPE(sdp->sd_sym->st_info) == STT_SECTION) &&
2803 		    (aplist_append(rel_alpp, rsp, AL_CNT_STRMRGREL) == NULL))
2804 			return (0);
2805 	}
2806 
2807 	return (1);
2808 }
2809 
2810 /*
2811  * If the output section has any SHF_MERGE|SHF_STRINGS input sections,
2812  * replace them with a single merged/compressed input section.
2813  *
2814  * entry:
2815  *	ofl - Output file descriptor
2816  *	osp - Output section descriptor
2817  *	rel_alpp, sym_alpp, - Address of 2 APlists, to be used
2818  *		for internal processing. On the initial call to
2819  *		ld_make_strmerge, these list pointers must be NULL.
2820  *		The caller is encouraged to pass the same lists back for
2821  *		successive calls to this function without freeing
2822  *		them in between calls. This causes a single pair of
2823  *		memory allocations to be reused multiple times.
2824  *
2825  * exit:
2826  *	If section merging is possible, it is done. If no errors are
2827  *	encountered, True (1) is returned. On error, S_ERROR.
2828  *
2829  *	The contents of rel_alpp and sym_alpp on exit are
2830  *	undefined. The caller can free them, or pass them back to a subsequent
2831  *	call to this routine, but should not examine their contents.
2832  */
2833 static uintptr_t
ld_make_strmerge(Ofl_desc * ofl,Os_desc * osp,APlist ** rel_alpp,APlist ** sym_alpp)2834 ld_make_strmerge(Ofl_desc *ofl, Os_desc *osp, APlist **rel_alpp,
2835     APlist **sym_alpp)
2836 {
2837 	Str_tbl		*mstrtab;	/* string table for string merge secs */
2838 	Is_desc		*mstrsec;	/* Generated string merge section */
2839 	Is_desc		*isp;
2840 	Shdr		*mstr_shdr;
2841 	Elf_Data	*mstr_data;
2842 	Sym_desc	*sdp;
2843 	Rel_desc	*rsp;
2844 	Aliste		idx;
2845 	size_t		data_size;
2846 	int		st_setstring_status;
2847 	size_t		stoff;
2848 
2849 	/* If string table compression is disabled, there's nothing to do */
2850 	if ((ofl->ofl_flags1 & FLG_OF1_NCSTTAB) != 0)
2851 		return (1);
2852 
2853 	/*
2854 	 * Pass over the mergeable input sections, and if they haven't
2855 	 * all been discarded, create a string table.
2856 	 */
2857 	mstrtab = NULL;
2858 	for (APLIST_TRAVERSE(osp->os_mstrisdescs, idx, isp)) {
2859 		if (isdesc_discarded(isp))
2860 			continue;
2861 
2862 		/*
2863 		 * Input sections of 0 size are dubiously valid since they do
2864 		 * not even contain the NUL string.  Ignore them.
2865 		 */
2866 		if (isp->is_shdr->sh_size == 0)
2867 			continue;
2868 
2869 		/*
2870 		 * We have at least one non-discarded section.
2871 		 * Create a string table descriptor.
2872 		 */
2873 		if ((mstrtab = st_new(FLG_STNEW_COMPRESS)) == NULL)
2874 			return (S_ERROR);
2875 		break;
2876 	}
2877 
2878 	/* If no string table was created, we have no mergeable sections */
2879 	if (mstrtab == NULL)
2880 		return (1);
2881 
2882 	/*
2883 	 * This routine has to make 3 passes:
2884 	 *
2885 	 *	1) Examine all relocations, insert strings from relocations
2886 	 *		to the mergeable input sections into the string table.
2887 	 *	2) Modify the relocation values to be correct for the
2888 	 *		new merged section.
2889 	 *	3) Modify the symbols used by the relocations to reference
2890 	 *		the new section.
2891 	 *
2892 	 * These passes cannot be combined:
2893 	 *	- The string table code works in two passes, and all
2894 	 *		strings have to be loaded in pass one before the
2895 	 *		offset of any strings can be determined.
2896 	 *	- Multiple relocations reference a single symbol, so the
2897 	 *		symbol cannot be modified until all relocations are
2898 	 *		fixed.
2899 	 *
2900 	 * The number of relocations related to section merging is usually
2901 	 * a mere fraction of the overall active and output relocation lists,
2902 	 * and the number of symbols is usually a fraction of the number
2903 	 * of related relocations. We therefore build APlists for the
2904 	 * relocations and symbols in the first pass, and then use those
2905 	 * lists to accelerate the operation of pass 2 and 3.
2906 	 *
2907 	 * Reinitialize the lists to a completely empty state.
2908 	 */
2909 	aplist_reset(*rel_alpp);
2910 	aplist_reset(*sym_alpp);
2911 
2912 	/*
2913 	 * Pass 1:
2914 	 *
2915 	 * Every relocation related to this output section (and the input
2916 	 * sections that make it up) is found in either the active, or the
2917 	 * output relocation list, depending on whether the relocation is to
2918 	 * be processed by this invocation of the linker, or inserted into the
2919 	 * output object.
2920 	 *
2921 	 * Build lists of relocations and symbols that will need modification,
2922 	 * and insert the strings they reference into the mstrtab string table.
2923 	 */
2924 	if (strmerge_pass1(ofl, osp, mstrtab, rel_alpp, sym_alpp,
2925 	    &ofl->ofl_actrels) == 0)
2926 		goto return_s_error;
2927 	if (strmerge_pass1(ofl, osp, mstrtab, rel_alpp, sym_alpp,
2928 	    &ofl->ofl_outrels) == 0)
2929 		goto return_s_error;
2930 
2931 	/*
2932 	 * Get the size of the new input section. Requesting the
2933 	 * string table size "cooks" the table, and finalizes its contents.
2934 	 */
2935 	data_size = st_getstrtab_sz(mstrtab);
2936 
2937 	/* Create a new input section to hold the merged strings */
2938 	if (new_section_from_template(ofl, isp, data_size,
2939 	    &mstrsec, &mstr_shdr, &mstr_data) == S_ERROR)
2940 		goto return_s_error;
2941 	mstrsec->is_flags |= FLG_IS_GNSTRMRG;
2942 
2943 	/*
2944 	 * Allocate a data buffer for the new input section.
2945 	 * Then, associate the buffer with the string table descriptor.
2946 	 */
2947 	if ((mstr_data->d_buf = libld_malloc(data_size)) == NULL)
2948 		goto return_s_error;
2949 	if (st_setstrbuf(mstrtab, mstr_data->d_buf, data_size) == -1)
2950 		goto return_s_error;
2951 
2952 	/* Add the new section to the output image */
2953 	if (ld_place_section(ofl, mstrsec, NULL, osp->os_identndx, NULL) ==
2954 	    (Os_desc *)S_ERROR)
2955 		goto return_s_error;
2956 
2957 	/*
2958 	 * Pass 2:
2959 	 *
2960 	 * Revisit the relocation descriptors with STT_SECTION symbols
2961 	 * that were saved by the first pass. Update each relocation
2962 	 * record so that the offset it contains is for the new section
2963 	 * instead of the original.
2964 	 */
2965 	for (APLIST_TRAVERSE(*rel_alpp, idx, rsp)) {
2966 		const char	*name;
2967 
2968 		/* Put the string into the merged string table */
2969 		name = strmerge_get_reloc_str(ofl, rsp);
2970 		st_setstring_status = st_setstring(mstrtab, name, &stoff);
2971 		if (st_setstring_status == -1) {
2972 			/*
2973 			 * A failure to insert at this point means that
2974 			 * something is corrupt. This isn't a resource issue.
2975 			 */
2976 			assert(st_setstring_status != -1);
2977 			goto return_s_error;
2978 		}
2979 
2980 		/*
2981 		 * Alter the relocation to access the string at the
2982 		 * new offset in our new string table.
2983 		 *
2984 		 * For SHT_RELA platforms, it suffices to simply
2985 		 * update the rel_raddend field of the relocation.
2986 		 *
2987 		 * For SHT_REL platforms, the new "addend" value
2988 		 * needs to be written at the address being relocated.
2989 		 * However, we can't alter the input sections which
2990 		 * are mapped readonly, and the output image has not
2991 		 * been created yet. So, we defer this operation,
2992 		 * using the rel_raddend field of the relocation
2993 		 * which is normally 0 on a REL platform, to pass the
2994 		 * new "addend" value to ld_perform_outreloc() or
2995 		 * ld_do_activerelocs(). The FLG_REL_NADDEND flag
2996 		 * tells them that this is the case.
2997 		 */
2998 		if ((rsp->rel_flags & FLG_REL_RELA) == 0)   /* REL */
2999 			rsp->rel_flags |= FLG_REL_NADDEND;
3000 		rsp->rel_raddend = (Sxword)stoff;
3001 
3002 		/*
3003 		 * Generate a symbol name string for STT_SECTION symbols
3004 		 * that might reference our merged section. This shows up
3005 		 * in debug output and helps show how the relocation has
3006 		 * changed from its original input section to our merged one.
3007 		 */
3008 		if (ld_stt_section_sym_name(mstrsec) == NULL)
3009 			goto return_s_error;
3010 	}
3011 
3012 	/*
3013 	 * Pass 3:
3014 	 *
3015 	 * Modify the symbols referenced by the relocation descriptors
3016 	 * so that they reference the new input section containing the
3017 	 * merged strings instead of the original input sections.
3018 	 */
3019 	for (APLIST_TRAVERSE(*sym_alpp, idx, sdp)) {
3020 		/*
3021 		 * If we've already processed this symbol, don't do it
3022 		 * twice. strmerge_pass1() uses a heuristic (relocations to
3023 		 * the same symbol clump together) to avoid inserting a
3024 		 * given symbol more than once, but repeat symbols in
3025 		 * the list can occur.
3026 		 */
3027 		if ((sdp->sd_isc->is_flags & FLG_IS_INSTRMRG) == 0)
3028 			continue;
3029 
3030 		if (ELF_ST_TYPE(sdp->sd_sym->st_info) != STT_SECTION) {
3031 			/*
3032 			 * This is not an STT_SECTION symbol, so its
3033 			 * value is the offset of the string within the
3034 			 * input section. Update the address to reflect
3035 			 * the address in our new merged section.
3036 			 */
3037 			const char *name = sdp->sd_sym->st_value +
3038 			    (char *)sdp->sd_isc->is_indata->d_buf;
3039 
3040 			st_setstring_status =
3041 			    st_setstring(mstrtab, name, &stoff);
3042 			if (st_setstring_status == -1) {
3043 				/*
3044 				 * A failure to insert at this point means
3045 				 * something is corrupt. This isn't a
3046 				 * resource issue.
3047 				 */
3048 				assert(st_setstring_status != -1);
3049 				goto return_s_error;
3050 			}
3051 
3052 			if (ld_sym_copy(sdp) == S_ERROR)
3053 				goto return_s_error;
3054 			sdp->sd_sym->st_value = (Word)stoff;
3055 		}
3056 
3057 		/* Redirect the symbol to our new merged section */
3058 		sdp->sd_isc = mstrsec;
3059 	}
3060 
3061 	/*
3062 	 * There are no references left to the original input string sections.
3063 	 * Mark them as discarded so they don't go into the output image.
3064 	 * At the same time, add up the sizes of the replaced sections.
3065 	 */
3066 	data_size = 0;
3067 	for (APLIST_TRAVERSE(osp->os_mstrisdescs, idx, isp)) {
3068 		if (isp->is_flags & (FLG_IS_DISCARD | FLG_IS_GNSTRMRG))
3069 			continue;
3070 
3071 		data_size += isp->is_indata->d_size;
3072 
3073 		isp->is_flags |= FLG_IS_DISCARD;
3074 		DBG_CALL(Dbg_sec_discarded(ofl->ofl_lml, isp, mstrsec));
3075 	}
3076 
3077 	/* Report how much space we saved in the output section */
3078 	DBG_CALL(Dbg_sec_genstr_compress(ofl->ofl_lml, osp->os_name, data_size,
3079 	    mstr_data->d_size));
3080 
3081 	st_destroy(mstrtab);
3082 	return (1);
3083 
3084 return_s_error:
3085 	st_destroy(mstrtab);
3086 	return (S_ERROR);
3087 }
3088 
3089 /*
3090  * Update a data buffers size.  A number of sections have to be created, and
3091  * the sections header contributes to the size of the eventual section.  Thus,
3092  * a section may be created, and once all associated sections have been created,
3093  * we return to establish the required section size.
3094  */
3095 inline static void
update_data_size(Os_desc * osp,ulong_t cnt)3096 update_data_size(Os_desc *osp, ulong_t cnt)
3097 {
3098 	Is_desc		*isec = ld_os_first_isdesc(osp);
3099 	Elf_Data	*data = isec->is_indata;
3100 	Shdr		*shdr = osp->os_shdr;
3101 	size_t		size = cnt * shdr->sh_entsize;
3102 
3103 	shdr->sh_size = (Xword)size;
3104 	data->d_size = size;
3105 }
3106 
3107 /*
3108  * The following sections are built after all input file processing and symbol
3109  * validation has been carried out.  The order is important (because the
3110  * addition of a section adds a new symbol there is a chicken and egg problem
3111  * of maintaining the appropriate counts).  By maintaining a known order the
3112  * individual routines can compensate for later, known, additions.
3113  */
3114 uintptr_t
ld_make_sections(Ofl_desc * ofl)3115 ld_make_sections(Ofl_desc *ofl)
3116 {
3117 	ofl_flag_t	flags = ofl->ofl_flags;
3118 	Sg_desc		*sgp;
3119 
3120 	/*
3121 	 * Generate any special sections.
3122 	 */
3123 	if (flags & FLG_OF_ADDVERS)
3124 		if (make_comment(ofl) == S_ERROR)
3125 			return (S_ERROR);
3126 
3127 	if (make_interp(ofl) == S_ERROR)
3128 		return (S_ERROR);
3129 
3130 	/*
3131 	 * Create a capabilities section if required.
3132 	 */
3133 	if (make_cap(ofl, SHT_SUNW_cap, MSG_ORIG(MSG_SCN_SUNWCAP),
3134 	    ld_targ.t_id.id_cap) == S_ERROR)
3135 		return (S_ERROR);
3136 
3137 	/*
3138 	 * Create any init/fini array sections.
3139 	 */
3140 	if (make_array(ofl, SHT_INIT_ARRAY, MSG_ORIG(MSG_SCN_INITARRAY),
3141 	    ofl->ofl_initarray) == S_ERROR)
3142 		return (S_ERROR);
3143 
3144 	if (make_array(ofl, SHT_FINI_ARRAY, MSG_ORIG(MSG_SCN_FINIARRAY),
3145 	    ofl->ofl_finiarray) == S_ERROR)
3146 		return (S_ERROR);
3147 
3148 	if (make_array(ofl, SHT_PREINIT_ARRAY, MSG_ORIG(MSG_SCN_PREINITARRAY),
3149 	    ofl->ofl_preiarray) == S_ERROR)
3150 		return (S_ERROR);
3151 
3152 	/*
3153 	 * Make the .plt section.  This occurs after any other relocation
3154 	 * sections are generated (see reloc_init()) to ensure that the
3155 	 * associated relocation section is after all the other relocation
3156 	 * sections.
3157 	 */
3158 	if ((ofl->ofl_pltcnt) || (ofl->ofl_pltpad))
3159 		if (make_plt(ofl) == S_ERROR)
3160 			return (S_ERROR);
3161 
3162 	/*
3163 	 * Determine whether any sections or files are not referenced.  Under
3164 	 * -Dunused a diagnostic for any unused components is generated, under
3165 	 * -zignore the component is removed from the final output.
3166 	 */
3167 	if (DBG_ENABLED || (ofl->ofl_flags1 & FLG_OF1_IGNPRC)) {
3168 		if (ignore_section_processing(ofl) == S_ERROR)
3169 			return (S_ERROR);
3170 	}
3171 
3172 	/*
3173 	 * If we have detected a situation in which previously placed
3174 	 * output sections may have been discarded, perform the necessary
3175 	 * readjustment.
3176 	 */
3177 	if (ofl->ofl_flags & FLG_OF_ADJOSCNT)
3178 		adjust_os_count(ofl);
3179 
3180 	/*
3181 	 * Do any of the output sections contain input sections that
3182 	 * are candidates for string table merging? For each such case,
3183 	 * we create a replacement section, insert it, and discard the
3184 	 * originals.
3185 	 *
3186 	 * rel_alpp and sym_alpp are used by ld_make_strmerge()
3187 	 * for its internal processing. We are responsible for the
3188 	 * initialization and cleanup, and ld_make_strmerge() handles the rest.
3189 	 * This allows us to reuse a single pair of memory buffers, allocated
3190 	 * for this processing, for all the output sections.
3191 	 */
3192 	if ((ofl->ofl_flags1 & FLG_OF1_NCSTTAB) == 0) {
3193 		int	error_seen = 0;
3194 		APlist	*rel_alpp = NULL;
3195 		APlist	*sym_alpp = NULL;
3196 		Aliste	idx1;
3197 
3198 		for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
3199 			Os_desc	*osp;
3200 			Aliste	idx2;
3201 
3202 			for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp))
3203 				if ((osp->os_mstrisdescs != NULL) &&
3204 				    (ld_make_strmerge(ofl, osp,
3205 				    &rel_alpp, &sym_alpp) ==
3206 				    S_ERROR)) {
3207 					error_seen = 1;
3208 					break;
3209 				}
3210 		}
3211 		if (rel_alpp != NULL)
3212 			libld_free(rel_alpp);
3213 		if (sym_alpp != NULL)
3214 			libld_free(sym_alpp);
3215 		if (error_seen != 0)
3216 			return (S_ERROR);
3217 	}
3218 
3219 	/*
3220 	 * Add any necessary versioning information.
3221 	 */
3222 	if (!(flags & FLG_OF_NOVERSEC)) {
3223 		if ((flags & FLG_OF_VERNEED) &&
3224 		    (make_verneed(ofl) == S_ERROR))
3225 			return (S_ERROR);
3226 		if ((flags & FLG_OF_VERDEF) &&
3227 		    (make_verdef(ofl) == S_ERROR))
3228 			return (S_ERROR);
3229 		if ((flags & (FLG_OF_VERNEED | FLG_OF_VERDEF)) &&
3230 		    ((ofl->ofl_osversym = make_sym_sec(ofl,
3231 		    MSG_ORIG(MSG_SCN_SUNWVERSYM), SHT_SUNW_versym,
3232 		    ld_targ.t_id.id_version)) == (Os_desc*)S_ERROR))
3233 			return (S_ERROR);
3234 	}
3235 
3236 	/*
3237 	 * Create a syminfo section if necessary.
3238 	 */
3239 	if (flags & FLG_OF_SYMINFO) {
3240 		if ((ofl->ofl_ossyminfo = make_sym_sec(ofl,
3241 		    MSG_ORIG(MSG_SCN_SUNWSYMINFO), SHT_SUNW_syminfo,
3242 		    ld_targ.t_id.id_syminfo)) == (Os_desc *)S_ERROR)
3243 			return (S_ERROR);
3244 	}
3245 
3246 	if (flags & FLG_OF_COMREL) {
3247 		/*
3248 		 * If -zcombreloc is enabled then all relocations (except for
3249 		 * the PLT's) are coalesced into a single relocation section.
3250 		 */
3251 		if (ofl->ofl_reloccnt) {
3252 			if (make_reloc(ofl, NULL) == S_ERROR)
3253 				return (S_ERROR);
3254 		}
3255 	} else {
3256 		Aliste	idx1;
3257 
3258 		/*
3259 		 * Create the required output relocation sections.  Note, new
3260 		 * sections may be added to the section list that is being
3261 		 * traversed.  These insertions can move the elements of the
3262 		 * Alist such that a section descriptor is re-read.  Recursion
3263 		 * is prevented by maintaining a previous section pointer and
3264 		 * insuring that this pointer isn't re-examined.
3265 		 */
3266 		for (APLIST_TRAVERSE(ofl->ofl_segs, idx1, sgp)) {
3267 			Os_desc	*osp, *posp = 0;
3268 			Aliste	idx2;
3269 
3270 			for (APLIST_TRAVERSE(sgp->sg_osdescs, idx2, osp)) {
3271 				if ((osp != posp) && osp->os_szoutrels &&
3272 				    (osp != ofl->ofl_osplt)) {
3273 					if (make_reloc(ofl, osp) == S_ERROR)
3274 						return (S_ERROR);
3275 				}
3276 				posp = osp;
3277 			}
3278 		}
3279 
3280 		/*
3281 		 * If we're not building a combined relocation section, then
3282 		 * build a .rel[a] section as required.
3283 		 */
3284 		if (ofl->ofl_relocrelsz) {
3285 			if (make_reloc(ofl, NULL) == S_ERROR)
3286 				return (S_ERROR);
3287 		}
3288 	}
3289 
3290 	/*
3291 	 * The PLT relocations are always in their own section, and we try to
3292 	 * keep them at the end of the PLT table.  We do this to keep the hot
3293 	 * "data" PLT's at the head of the table nearer the .dynsym & .hash.
3294 	 */
3295 	if (ofl->ofl_osplt && ofl->ofl_relocpltsz) {
3296 		if (make_reloc(ofl, ofl->ofl_osplt) == S_ERROR)
3297 			return (S_ERROR);
3298 	}
3299 
3300 	/*
3301 	 * Finally build the symbol and section header sections.
3302 	 */
3303 	if (flags & FLG_OF_DYNAMIC) {
3304 		if (make_dynamic(ofl) == S_ERROR)
3305 			return (S_ERROR);
3306 
3307 		/*
3308 		 * A number of sections aren't necessary within a relocatable
3309 		 * object, even if -dy has been used.
3310 		 */
3311 		if (!(flags & FLG_OF_RELOBJ)) {
3312 			if (make_hash(ofl) == S_ERROR)
3313 				return (S_ERROR);
3314 			if (make_dynstr(ofl) == S_ERROR)
3315 				return (S_ERROR);
3316 			if (make_dynsym(ofl) == S_ERROR)
3317 				return (S_ERROR);
3318 			if (ld_unwind_make_hdr(ofl) == S_ERROR)
3319 				return (S_ERROR);
3320 			if (make_dynsort(ofl) == S_ERROR)
3321 				return (S_ERROR);
3322 		}
3323 	}
3324 
3325 	if (!(flags & FLG_OF_STRIP) || (flags & FLG_OF_RELOBJ) ||
3326 	    ((flags & FLG_OF_STATIC) && ofl->ofl_osversym)) {
3327 		/*
3328 		 * Do we need to make a SHT_SYMTAB_SHNDX section
3329 		 * for the dynsym.  If so - do it now.
3330 		 */
3331 		if (ofl->ofl_osdynsym &&
3332 		    ((ofl->ofl_shdrcnt + 3) >= SHN_LORESERVE)) {
3333 			if (make_dynsym_shndx(ofl) == S_ERROR)
3334 				return (S_ERROR);
3335 		}
3336 
3337 		if (make_strtab(ofl) == S_ERROR)
3338 			return (S_ERROR);
3339 		if (make_symtab(ofl) == S_ERROR)
3340 			return (S_ERROR);
3341 	} else {
3342 		/*
3343 		 * Do we need to make a SHT_SYMTAB_SHNDX section
3344 		 * for the dynsym.  If so - do it now.
3345 		 */
3346 		if (ofl->ofl_osdynsym &&
3347 		    ((ofl->ofl_shdrcnt + 1) >= SHN_LORESERVE)) {
3348 			if (make_dynsym_shndx(ofl) == S_ERROR)
3349 				return (S_ERROR);
3350 		}
3351 	}
3352 
3353 	if (make_shstrtab(ofl) == S_ERROR)
3354 		return (S_ERROR);
3355 
3356 	/*
3357 	 * Now that we've created all output sections, adjust the size of the
3358 	 * SHT_SUNW_versym and SHT_SUNW_syminfo section, which are dependent on
3359 	 * the associated symbol table sizes.
3360 	 */
3361 	if (ofl->ofl_osversym || ofl->ofl_ossyminfo) {
3362 		ulong_t		cnt;
3363 		Is_desc		*isp;
3364 		Os_desc		*osp;
3365 
3366 		if (OFL_IS_STATIC_OBJ(ofl))
3367 			osp = ofl->ofl_ossymtab;
3368 		else
3369 			osp = ofl->ofl_osdynsym;
3370 
3371 		isp = ld_os_first_isdesc(osp);
3372 		cnt = (isp->is_shdr->sh_size / isp->is_shdr->sh_entsize);
3373 
3374 		if (ofl->ofl_osversym)
3375 			update_data_size(ofl->ofl_osversym, cnt);
3376 
3377 		if (ofl->ofl_ossyminfo)
3378 			update_data_size(ofl->ofl_ossyminfo, cnt);
3379 	}
3380 
3381 	/*
3382 	 * Now that we've created all output sections, adjust the size of the
3383 	 * SHT_SUNW_capinfo, which is dependent on the associated symbol table
3384 	 * size.
3385 	 */
3386 	if (ofl->ofl_oscapinfo) {
3387 		ulong_t	cnt;
3388 
3389 		/*
3390 		 * Symbol capabilities symbols are placed directly after the
3391 		 * STT_FILE symbol, section symbols, and any register symbols.
3392 		 * Effectively these are the first of any series of demoted
3393 		 * (scoped) symbols.
3394 		 */
3395 		if (OFL_IS_STATIC_OBJ(ofl))
3396 			cnt = SYMTAB_ALL_CNT(ofl);
3397 		else
3398 			cnt = DYNSYM_ALL_CNT(ofl);
3399 
3400 		update_data_size(ofl->ofl_oscapinfo, cnt);
3401 	}
3402 	return (1);
3403 }
3404 
3405 /*
3406  * Build an additional data section - used to back OBJT symbol definitions
3407  * added with a mapfile.
3408  */
3409 Is_desc *
ld_make_data(Ofl_desc * ofl,size_t size)3410 ld_make_data(Ofl_desc *ofl, size_t size)
3411 {
3412 	Shdr		*shdr;
3413 	Elf_Data	*data;
3414 	Is_desc		*isec;
3415 
3416 	if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_DATA), 0,
3417 	    &isec, &shdr, &data) == S_ERROR)
3418 		return ((Is_desc *)S_ERROR);
3419 
3420 	data->d_size = size;
3421 	shdr->sh_size = (Xword)size;
3422 	shdr->sh_flags |= SHF_WRITE;
3423 
3424 	if (aplist_append(&ofl->ofl_mapdata, isec, AL_CNT_OFL_MAPSECS) == NULL)
3425 		return ((Is_desc *)S_ERROR);
3426 
3427 	return (isec);
3428 }
3429 
3430 /*
3431  * Build an additional text section - used to back FUNC symbol definitions
3432  * added with a mapfile.
3433  */
3434 Is_desc *
ld_make_text(Ofl_desc * ofl,size_t size)3435 ld_make_text(Ofl_desc *ofl, size_t size)
3436 {
3437 	Shdr		*shdr;
3438 	Elf_Data	*data;
3439 	Is_desc		*isec;
3440 
3441 	/*
3442 	 * Insure the size is sufficient to contain the minimum return
3443 	 * instruction.
3444 	 */
3445 	if (size < ld_targ.t_nf.nf_size)
3446 		size = ld_targ.t_nf.nf_size;
3447 
3448 	if (new_section(ofl, SHT_PROGBITS, MSG_ORIG(MSG_SCN_TEXT), 0,
3449 	    &isec, &shdr, &data) == S_ERROR)
3450 		return ((Is_desc *)S_ERROR);
3451 
3452 	data->d_size = size;
3453 	shdr->sh_size = (Xword)size;
3454 	shdr->sh_flags |= SHF_EXECINSTR;
3455 
3456 	/*
3457 	 * Fill the buffer with the appropriate return instruction.
3458 	 * Note that there is no need to swap bytes on a non-native,
3459 	 * link, as the data being copied is given in bytes.
3460 	 */
3461 	if ((data->d_buf = libld_calloc(size, 1)) == NULL)
3462 		return ((Is_desc *)S_ERROR);
3463 	(void) memcpy(data->d_buf, ld_targ.t_nf.nf_template,
3464 	    ld_targ.t_nf.nf_size);
3465 
3466 	/*
3467 	 * If size was larger than required, and the target supplies
3468 	 * a fill function, use it to fill the balance. If there is no
3469 	 * fill function, we accept the 0-fill supplied by libld_calloc().
3470 	 */
3471 	if ((ld_targ.t_ff.ff_execfill != NULL) && (size > ld_targ.t_nf.nf_size))
3472 		ld_targ.t_ff.ff_execfill(data->d_buf, ld_targ.t_nf.nf_size,
3473 		    size - ld_targ.t_nf.nf_size);
3474 
3475 	if (aplist_append(&ofl->ofl_maptext, isec, AL_CNT_OFL_MAPSECS) == NULL)
3476 		return ((Is_desc *)S_ERROR);
3477 
3478 	return (isec);
3479 }
3480 
3481 void
ld_comdat_validate(Ofl_desc * ofl,Ifl_desc * ifl)3482 ld_comdat_validate(Ofl_desc *ofl, Ifl_desc *ifl)
3483 {
3484 	int i;
3485 
3486 	for (i = 0; i < ifl->ifl_shnum; i++) {
3487 		Is_desc *isp = ifl->ifl_isdesc[i];
3488 		int types = 0;
3489 		char buf[1024] = "";
3490 		Group_desc *gr = NULL;
3491 
3492 		if ((isp == NULL) || (isp->is_flags & FLG_IS_COMDAT) == 0)
3493 			continue;
3494 
3495 		if (isp->is_shdr->sh_type == SHT_SUNW_COMDAT) {
3496 			types++;
3497 			(void) strlcpy(buf, MSG_ORIG(MSG_STR_SUNW_COMDAT),
3498 			    sizeof (buf));
3499 		}
3500 
3501 		if (strncmp(MSG_ORIG(MSG_SCN_GNU_LINKONCE), isp->is_name,
3502 		    MSG_SCN_GNU_LINKONCE_SIZE) == 0) {
3503 			types++;
3504 			if (types > 1)
3505 				(void) strlcat(buf, ", ", sizeof (buf));
3506 			(void) strlcat(buf, MSG_ORIG(MSG_SCN_GNU_LINKONCE),
3507 			    sizeof (buf));
3508 		}
3509 
3510 		if ((isp->is_shdr->sh_flags & SHF_GROUP) &&
3511 		    ((gr = ld_get_group(ofl, isp)) != NULL) &&
3512 		    (gr->gd_data[0] & GRP_COMDAT)) {
3513 			types++;
3514 			if (types > 1)
3515 				(void) strlcat(buf, ", ", sizeof (buf));
3516 			(void) strlcat(buf, MSG_ORIG(MSG_STR_GROUP),
3517 			    sizeof (buf));
3518 		}
3519 
3520 		if (types > 1)
3521 			ld_eprintf(ofl, ERR_FATAL,
3522 			    MSG_INTL(MSG_SCN_MULTICOMDAT), ifl->ifl_name,
3523 			    EC_WORD(isp->is_scnndx), isp->is_name, buf);
3524 	}
3525 }
3526