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