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 /* 23*1007fd6fSAli 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 367c478bd9Sstevel@tonic-gate make_mvsections(Ofl_desc *ofl) 377c478bd9Sstevel@tonic-gate { 3857ef7aa9SRod Evans Aliste idx; 3957ef7aa9SRod Evans Sym_desc *sdp; 407c478bd9Sstevel@tonic-gate 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; 507c478bd9Sstevel@tonic-gate Xword align_val; 517c478bd9Sstevel@tonic-gate 527c478bd9Sstevel@tonic-gate if (sym->st_shndx == SHN_COMMON) 537c478bd9Sstevel@tonic-gate align_val = sym->st_value; 547c478bd9Sstevel@tonic-gate else 557c478bd9Sstevel@tonic-gate 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)) 757c478bd9Sstevel@tonic-gate 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 9657ef7aa9SRod Evans append_move_desc(Ofl_desc *ofl, Sym_desc *sdp, Move *mvp, Is_desc *isp) 977c478bd9Sstevel@tonic-gate { 9857ef7aa9SRod Evans 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; 1167c478bd9Sstevel@tonic-gate 11757ef7aa9SRod Evans if (nmd.md_start > omdp->md_start) { 11857ef7aa9SRod Evans smdp = omdp; 11957ef7aa9SRod Evans lmdp = &nmd; 1207c478bd9Sstevel@tonic-gate } else { 12157ef7aa9SRod Evans smdp = &nmd; 12257ef7aa9SRod Evans lmdp = omdp; 1237c478bd9Sstevel@tonic-gate } 12457ef7aa9SRod Evans 12557ef7aa9SRod Evans /* 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. 13157ef7aa9SRod Evans */ 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)) 1357c478bd9Sstevel@tonic-gate continue; 13657ef7aa9SRod Evans 13757ef7aa9SRod Evans if ((nmd.md_start != omdp->md_start) && 13857ef7aa9SRod Evans ((smdp->md_start + smdp->md_len) <= lmdp->md_start)) 13957ef7aa9SRod Evans continue; 14057ef7aa9SRod Evans 141*1007fd6fSAli Bahrami ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_MOVE_OVERLAP), 142*1007fd6fSAli 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 1477c478bd9Sstevel@tonic-gate /* 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. 1517c478bd9Sstevel@tonic-gate */ 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 16957ef7aa9SRod Evans ld_process_move(Ofl_desc *ofl) 1707c478bd9Sstevel@tonic-gate { 17157ef7aa9SRod Evans Aliste idx; 1727c478bd9Sstevel@tonic-gate Is_desc *isp; 1737c478bd9Sstevel@tonic-gate int errcnt = 0; 1747c478bd9Sstevel@tonic-gate 17557ef7aa9SRod Evans for (APLIST_TRAVERSE(ofl->ofl_ismove, idx, isp)) { 1767c478bd9Sstevel@tonic-gate 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) { 184*1007fd6fSAli 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 } 1907c478bd9Sstevel@tonic-gate num = isp->is_shdr->sh_size / isp->is_shdr->sh_entsize; 19157ef7aa9SRod Evans 1927c478bd9Sstevel@tonic-gate for (i = 0; i < num; i++) { 19357ef7aa9SRod Evans 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)) { 199*1007fd6fSAli 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)); 2047c478bd9Sstevel@tonic-gate return (S_ERROR); 2057c478bd9Sstevel@tonic-gate } 20657ef7aa9SRod Evans if (mvp->m_repeat == 0) { 207*1007fd6fSAli 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)); 2127c478bd9Sstevel@tonic-gate 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: 226*1007fd6fSAli 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)); 2317c478bd9Sstevel@tonic-gate 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 = 2917c478bd9Sstevel@tonic-gate libld_calloc(sizeof (Sym), 29257ef7aa9SRod Evans 1)) == NULL) 2937c478bd9Sstevel@tonic-gate return (S_ERROR); 2947c478bd9Sstevel@tonic-gate *(sdp->sd_osym) = 2957c478bd9Sstevel@tonic-gate *(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++; 339*1007fd6fSAli 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) { 350*1007fd6fSAli 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) 3837c478bd9Sstevel@tonic-gate 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