17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
55aefb655Srie  * Common Development and Distribution License (the "License").
65aefb655Srie  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
215aefb655Srie 
227c478bd9Sstevel@tonic-gate /*
231007fd6fSAli Bahrami  * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate #include	<string.h>
275aefb655Srie #include	<debug.h>
287c478bd9Sstevel@tonic-gate #include	"msg.h"
297c478bd9Sstevel@tonic-gate #include	"_libld.h"
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate /*
3257ef7aa9SRod Evans  * Scan all partially initialized symbols to determine what output Move sections
3357ef7aa9SRod Evans  * or partially expanded data section, must be created.
347c478bd9Sstevel@tonic-gate  */
357c478bd9Sstevel@tonic-gate static uintptr_t
make_mvsections(Ofl_desc * ofl)367c478bd9Sstevel@tonic-gate make_mvsections(Ofl_desc *ofl)
377c478bd9Sstevel@tonic-gate {
3857ef7aa9SRod Evans 	Aliste		idx;
3957ef7aa9SRod Evans 	Sym_desc	*sdp;
40*fb12490aSRichard Lowe 	Word		mv_nums = 0;
4135450702SAli Bahrami 	Xword		align_parexpn = 0;	/* for -z nopartial .data sec */
4257ef7aa9SRod Evans 	size_t		size_parexpn = 0;	/* size of parexpn section */
437c478bd9Sstevel@tonic-gate 
447c478bd9Sstevel@tonic-gate 	/*
457c478bd9Sstevel@tonic-gate 	 * Compute the size of the output move section
467c478bd9Sstevel@tonic-gate 	 */
4757ef7aa9SRod Evans 	for (APLIST_TRAVERSE(ofl->ofl_parsyms, idx, sdp)) {
4857ef7aa9SRod Evans 		if (sdp->sd_flags & FLG_SY_PAREXPN) {
4957ef7aa9SRod Evans 			Sym	*sym = sdp->sd_sym;
5057ef7aa9SRod Evans 			Xword	align_val;
5157ef7aa9SRod Evans 
5257ef7aa9SRod Evans 			if (sym->st_shndx == SHN_COMMON)
5357ef7aa9SRod Evans 				align_val = sym->st_value;
5457ef7aa9SRod Evans 			else
5557ef7aa9SRod Evans 				align_val = 8;
5657ef7aa9SRod Evans 
577c478bd9Sstevel@tonic-gate 			/*
5857ef7aa9SRod Evans 			 * This global symbol is redirected to the special
5935450702SAli Bahrami 			 * partial initialization .data section.
607c478bd9Sstevel@tonic-gate 			 */
6135450702SAli Bahrami 			size_parexpn = (size_t)S_ROUND(size_parexpn,
6260758829Srie 			    sym->st_value) + sym->st_size;
6335450702SAli Bahrami 			if (align_val > align_parexpn)
6435450702SAli Bahrami 				align_parexpn = align_val;
657c478bd9Sstevel@tonic-gate 
667c478bd9Sstevel@tonic-gate 		} else {
6757ef7aa9SRod Evans 			mv_nums += alist_nitems(sdp->sd_move);
687c478bd9Sstevel@tonic-gate 		}
697c478bd9Sstevel@tonic-gate 	}
707c478bd9Sstevel@tonic-gate 
7157ef7aa9SRod Evans 	/*
7257ef7aa9SRod Evans 	 * Generate a new Move section.
7357ef7aa9SRod Evans 	 */
7457ef7aa9SRod Evans 	if (mv_nums && (ld_make_sunwmove(ofl, mv_nums) == S_ERROR))
7557ef7aa9SRod Evans 		return (S_ERROR);
767c478bd9Sstevel@tonic-gate 
777c478bd9Sstevel@tonic-gate 	/*
787c478bd9Sstevel@tonic-gate 	 * Add empty area for partially initialized symbols.
797c478bd9Sstevel@tonic-gate 	 *
8035450702SAli Bahrami 	 * A special .data section is created when the '-z nopartial'
8135450702SAli Bahrami 	 * option is in effect in order to receive the expanded data.
827c478bd9Sstevel@tonic-gate 	 */
8335450702SAli Bahrami 	if (size_parexpn) {
847c478bd9Sstevel@tonic-gate 		/* LINTED */
8535450702SAli Bahrami 		if (ld_make_parexpn_data(ofl, size_parexpn,
8635450702SAli Bahrami 		    align_parexpn) == S_ERROR)
877c478bd9Sstevel@tonic-gate 			return (S_ERROR);
887c478bd9Sstevel@tonic-gate 	}
897c478bd9Sstevel@tonic-gate 	return (1);
907c478bd9Sstevel@tonic-gate }
917c478bd9Sstevel@tonic-gate 
927c478bd9Sstevel@tonic-gate /*
9357ef7aa9SRod Evans  * Assign move descriptors with the associated target symbol.
947c478bd9Sstevel@tonic-gate  */
957c478bd9Sstevel@tonic-gate static uintptr_t
append_move_desc(Ofl_desc * ofl,Sym_desc * sdp,Move * mvp,Is_desc * isp)9657ef7aa9SRod Evans append_move_desc(Ofl_desc *ofl, Sym_desc *sdp, Move *mvp, Is_desc *isp)
977c478bd9Sstevel@tonic-gate {
98*fb12490aSRichard Lowe 	int	i, cnt = mvp->m_repeat;
997c478bd9Sstevel@tonic-gate 
1007c478bd9Sstevel@tonic-gate 	for (i = 0; i < cnt; i++) {
10157ef7aa9SRod Evans 		Aliste		idx;
10257ef7aa9SRod Evans 		Mv_desc		*omdp, nmd;
10357ef7aa9SRod Evans 
1047c478bd9Sstevel@tonic-gate 		/* LINTED */
10557ef7aa9SRod Evans 		nmd.md_len = ELF_M_SIZE(mvp->m_info);
10657ef7aa9SRod Evans 		nmd.md_start = mvp->m_poffset + i *
10757ef7aa9SRod Evans 		    ((mvp->m_stride + 1) * nmd.md_len);
10857ef7aa9SRod Evans 		nmd.md_move = mvp;
1097c478bd9Sstevel@tonic-gate 
1107c478bd9Sstevel@tonic-gate 		/*
11157ef7aa9SRod Evans 		 * Verify that this move descriptor doesn't overlap any existing
11257ef7aa9SRod Evans 		 * move descriptors.
1137c478bd9Sstevel@tonic-gate 		 */
11457ef7aa9SRod Evans 		for (ALIST_TRAVERSE(sdp->sd_move, idx, omdp)) {
11557ef7aa9SRod Evans 			Mv_desc	*smdp, *lmdp;
11657ef7aa9SRod Evans 
11757ef7aa9SRod Evans 			if (nmd.md_start > omdp->md_start) {
11857ef7aa9SRod Evans 				smdp = omdp;
11957ef7aa9SRod Evans 				lmdp = &nmd;
12057ef7aa9SRod Evans 			} else {
12157ef7aa9SRod Evans 				smdp = &nmd;
12257ef7aa9SRod Evans 				lmdp = omdp;
12357ef7aa9SRod Evans 			}
1247c478bd9Sstevel@tonic-gate 
1257c478bd9Sstevel@tonic-gate 			/*
12657ef7aa9SRod Evans 			 * If this move entry is exactly the same as that of
12757ef7aa9SRod Evans 			 * a symbol that has overridden this symbol (for example
12857ef7aa9SRod Evans 			 * should two identical COMMON definitions be associated
12957ef7aa9SRod Evans 			 * with the same move data), simply ignore this move
13057ef7aa9SRod Evans 			 * element.
1317c478bd9Sstevel@tonic-gate 			 */
13257ef7aa9SRod Evans 			if ((nmd.md_start == omdp->md_start) &&
13357ef7aa9SRod Evans 			    ((nmd.md_len == smdp->md_len) &&
13457ef7aa9SRod Evans 			    sdp->sd_file != isp->is_file))
13557ef7aa9SRod Evans 				continue;
1367c478bd9Sstevel@tonic-gate 
13757ef7aa9SRod Evans 			if ((nmd.md_start != omdp->md_start) &&
13857ef7aa9SRod Evans 			    ((smdp->md_start + smdp->md_len) <= lmdp->md_start))
13957ef7aa9SRod Evans 				continue;
1407c478bd9Sstevel@tonic-gate 
1411007fd6fSAli Bahrami 			ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_MOVE_OVERLAP),
1421007fd6fSAli Bahrami 			    sdp->sd_file->ifl_name, EC_WORD(isp->is_scnndx),
14357ef7aa9SRod Evans 			    isp->is_name, demangle(sdp->sd_name),
14457ef7aa9SRod Evans 			    EC_XWORD(nmd.md_start), EC_XWORD(nmd.md_len),
14557ef7aa9SRod Evans 			    EC_XWORD(omdp->md_start), EC_XWORD(omdp->md_len));
1467c478bd9Sstevel@tonic-gate 
14757ef7aa9SRod Evans 			/*
14857ef7aa9SRod Evans 			 * Indicate that an error has occurred, so that
14957ef7aa9SRod Evans 			 * processing can be terminated once all move errors
15057ef7aa9SRod Evans 			 * are flushed out.
15157ef7aa9SRod Evans 			 */
152635216b6SRod Evans 			sdp->sd_flags |= FLG_SY_OVERLAP;
15357ef7aa9SRod Evans 			return (1);
1547c478bd9Sstevel@tonic-gate 		}
1557c478bd9Sstevel@tonic-gate 
15657ef7aa9SRod Evans 		if (alist_append(&sdp->sd_move, &nmd, sizeof (Mv_desc),
15757ef7aa9SRod Evans 		    AL_CNT_SDP_MOVE) == NULL)
15857ef7aa9SRod Evans 			return (S_ERROR);
1597c478bd9Sstevel@tonic-gate 	}
1607c478bd9Sstevel@tonic-gate 	return (1);
1617c478bd9Sstevel@tonic-gate }
1627c478bd9Sstevel@tonic-gate 
1637c478bd9Sstevel@tonic-gate /*
16457ef7aa9SRod Evans  * Validate a SHT_SUNW_move section.  These are only processed from input
16557ef7aa9SRod Evans  * relocatable objects.  The move section entries are validated and any data
16657ef7aa9SRod Evans  * structures required for later processing are created.
1677c478bd9Sstevel@tonic-gate  */
1687c478bd9Sstevel@tonic-gate uintptr_t
ld_process_move(Ofl_desc * ofl)16957ef7aa9SRod Evans ld_process_move(Ofl_desc *ofl)
1707c478bd9Sstevel@tonic-gate {
17157ef7aa9SRod Evans 	Aliste		idx;
17257ef7aa9SRod Evans 	Is_desc		*isp;
173*fb12490aSRichard Lowe 	int		errcnt = 0;
1747c478bd9Sstevel@tonic-gate 
17557ef7aa9SRod Evans 	for (APLIST_TRAVERSE(ofl->ofl_ismove, idx, isp)) {
17657ef7aa9SRod Evans 		Ifl_desc	*ifile = isp->is_file;
17757ef7aa9SRod Evans 		Move		*mvp;
1787c478bd9Sstevel@tonic-gate 		Xword		i, num;
1797c478bd9Sstevel@tonic-gate 
1805aefb655Srie 		DBG_CALL(Dbg_move_input(ofl->ofl_lml, ifile->ifl_name));
18157ef7aa9SRod Evans 		mvp = (Move *)isp->is_indata->d_buf;
1827c478bd9Sstevel@tonic-gate 
1837c478bd9Sstevel@tonic-gate 		if (isp->is_shdr->sh_entsize == 0) {
1841007fd6fSAli Bahrami 			ld_eprintf(ofl, ERR_FATAL,
1855aefb655Srie 			    MSG_INTL(MSG_FIL_INVSHENTSIZE),
1864a8d0ea7SAli Bahrami 			    isp->is_file->ifl_name, EC_WORD(isp->is_scnndx),
1874a8d0ea7SAli Bahrami 			    isp->is_name, EC_XWORD(0));
1887c478bd9Sstevel@tonic-gate 			return (S_ERROR);
1897c478bd9Sstevel@tonic-gate 		}
19057ef7aa9SRod Evans 		num = isp->is_shdr->sh_size / isp->is_shdr->sh_entsize;
19157ef7aa9SRod Evans 
1927c478bd9Sstevel@tonic-gate 		for (i = 0; i < num; i++) {
193*fb12490aSRichard Lowe 			Xword		ndx = ELF_M_SYM(mvp->m_info);
19457ef7aa9SRod Evans 			Sym_desc	*sdp;
19557ef7aa9SRod Evans 			Sym		*sym;
1967c478bd9Sstevel@tonic-gate 
1977c478bd9Sstevel@tonic-gate 			if ((ndx >= (Xword) isp->is_file->ifl_symscnt) ||
1987c478bd9Sstevel@tonic-gate 			    (ndx == 0)) {
1991007fd6fSAli Bahrami 				ld_eprintf(ofl, ERR_FATAL,
2005aefb655Srie 				    MSG_INTL(MSG_PSYM_INVMINFO1),
2014a8d0ea7SAli Bahrami 				    isp->is_file->ifl_name,
2024a8d0ea7SAli Bahrami 				    EC_WORD(isp->is_scnndx), isp->is_name, i,
20357ef7aa9SRod Evans 				    EC_XWORD(mvp->m_info));
2045aefb655Srie 				return (S_ERROR);
2057c478bd9Sstevel@tonic-gate 			}
20657ef7aa9SRod Evans 			if (mvp->m_repeat == 0) {
2071007fd6fSAli Bahrami 				ld_eprintf(ofl, ERR_FATAL,
2085aefb655Srie 				    MSG_INTL(MSG_PSYM_INVMREPEAT),
2094a8d0ea7SAli Bahrami 				    isp->is_file->ifl_name,
2104a8d0ea7SAli Bahrami 				    EC_WORD(isp->is_scnndx), isp->is_name, i,
21157ef7aa9SRod Evans 				    EC_XWORD(mvp->m_repeat));
2125aefb655Srie 				return (S_ERROR);
2137c478bd9Sstevel@tonic-gate 			}
2145aefb655Srie 
2157c478bd9Sstevel@tonic-gate 			sdp = isp->is_file->ifl_oldndx[ndx];
21657ef7aa9SRod Evans 			DBG_CALL(Dbg_move_entry1(ofl->ofl_lml, 1, mvp, sdp));
2175aefb655Srie 
2187c478bd9Sstevel@tonic-gate 			/*
21957ef7aa9SRod Evans 			 * Validate that this entry has a valid size.
2207c478bd9Sstevel@tonic-gate 			 */
2217c478bd9Sstevel@tonic-gate 			/* LINTED */
22257ef7aa9SRod Evans 			switch (ELF_M_SIZE(mvp->m_info)) {
2237c478bd9Sstevel@tonic-gate 			case 1: case 2: case 4: case 8:
2247c478bd9Sstevel@tonic-gate 				break;
2257c478bd9Sstevel@tonic-gate 			default:
2261007fd6fSAli Bahrami 				ld_eprintf(ofl, ERR_FATAL,
2275aefb655Srie 				    MSG_INTL(MSG_PSYM_INVMINFO2),
2284a8d0ea7SAli Bahrami 				    isp->is_file->ifl_name,
2294a8d0ea7SAli Bahrami 				    EC_WORD(isp->is_scnndx), isp->is_name, i,
23057ef7aa9SRod Evans 				    EC_XWORD(mvp->m_info));
2315aefb655Srie 				return (S_ERROR);
2327c478bd9Sstevel@tonic-gate 			}
2337c478bd9Sstevel@tonic-gate 
2347c478bd9Sstevel@tonic-gate 			/*
2355aefb655Srie 			 * If this is a global symbol, adjust the visibility.
2367c478bd9Sstevel@tonic-gate 			 */
2377c478bd9Sstevel@tonic-gate 			if (sdp->sd_aux &&
2387c478bd9Sstevel@tonic-gate 			    ((sdp->sd_flags & FLG_SY_VISIBLE) == 0))
2395aefb655Srie 				ld_sym_adjust_vis(sdp, ofl);
2407c478bd9Sstevel@tonic-gate 
24157ef7aa9SRod Evans 			sym = sdp->sd_sym;
24257ef7aa9SRod Evans 
24357ef7aa9SRod Evans 			if (sdp->sd_move == NULL) {
2447c478bd9Sstevel@tonic-gate 				/*
24557ef7aa9SRod Evans 				 * If this is the first move entry associated
24657ef7aa9SRod Evans 				 * with this symbol, save the symbol on the
24757ef7aa9SRod Evans 				 * partial symbol list, and initialize various
24857ef7aa9SRod Evans 				 * state regarding this symbol.
2497c478bd9Sstevel@tonic-gate 				 */
25057ef7aa9SRod Evans 				if (aplist_append(&ofl->ofl_parsyms, sdp,
25157ef7aa9SRod Evans 				    AL_CNT_OFL_PARSYMS) == NULL)
2527c478bd9Sstevel@tonic-gate 					return (S_ERROR);
2537c478bd9Sstevel@tonic-gate 
2547c478bd9Sstevel@tonic-gate 				/*
25557ef7aa9SRod Evans 				 * Even if -zredlocsym is in effect, the local
25657ef7aa9SRod Evans 				 * symbol used for partial initialization is
25757ef7aa9SRod Evans 				 * kept.
2587c478bd9Sstevel@tonic-gate 				 */
25944bac77bSrie 				if ((ofl->ofl_flags & FLG_OF_REDLSYM) &&
26057ef7aa9SRod Evans 				    (ELF_ST_BIND(sym->st_info) == STB_LOCAL) &&
26157ef7aa9SRod Evans 				    (ELF_ST_TYPE(sym->st_info) == STT_OBJECT)) {
2627c478bd9Sstevel@tonic-gate 					ofl->ofl_locscnt++;
2637c478bd9Sstevel@tonic-gate 					if (st_insert(ofl->ofl_strtab,
2647c478bd9Sstevel@tonic-gate 					    sdp->sd_name) == -1)
2657c478bd9Sstevel@tonic-gate 						return (S_ERROR);
2667c478bd9Sstevel@tonic-gate 				}
2677c478bd9Sstevel@tonic-gate 
2687c478bd9Sstevel@tonic-gate 				/*
26957ef7aa9SRod Evans 				 * Mark the input section associated with this
27057ef7aa9SRod Evans 				 * partially initialized symbol.
2717c478bd9Sstevel@tonic-gate 				 * This is needed when the symbol
2727c478bd9Sstevel@tonic-gate 				 * the relocation entry uses symbol information
2737c478bd9Sstevel@tonic-gate 				 * not from the symbol entry.
2747c478bd9Sstevel@tonic-gate 				 *
2757c478bd9Sstevel@tonic-gate 				 * For executable, the following is
2767c478bd9Sstevel@tonic-gate 				 * needed only for expanded symbol. However,
27757ef7aa9SRod Evans 				 * for shared object any partially non
27857ef7aa9SRod Evans 				 * expanded symbols are moved from
2797c478bd9Sstevel@tonic-gate 				 * .bss/COMMON to .sunwbss. So the following are
2807c478bd9Sstevel@tonic-gate 				 * needed.
2817c478bd9Sstevel@tonic-gate 				 */
28257ef7aa9SRod Evans 				if ((sym->st_shndx != SHN_UNDEF) &&
28357ef7aa9SRod Evans 				    (sym->st_shndx < SHN_LOPROC)) {
28457ef7aa9SRod Evans 					Is_desc	*isc;
28557ef7aa9SRod Evans 
28657ef7aa9SRod Evans 					isc = ifile->ifl_isdesc[ sym->st_shndx];
28757ef7aa9SRod Evans 					isc->is_flags |= FLG_IS_RELUPD;
28857ef7aa9SRod Evans 
28957ef7aa9SRod Evans 					if (sdp->sd_osym == NULL) {
2907c478bd9Sstevel@tonic-gate 						if ((sdp->sd_osym =
291*fb12490aSRichard Lowe 						    libld_calloc(1,
292*fb12490aSRichard Lowe 						    sizeof (Sym))) == NULL)
2937c478bd9Sstevel@tonic-gate 							return (S_ERROR);
2947c478bd9Sstevel@tonic-gate 						*(sdp->sd_osym) =
29560758829Srie 						    *(sdp->sd_sym);
2967c478bd9Sstevel@tonic-gate 					}
2977c478bd9Sstevel@tonic-gate 				}
29857ef7aa9SRod Evans 			}
2997c478bd9Sstevel@tonic-gate 
30057ef7aa9SRod Evans 			if (append_move_desc(ofl, sdp, mvp, isp) == S_ERROR)
3017c478bd9Sstevel@tonic-gate 				return (S_ERROR);
30257ef7aa9SRod Evans 
303635216b6SRod Evans 			if (sdp->sd_flags & FLG_SY_OVERLAP)
3047c478bd9Sstevel@tonic-gate 				errcnt++;
3057c478bd9Sstevel@tonic-gate 
3067c478bd9Sstevel@tonic-gate 			/*
30757ef7aa9SRod Evans 			 * If this symbol is marked to be expanded, go to the
30857ef7aa9SRod Evans 			 * next move entry.
3097c478bd9Sstevel@tonic-gate 			 */
3107c478bd9Sstevel@tonic-gate 			if (sdp->sd_flags & FLG_SY_PAREXPN) {
31157ef7aa9SRod Evans 				mvp++;
3127c478bd9Sstevel@tonic-gate 				continue;
3137c478bd9Sstevel@tonic-gate 			}
3147c478bd9Sstevel@tonic-gate 
3157c478bd9Sstevel@tonic-gate 			/*
3167c478bd9Sstevel@tonic-gate 			 * Decide whether this partial symbol is to be expanded
3177c478bd9Sstevel@tonic-gate 			 * or not.
3187c478bd9Sstevel@tonic-gate 			 *
3197c478bd9Sstevel@tonic-gate 			 * The symbol will be expanded if:
3207c478bd9Sstevel@tonic-gate 			 *	a) '-z nopartial' is specified
3217c478bd9Sstevel@tonic-gate 			 *	b) move entries covered entire symbol
3227c478bd9Sstevel@tonic-gate 			 *
3237c478bd9Sstevel@tonic-gate 			 * To expand an move entry, size of the symbol to be
3247c478bd9Sstevel@tonic-gate 			 * expanded need to be known to generate a file space.
3257c478bd9Sstevel@tonic-gate 			 * (see make_movesections().)
3267c478bd9Sstevel@tonic-gate 			 *
3277c478bd9Sstevel@tonic-gate 			 * Therefore the move entry can not be expanded
3287c478bd9Sstevel@tonic-gate 			 * if the partial symbol is a section symbol.
3297c478bd9Sstevel@tonic-gate 			 * (The size of the symbol may be unknown.)
3307c478bd9Sstevel@tonic-gate 			 * This may happen, for example, when a local symbol is
3317c478bd9Sstevel@tonic-gate 			 * reduced by the -zredlocsym.
3327c478bd9Sstevel@tonic-gate 			 *
3337c478bd9Sstevel@tonic-gate 			 * The following two if statements checks the
3347c478bd9Sstevel@tonic-gate 			 * if the move entry can be expanded or not.
3357c478bd9Sstevel@tonic-gate 			 */
336635216b6SRod Evans 			if (OFL_IS_STATIC_EXEC(ofl)) {
33757ef7aa9SRod Evans 				if (ELF_ST_TYPE(sym->st_info) == STT_SECTION) {
3387c478bd9Sstevel@tonic-gate 					errcnt++;
3391007fd6fSAli Bahrami 					ld_eprintf(ofl, ERR_FATAL,
3407c478bd9Sstevel@tonic-gate 					    MSG_INTL(MSG_PSYM_CANNOTEXPND),
34157ef7aa9SRod Evans 					    sdp->sd_file->ifl_name,
3424a8d0ea7SAli Bahrami 					    EC_WORD(isp->is_scnndx),
3437c478bd9Sstevel@tonic-gate 					    isp->is_name, i,
3447c478bd9Sstevel@tonic-gate 					    MSG_INTL(MSG_PSYM_NOSTATIC));
3457c478bd9Sstevel@tonic-gate 				} else {
3467c478bd9Sstevel@tonic-gate 					sdp->sd_flags |= FLG_SY_PAREXPN;
3477c478bd9Sstevel@tonic-gate 				}
3487c478bd9Sstevel@tonic-gate 			} else if ((ofl->ofl_flags1 & FLG_OF1_NOPARTI) != 0) {
34957ef7aa9SRod Evans 				if (ELF_ST_TYPE(sym->st_info) == STT_SECTION) {
3501007fd6fSAli Bahrami 					ld_eprintf(ofl, ERR_WARNING,
3517c478bd9Sstevel@tonic-gate 					    MSG_INTL(MSG_PSYM_CANNOTEXPND),
35257ef7aa9SRod Evans 					    sdp->sd_file->ifl_name,
3534a8d0ea7SAli Bahrami 					    EC_WORD(isp->is_scnndx),
3547c478bd9Sstevel@tonic-gate 					    isp->is_name, i,
3557c478bd9Sstevel@tonic-gate 					    MSG_ORIG(MSG_STR_EMPTY));
3567c478bd9Sstevel@tonic-gate 				} else {
3577c478bd9Sstevel@tonic-gate 					sdp->sd_flags |= FLG_SY_PAREXPN;
3587c478bd9Sstevel@tonic-gate 				}
35957ef7aa9SRod Evans 			} else if (((Xword)((sizeof (Move)) *
36057ef7aa9SRod Evans 			    alist_nitems(sdp->sd_move)) > sym->st_size) &&
36157ef7aa9SRod Evans 			    (ELF_ST_TYPE(sym->st_info) == STT_OBJECT)) {
3627c478bd9Sstevel@tonic-gate 				sdp->sd_flags |= FLG_SY_PAREXPN;
3637c478bd9Sstevel@tonic-gate 			}
3647c478bd9Sstevel@tonic-gate 
3657c478bd9Sstevel@tonic-gate 			/*
36657ef7aa9SRod Evans 			 * If a move entry exists that references a local
36757ef7aa9SRod Evans 			 * symbol, and this symbol reference will eventually
36857ef7aa9SRod Evans 			 * be assigned to the associated section, make sure the
36957ef7aa9SRod Evans 			 * section symbol is available for relocating against
37057ef7aa9SRod Evans 			 * at runtime.
3717c478bd9Sstevel@tonic-gate 			 */
37257ef7aa9SRod Evans 			if ((ELF_ST_BIND(sym->st_info) == STB_LOCAL) &&
37357ef7aa9SRod Evans 			    (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) ||
37457ef7aa9SRod Evans 			    (ofl->ofl_flags & FLG_OF_REDLSYM))) {
37557ef7aa9SRod Evans 				Os_desc *osp = sdp->sd_isc->is_osdesc;
37657ef7aa9SRod Evans 
37757ef7aa9SRod Evans 				if (osp &&
37857ef7aa9SRod Evans 				    ((osp->os_flags & FLG_OS_OUTREL) == 0)) {
37957ef7aa9SRod Evans 					ofl->ofl_dynshdrcnt++;
38057ef7aa9SRod Evans 					osp->os_flags |= FLG_OS_OUTREL;
38157ef7aa9SRod Evans 				} else if ((sdp->sd_flags &
38257ef7aa9SRod Evans 				    FLG_SY_PAREXPN) == 0)
38357ef7aa9SRod Evans 					ofl->ofl_flags1 |= FLG_OF1_BSSOREL;
3847c478bd9Sstevel@tonic-gate 			}
38557ef7aa9SRod Evans 			mvp++;
3867c478bd9Sstevel@tonic-gate 		}
3877c478bd9Sstevel@tonic-gate 	}
3887c478bd9Sstevel@tonic-gate 
3897c478bd9Sstevel@tonic-gate 	if (errcnt != 0)
3907c478bd9Sstevel@tonic-gate 		return (S_ERROR);
3917c478bd9Sstevel@tonic-gate 	if (make_mvsections(ofl) == S_ERROR)
3927c478bd9Sstevel@tonic-gate 		return (S_ERROR);
3937c478bd9Sstevel@tonic-gate 
3947c478bd9Sstevel@tonic-gate 	return (1);
3957c478bd9Sstevel@tonic-gate }
396