69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CDDL HEADER START
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The contents of this file are subject to the terms of the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Common Development and Distribution License (the "License").
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * You may not use this file except in compliance with the License.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * or http://www.opensolaris.org/os/licensing.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * See the License for the specific language governing permissions
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * and limitations under the License.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * When distributing Covered Code, include this CDDL HEADER in each
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If applicable, add the following below this CDDL HEADER, with the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * fields enclosed by brackets "[]" replaced with your own identifying
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * information: Portions Copyright [yyyy] [name of copyright owner]
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CDDL HEADER END
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Copyright (c) 1988 AT&T
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * All Rights Reserved
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Use is subject to license terms.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill/*
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill * Copyright (c) 2013, Joyent, Inc. All rights reserved.
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill */
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Map file parsing (Shared Support Code).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include <stdio.h>
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include <errno.h>
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include "msg.h"
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include "_libld.h"
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include "_map.h"
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Given a NULL terminated array of structures of arbitrary type, where
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * each struct contains (among other fields) a character pointer field
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * giving that struct a unique name, return the address of the struct
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * that matches the given name.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * name - "Keyword" name to be found.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * array - Base address of array
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * name_offset - Offset of the name field within the struct
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * type used by this array, as generated via
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SGSOFFSETOF().
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * elt_size - sizeof the basic array element type
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Using a case insensitive comparison, name is compared to the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * name of each element of the array. The address of the first
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * match found is returned. If the desired name is not found,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * NULL is returned.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * note:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * This routine is completely type-unsafe. The upside is that this
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * single routine is able to search arrays of arbitrary type, leaving
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the caller free to structure their array in any way that is convenient
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * to solve the problem at hand.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#ifndef _ELF64
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramivoid *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_kwfind(const char *name, void *array, size_t name_offset,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami size_t elt_size)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (; ; array = elt_size + (char *)array) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* LINTED E_BAD_PTR_CAST_ALIGN */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *arr_name = *((const char **)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (name_offset + (const char *) array));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (arr_name == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (strcasecmp(name, arr_name) == 0)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (array);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*NOTREACHED*/
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami assert(0);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#endif
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Given the same NULL terminated array accepted by ld_map_kwfind(), format
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the strings into a comma separated list of names.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * array - Base address of array
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * name_offset - Offset of the name field within the struct
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * type used by this array, as generated via
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SGSOFFSETOF().
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * elt_size - sizeof the basic array element type
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * buf - Buffer to receive output
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * bufsize - sizeof(buf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * As many of the names as will fit are formatted into buf. If all the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * names do not fit, the remainder are quietly clipped. The caller must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ensure that there is sufficient room. buf is returned, for convenience
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * in using this function as an argument for printing.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#ifndef _ELF64
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramichar *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_kwnames(void *array, size_t name_offset, size_t elt_size, char *buf,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami size_t bufsize)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami size_t cnt = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami size_t len;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami char *str = buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (; bufsize > 1; array = elt_size + (char *)array, cnt++) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* LINTED E_BAD_PTR_CAST_ALIGN */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *arr_name = *((const char **)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (name_offset + (const char *) array));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (arr_name == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (cnt > 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (bufsize < 3)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *str++ = ',';
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *str++ = ' ';
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bufsize -= 2;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *(str + 1) = '\0';
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami len = strlcpy(str, arr_name, bufsize);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (len >= bufsize)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami str += len;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bufsize -= len;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (buf);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#endif
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Create a pseudo input file descriptor to represent the specified Mapfile.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * An input descriptor is required any time a symbol is generated.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If an input descriptor was already created for this mapfile
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * by a previous call, it is returned. Otherwise, a new descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * is created, entered into the mapfile descriptor, and returned.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Success is indicated by a non-NULL return value, failure by NULL.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiIfl_desc *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_ifl(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ifl_desc *ifl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If we've already created a pseudo input descriptor for this
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mapfile, reuse it.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (mf->mf_ifl != NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (mf->mf_ifl);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((ifl = libld_calloc(sizeof (Ifl_desc), 1)) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ifl->ifl_name = mf->mf_name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ifl->ifl_flags = (FLG_IF_MAPFILE | FLG_IF_NEEDED | FLG_IF_FILEREF);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((ifl->ifl_ehdr = libld_calloc(sizeof (Ehdr), 1)) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ifl->ifl_ehdr->e_type = ET_REL;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (aplist_append(&mf->mf_ofl->ofl_objs, ifl, AL_CNT_OFL_OBJS) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ifl = ifl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (mf->mf_ifl);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Given a capability tag type, set the override bit in the output descriptor.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * This prevents the use of capability values of that type from the input
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * objects.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramivoid
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_cap_set_ovflag(Mapfile *mf, Word type)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Map capability tag to the corresponding output descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * override flag.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static ofl_flag_t override_flag[CA_SUNW_NUM] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami 0, /* CA_SUNW_NULL */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_OF1_OVHWCAP1, /* CA_SUNW_HW_1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_OF1_OVSFCAP1, /* CA_SUNW_SF_1 */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans FLG_OF1_OVHWCAP2, /* CA_SUNW_HW_2 */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans FLG_OF1_OVPLATCAP, /* CA_SUNW_PLAT */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans FLG_OF1_OVMACHCAP, /* CA_SUNW_MACH */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans FLG_OF1_OVIDCAP /* CA_SUNW_ID */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami };
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans#if CA_SUNW_NUM != (CA_SUNW_ID + 1)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#error "CA_SUNW_NUM has grown"
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#endif
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ofl->ofl_flags1 |= override_flag[type];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Sanity check the given capability bitmask.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiBoolean
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evansld_map_cap_sanitize(Mapfile *mf, Word type, Capmask *capmask)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami elfcap_mask_t mask;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (type) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case CA_SUNW_SF_1:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Unlike hardware capabilities, we do not allow setting
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * software capability bits that do not have known definitions.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Software capability tokens have to be validated as a unit
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * as the bits can affect each others meaning (see sf1_cap()
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * in files.c).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if ((mask = (capmask->cm_val & ~SF1_SUNW_MASK)) != 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_warn(mf, MSG_INTL(MSG_MAP_BADSF1),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami EC_XWORD(mask));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capmask->cm_val &= SF1_SUNW_MASK;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if ((capmask->cm_val &
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (SF1_SUNW_FPKNWN | SF1_SUNW_FPUSED)) == SF1_SUNW_FPUSED) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_warn(mf, MSG_INTL(MSG_MAP_BADSF1),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami EC_XWORD(SF1_SUNW_FPUSED));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capmask->cm_val &= ~SF1_SUNW_FPUSED;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#if !defined(_ELF64)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The SF1_SUNW_ADDR32 software capability is only meaningful
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * when building a 64-bit object. Warn the user, and remove the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * setting, if we're building a 32-bit object.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (capmask->cm_val & SF1_SUNW_ADDR32) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_warn0(mf, MSG_INTL(MSG_MAP_INADDR32SF1));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capmask->cm_val &= ~SF1_SUNW_ADDR32;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#endif
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Return the shared object control definition structure (ofl_socntl)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * for the specified object, creating one if necessary.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * obj_name - Name of object
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns the pointer to the definition structure, or NULL on error.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiSdf_desc *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_dv(Mapfile *mf, const char *obj_name)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sdf_desc *sdf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If a shared object definition for this file already exists use it,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * otherwise allocate a new descriptor.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sdf = sdf_find(obj_name, mf->mf_ofl->ofl_socntl)) == NULL) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sdf = sdf_add(obj_name, &mf->mf_ofl->ofl_socntl)) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (Sdf_desc *)S_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdf->sdf_rfile = mf->mf_name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_dv(mf->mf_ofl->ofl_lml, sdf->sdf_name,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (sdf);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiBoolean
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_dv_entry(Mapfile *mf, Sdf_desc *sdf, Boolean require,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *version)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sdv_desc sdv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdv.sdv_name = version;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdv.sdv_ref = mf->mf_name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdv.sdv_flags = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (require) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add a VERNEED entry for the specified version
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * from this object:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * MapfileVersion Syntax
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------------------------------------
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * 1 obj - $ADDVERS=version;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * 2 DEPENDENCY obj { REQUIRE=version };
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdf->sdf_flags |= FLG_SDF_ADDVER;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (alist_append(&sdf->sdf_verneed, &sdv, sizeof (Sdv_desc),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami AL_CNT_SDF_VERSIONS) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else { /* Allow */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Allow linking to symbols found in this version, or
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * from the versions it inherits from.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * MapfileVersion Syntax
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------------------------------------
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * 1 obj - version;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * 2 DEPENDENCY obj { ALLOW=version };
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdf->sdf_flags |= FLG_SDF_SELECT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (alist_append(&sdf->sdf_vers, &sdv, sizeof (Sdv_desc),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami AL_CNT_SDF_VERSIONS) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_dv_entry(mf->mf_ofl->ofl_lml, mf->mf_lineno,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami require, version));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Given a segment descriptor, return its index.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * sgp - Segment for which index is desired
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Index of segment is returned.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiXword
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_seg_index(Mapfile *mf, Sg_desc *sgp)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp2;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ofl_desc *ofl = mf->mf_ofl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (APLIST_TRAVERSE(ofl->ofl_segs, idx, sgp2))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp == sgp2)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (idx);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add a section name to the output section sort list for the given
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * sgp - Segment in question
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * sec_name - Name of section to be added.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns TRUE for success, FALSE for failure.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiBoolean
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_seg_os_order_add(Mapfile *mf, Sg_desc *sgp, const char *sec_name)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sec_order *scop;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Make sure it's not already on the list
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (ALIST_TRAVERSE(sgp->sg_os_order, idx, scop))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (strcmp(scop->sco_secname, sec_name) == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_DUP_OS_ORD), sec_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami scop = alist_append(&sgp->sg_os_order, NULL, sizeof (Sec_order),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami AL_CNT_SG_SECORDER);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (scop == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami scop->sco_secname = sec_name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_seg_os_order(mf->mf_ofl->ofl_lml, sgp, sec_name,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami alist_nitems(sgp->sg_os_order), mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Output section ordering is a relatively expensive operation,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * and one that is generally not used. In order to avoid needless
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * work, the FLG_OF_OS_ORDER must be set when it will be needed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The section we just added needs this flag to be set. However,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * it is possible that a subsequent mapfile directive may come
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * along and clear the order list, making it unnecessary.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Instead of setting it here, we do a final pass over the segments
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * in ld_map_finalize() and set it there if a segment with sorting
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * requirements is seen.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add a size symbol to a segment
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * sgp - Segment descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_tol - Type of assignment: TK_EQUAL, or TK_PLUSEQ
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symname - Name of symbol. Must be in stable static storage
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * that can be retained.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * On success, the symbol has been added and TRUE is returned.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Otherwise an error is reported and FALSE is returned.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiBoolean
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_seg_size_symbol(Mapfile *mf, Sg_desc *sgp, Token eq_tok,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *symname)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sym *sym; /* New symbol pointer */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sym_desc *sdp; /* New symbol node pointer */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ifl_desc *ifl; /* Dummy input file structure */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami avl_index_t where;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ofl_desc *ofl = mf->mf_ofl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * We don't allow resetting the list of size symbols, so if the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * operator is TK_EQUAL and the list is not empty, issue an error.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If we want to lift this restriction, we would have to save the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * size symbols and enter them from ld_map_post_process(). Doing that
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * well would require a significant overhead in saved error reporting
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * state, and interactions with the same symbols created by symbol
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * directives. As size symbols are of little practical use, and are
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * maintained primarily for backward compatibility with SysV, we have
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * decided not to do that, but to create the symbols as the mapfiles
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * are processed, and to disallow later attempts to remove them.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((eq_tok == TK_EQUAL) && (aplist_nitems(sgp->sg_sizesym) > 0)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_SEGSIZE), sgp->sg_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Make sure we have a pseudo file descriptor to associate to the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbol.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((ifl = ld_map_ifl(mf)) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Make sure the symbol doesn't already exist. It is possible that the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbol has been scoped or versioned, in which case it does exist
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * but we can freely update it here.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sdp = ld_sym_find(symname, SYM_NOHASH, &where, ofl)) == NULL) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word hval;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sym = libld_calloc(sizeof (Sym), 1)) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_shndx = SHN_ABS;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_size = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_info = ELF_ST_INFO(STB_GLOBAL, STT_OBJECT);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_size_new(ofl->ofl_lml, symname,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_name, mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* LINTED */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami hval = (Word)elf_hash(symname);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sdp = ld_sym_enter(symname, sym, hval, ifl, ofl, 0,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SHN_ABS, (FLG_SY_SPECSEC | FLG_SY_GLOBREF), &where)) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (Sym_desc *)S_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags &= ~FLG_SY_CLEAN;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_symbol(ofl, sdp));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym = sdp->sd_sym;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sym->st_shndx == SHN_UNDEF) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_shndx = sym->st_shndx = SHN_ABS;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= FLG_SY_SPECSEC;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_size = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_info = ELF_ST_INFO(STB_GLOBAL, STT_OBJECT);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags &= ~FLG_SY_MAPREF;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_size_old(ofl, sdp,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_name, mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_SYMDEF1),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami demangle(sdp->sd_name), sdp->sd_file->ifl_name,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_INTL(MSG_MAP_DIFF_SYMMUL));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Assign the symbol to the segment.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (aplist_append(&sgp->sg_sizesym, sdp, AL_CNT_SG_SIZESYM) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Allocate a zeroed segment descriptor.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns pointer to the descriptor on success, NULL on failure.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The contents of the returned descriptor have been zeroed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The returned descriptor is not added to the segment list
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * (ofl_segs). That is done using ld_map_seg_insert().
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiSg_desc *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_seg_alloc(const char *name, Word p_type, sg_flags_t sg_flags)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sgp = libld_calloc(sizeof (Sg_desc), 1)) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_phdr.p_type = p_type;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_name = name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags = sg_flags;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (sgp);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Return the PT_SUNWSTACK segment descriptor from the ofl_segs list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * This segment is part of the default set and cannot be removed, so
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * this routine will always succeed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The descriptor is located, a DBG_STATE_MOD_BEFORE debug
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * message issued, the FLG_SG_DISABLED flag is cleared, and the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * descriptor pointer returned.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiSg_desc *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_seg_stack(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ofl_desc *ofl = mf->mf_ofl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The stack is established by exec(), using the executable's program
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * headers, before any sharable objects are loaded. If there is a
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * PT_SUNWSTACK program header, exec() will act on it. As such, stack
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * program headers are normally only applicable to executables.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * However, ELF allows a sharable object with an interpreter to
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be executed directly, and in this extremely rare case, the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * PT_SUNWSTACK program header would have meaning. Rather than
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * second guess user intent, we simply create it on demand for any
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * dynamic object, trusting that the user has a good reason for it.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (APLIST_TRAVERSE(ofl->ofl_segs, idx, sgp))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_phdr.p_type == PT_SUNWSTACK) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_seg(mf->mf_ofl, DBG_STATE_MOD_BEFORE,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami idx, sgp, mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags &= ~FLG_SG_DISABLED;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (sgp);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*NOTREACHED*/
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Finish the initialization of a new segment descriptor allocated by
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ld_map_seg_alloc(), and enter it into the segment list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * seg_type - One of DBG_SEG_NEW or DBG_SEG_NEW_IMPLICIT
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ins_head - If TRUE, the new segment goes at the front of
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * others of its type. If FALSE, it goes at the end.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * sgp - Segment descriptor to enter.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * where - Insertion point, initialized by a previous (failed) call to
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ld_seg_lookup(). Ignored if the segment has a NULL sg_name.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * On success, returns SEG_INS_OK. A non-fatal error is indicated with
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * a return value of SEG_INS_SKIP, in which case the descriptor is
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * not entered, but the user is expected to discard it and continue
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * running. On failure, returns SEG_INS_FAIL.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * note:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * This routine will modify the contents of the descriptor referenced
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * by sgp_tmpl before allocating the new descriptor. The caller must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * not expect it to be unmodified.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_seg_ins_t
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_seg_insert(Mapfile *mf, dbg_state_t dbg_state, Sg_desc *sgp,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami avl_index_t where)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ofl_desc *ofl = mf->mf_ofl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp2; /* temp segment descriptor pointer */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int ins_head;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Xword sg_ndx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If specific fields have not been supplied via
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * map_equal(), make sure defaults are supplied.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (((sgp->sg_flags & FLG_SG_P_TYPE) == 0) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (sgp->sg_phdr.p_type == PT_NULL)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Default to a loadable segment.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_phdr.p_type = PT_LOAD;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_P_TYPE;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_phdr.p_type == PT_LOAD) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sgp->sg_flags & FLG_SG_P_FLAGS) == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Default to read/write and execute.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_phdr.p_flags = PF_R + PF_W + PF_X;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_P_FLAGS;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sgp->sg_flags & FLG_SG_P_ALIGN) == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Default to segment alignment
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_phdr.p_align = ld_targ.t_m.m_segm_align;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_P_ALIGN;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Determine where the new item should be inserted in
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the segment descriptor list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (sgp->sg_phdr.p_type) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case PT_LOAD:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_flags & FLG_SG_EMPTY)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_id = SGID_TEXT_EMPTY;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami else
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_id = SGID_TEXT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case PT_NULL:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_flags & FLG_SG_EMPTY)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_id = SGID_NULL_EMPTY;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami else
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_id = SGID_NULL;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case PT_NOTE:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_id = SGID_NOTE;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_UNKSEGTYP),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami EC_WORD(sgp->sg_phdr.p_type));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (SEG_INS_FAIL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add the descriptor to the segment list. In the v1 syntax,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * new sections are added at the head of their type, while in
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the newer syntax, they go at the end of their type.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sg_ndx = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ins_head = (mf->mf_version == MFV_SYSV);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (APLIST_TRAVERSE(ofl->ofl_segs, idx, sgp2)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ins_head) { /* Insert before the others of its type */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_id > sgp2->sg_id) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sg_ndx++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami continue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else { /* Insert after the others of its type */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_id >= sgp2->sg_id) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sg_ndx++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami continue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (aplist_insert(&ofl->ofl_segs, sgp, AL_CNT_SEGMENTS, idx) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (SEG_INS_FAIL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_name != NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami avl_insert(&ofl->ofl_segs_avl, sgp, where);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_seg(ofl, dbg_state, sg_ndx, sgp, mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (SEG_INS_OK);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add an entrance criteria record for the specified segment
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * sgp - Segment for which a new entrance criteria record is needed
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * name - NULL, or name by which the entrance criteria can be referenced.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * On success, a pointer to the new entrace criteria record is
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * returned, the contents of which have been zeroed. On failure,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * NULL is returned.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiEnt_desc *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_seg_ent_add(Mapfile *mf, Sg_desc *sgp, const char *name)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc *enp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami avl_index_t where;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ofl_desc *ofl = mf->mf_ofl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((name != NULL) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (ld_ent_lookup(mf->mf_ofl, name, &where) != NULL)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_DUPNAMENT), name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Allocate and initialize the entrace criteria descriptor */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((enp = libld_calloc(1, sizeof (*enp))) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami enp->ec_name = name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami enp->ec_segment = sgp; /* Tie criteria to segment */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Insert into the APlist. The mf_ec_insndx field for each mapfile
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * starts at 0, and is incremented with each insertion. This means
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * that the entrance criteria for each mapfile go to the head of
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the list, but that within a single mapfile, they are inserted in
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the order they are seen.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (aplist_insert(&ofl->ofl_ents, enp, AL_CNT_OFL_ENTRANCE,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ec_insndx) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ec_insndx++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If the entrance criteria is named insert it into the AVL tree
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * as well. This provides O(logN) lookups by name.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (name != NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami avl_insert(&ofl->ofl_ents_avl, enp, where);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (enp);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiBoolean
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_seg_ent_files(Mapfile *mf, Ent_desc *enp, Word ecf_type, const char *str)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc_file edf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The v1 sysv syntax can let an empty string get in, consisting of
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * just a '*' where the '*' is interpreted as 'basename'.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (str[0] == '\0') {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal0(mf, MSG_INTL(MSG_MAP_MALFORM));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Basename or objname string must not contain a path separator (/) */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((ecf_type != TYP_ECF_PATH) && (strchr(str, '/') != NULL)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *msg = (ecf_type == TYP_ECF_BASENAME) ?
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_INTL(MSG_MAP_BADBNAME) : MSG_INTL(MSG_MAP_BADONAME);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, msg, str);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami edf.edf_flags = ecf_type;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami edf.edf_name = str;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami edf.edf_name_len = strlen(edf.edf_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Does it have an archive member suffix? */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((edf.edf_name[edf.edf_name_len - 1] == ')') &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (strrchr(edf.edf_name, '(') != NULL))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami edf.edf_flags |= FLG_ECF_ARMEMBER;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (alist_append(&enp->ec_files, &edf, sizeof (edf),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami AL_CNT_EC_FILES) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Note that an entrance criteria requiring file name matching exists
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * in the system. This is used by ld_place_path_info_init() to
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * skip Place_pathinfo initialization in cases where there are
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * no entrance criteria that will use the results.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ofl->ofl_flags |= FLG_OF_EC_FILES;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Prepare an ld_map_ver_t structure for a new mapfile defined version.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns TRUE for success, FALSE for failure.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiBoolean
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_sym_ver_init(Mapfile *mf, char *name, ld_map_ver_t *mv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word hash;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ofl_desc *ofl = mf->mf_ofl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_name = name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_scope = FLG_SCOPE_DFLT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_errcnt = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If we're generating segments within the image then any symbol
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * reductions will be processed (ie. applied to relocations and symbol
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * table entries). Otherwise (when creating a relocatable object) any
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * versioning information is simply recorded for use in a later
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * (segment generating) link-edit.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ofl->ofl_flags & FLG_OF_RELOBJ)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_flags |= FLG_OF_VERDEF;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If no version descriptors have yet been set up, initialize a base
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * version to represent the output file itself. This `base' version
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * catches any internally generated symbols (_end, _etext, etc.) and
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * serves to initialize the output version descriptor count.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ofl->ofl_vercnt == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ld_vers_base(ofl) == (Ver_desc *)S_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If this definition has an associated version name then generate a
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * new version descriptor and an associated version symbol index table.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (name) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_flags |= FLG_OF_VERDEF;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Traverse the present version descriptor list to see if there
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * is already one of the same name, otherwise create a new one.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* LINTED */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami hash = (Word)elf_hash(name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (((mv->mv_vdp = ld_vers_find(name, hash,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_verdesc)) == NULL) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ((mv->mv_vdp = ld_vers_desc(name, hash,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami &ofl->ofl_verdesc)) == (Ver_desc *)S_ERROR))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Initialize any new version with an index, the file from
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * which it was first referenced, and a WEAK flag (indicates
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * that there are no symbols assigned to it yet).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (mv->mv_vdp->vd_ndx == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* LINTED */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_vdp->vd_ndx = (Half)++ofl->ofl_vercnt;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_vdp->vd_file = ld_map_ifl(mf);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_vdp->vd_flags = VER_FLG_WEAK;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If a version definition hasn't been specified assign any
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbols to the base version.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_vdp = (Ver_desc *)ofl->ofl_verdesc->apl_data[0];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Change the current scope for the given version.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * scope_name - Name for new scope
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mv - Information related to version being defined
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * On success, mv is updated to change the current scope.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * On failure, mv->errcnt is incremented, and mv is otherwise unaltered.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramivoid
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_sym_scope(Mapfile *mf, const char *scope_name, ld_map_ver_t *mv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami typedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *name; /* scope keyword string */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_scope_t type; /* Resulting type */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl_flag_t ofl_flags; /* 0, or ofl flags to add */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } scope_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Valid symbol scope keywords
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * All symbols added by a mapfile are actually global entries, and
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * are assigned the scope that is presently in effect.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If a protected/symbolic scope is detected, remember this. If
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * a protected/symbolic scope is the only scope defined in this
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * (or any other mapfiles), then the mode -Bsymbolic is established.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static scope_t scope_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_DEFAULT), FLG_SCOPE_DFLT, FLG_OF_MAPGLOB },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_ELIMINATE), FLG_SCOPE_ELIM, 0 },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_EXPORTED), FLG_SCOPE_EXPT, 0 },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_HIDDEN), FLG_SCOPE_HIDD, 0 },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_GLOBAL), FLG_SCOPE_DFLT, FLG_OF_MAPGLOB },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_LOCAL), FLG_SCOPE_HIDD, 0 },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_PROTECTED),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SCOPE_PROT, FLG_OF_MAPSYMB },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_SINGLETON),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SCOPE_SNGL, FLG_OF_MAPGLOB },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_SYMBOLIC),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SCOPE_PROT, FLG_OF_MAPSYMB },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* List must be null terminated */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { 0 }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami };
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Size of buffer needed to format the names in scope_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with scope_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t scope_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_DEFAULT) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_ELIMINATE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_EXPORTED) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_HIDDEN) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_GLOBAL) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_LOCAL) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_PROTECTED) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_SINGLETON) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_SYMBOLIC);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami scope_t *scope;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami scope = ld_map_kwfind(scope_name, scope_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(scope_t, name), sizeof (scope_list[0]));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (scope == NULL) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans char buf[VLA_SIZE(scope_list_bufsize)];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SYMSCOPE),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_kwnames(scope_list, SGSOFFSETOF(scope_t, name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sizeof (scope[0]), buf, scope_list_bufsize), scope_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_errcnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_scope = scope->type;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ofl->ofl_flags |= scope->ofl_flags;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Process the special auto-reduction directive ('*'). It can be specified
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * in hidden/local, and eliminate scope. This directive indicates that all
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbols processed that are not explicitly defined to be global are to be
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * reduced to hidden/local scope in, or eliminated from, the output image.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * An auto-reduction directive also implies that a version definition must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be created, as the user has effectively defined an interface.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramivoid
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_sym_autoreduce(Mapfile *mf, ld_map_ver_t *mv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (mv->mv_scope) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case FLG_SCOPE_HIDD:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ofl->ofl_flags |= (FLG_OF_VERDEF | FLG_OF_AUTOLCL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case FLG_SCOPE_ELIM:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ofl->ofl_flags |= (FLG_OF_VERDEF | FLG_OF_AUTOELM);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Auto reduction has been applied to a scope that doesn't
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * support it. This should be a fatal error, but we limit
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * it to a warning for version 1 mapfiles. For years, we
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * quietly ignored this case, so there may be mapfiles in
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * production use that we do not wish to break.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (mf->mf_version == 1) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_warn0(mf, MSG_INTL(MSG_MAP_BADAUTORED));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal0(mf, MSG_INTL(MSG_MAP_BADAUTORED));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_errcnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add a standard or auxiliary filter to the given symbol
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mv - Information related to version being defined
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ms - Information related to symbol being defined
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * dft_flag - One of FLG_SY_STDFLTR or FLG_SY_AUXFLTR,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * specifying the type of filter.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * filtee - String giving filtee to be added
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * On success, the filtee is added. On failure, mv->errcnt is
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * incremented, and mv/ms are otherwise unaltered.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramivoid
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_sym_filtee(Mapfile *mf, ld_map_ver_t *mv, ld_map_sym_t *ms,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word dft_flag, const char *filtee)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * A given symbol can only be tied to a single filter, be it
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * a standard filter, or auxiliary.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ms->ms_filtee) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal0(mf, MSG_INTL(MSG_MAP_MULTFILTEE));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_errcnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Symbol filtering is only for sharable objects */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!(mf->mf_ofl->ofl_flags & FLG_OF_SHAROBJ)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal0(mf, MSG_INTL(MSG_MAP_FLTR_ONLYAVL));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_errcnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ms->ms_filtee = filtee;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ms->ms_dft_flag = dft_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ms->ms_sdflags |= dft_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ofl->ofl_flags |= FLG_OF_SYMINFO;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Enter a mapfile defined symbol into the given version
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ms - Information related to symbol being added to version
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * On success, returns TRUE. On failure that requires an immediate
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * halt, returns FALSE.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * On failure that requires eventual halt, but for which it would
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be OK to continue parsing in hopes of flushing out additional
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * problems, increments mv->mv_errcnt, and returns TRUE.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiBoolean
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_sym_enter(Mapfile *mf, ld_map_ver_t *mv, ld_map_sym_t *ms)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ofl_desc *ofl = mf->mf_ofl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word hash;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami avl_index_t where;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sym *sym;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sym_desc *sdp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *conflict;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add the new symbol. It should be noted that all
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbols added by the mapfile start out with global
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * scope, thus they will fall through the normal symbol
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * resolution process. Symbols defined as locals will
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be reduced in scope after all input file processing.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* LINTED */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami hash = (Word)elf_hash(ms->ms_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_version(ofl->ofl_lml, mv->mv_name, ms->ms_name,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_scope));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill /*
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill * Make sure that any parent or external declarations fall back to
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill * references.
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill */
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill if (ms->ms_sdflags & (FLG_SY_PARENT | FLG_SY_EXTERN)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill * Turn it into a reference by setting the section index
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill * to UNDEF.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill ms->ms_shndx = SHN_UNDEF;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill /*
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill * It is wrong to specify size or value for an external symbol.
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill */
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill if (ms->ms_value_set || (ms->ms_size != 0)) {
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill mf_fatal0(mf, MSG_INTL(MSG_MAP_NOEXVLSZ));
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill mv->mv_errcnt++;
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill }
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill if ((sdp = ld_sym_find(ms->ms_name, hash, &where, ofl)) == NULL) {
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill if ((sym = libld_calloc(sizeof (Sym), 1)) == NULL)
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
c56b380c394069fe4abc1010960870ca8b2726a8Bryan Cantrill sym->st_shndx = (Half)ms->ms_shndx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_value = ms->ms_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_size = ms->ms_size;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_info = ELF_ST_INFO(STB_GLOBAL, ms->ms_type);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sdp = ld_sym_enter(ms->ms_name, sym, hash,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_ifl(mf), ofl, 0, ms->ms_shndx, ms->ms_sdflags,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami &where)) == (Sym_desc *)S_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags &= ~FLG_SY_CLEAN;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Identify any references. FLG_SY_MAPREF is
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * turned off once a relocatable object with
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the same symbol is found, thus the existence
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * of FLG_SY_MAPREF at symbol validation is
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * used to flag undefined/misspelled entries.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sym->st_shndx == SHN_UNDEF)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= (FLG_SY_MAPREF | FLG_SY_GLOBREF);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = NULL;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym = sdp->sd_sym;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If this symbol already exists, make sure this
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * definition doesn't conflict with the former.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Provided it doesn't, multiple definitions
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * from different mapfiles can augment each
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * other.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sym->st_value) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ms->ms_value && (sym->st_value != ms->ms_value))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_SYMVAL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_value = ms->ms_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sym->st_size) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ms->ms_size && (sym->st_size != ms->ms_size))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_SYMSZ);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_size = ms->ms_size;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ELF_ST_TYPE(sym->st_info) != STT_NOTYPE) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((ms->ms_type != STT_NOTYPE) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (ELF_ST_TYPE(sym->st_info) != ms->ms_type))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_SYMTYP);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_info = ELF_ST_INFO(STB_GLOBAL, ms->ms_type);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sym->st_shndx != SHN_UNDEF) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((ms->ms_shndx != SHN_UNDEF) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (sym->st_shndx != ms->ms_shndx))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_SYMNDX);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sym->st_shndx = sdp->sd_shndx = ms->ms_shndx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sdp->sd_flags & MSK_SY_GLOBAL) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (sdp->sd_aux->sa_overndx != VER_NDX_GLOBAL) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (mv->mv_vdp->vd_ndx != VER_NDX_GLOBAL) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (sdp->sd_aux->sa_overndx != mv->mv_vdp->vd_ndx)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_SYMVER);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (conflict) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_SYMDEF1),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami demangle(ms->ms_name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_file->ifl_name, conflict);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_errcnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If this mapfile entry supplies a definition,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * indicate that the symbol is now used.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ms->ms_shndx != SHN_UNDEF)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= FLG_SY_MAPUSED;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * A symbol declaration that defines a size but no
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * value is processed as a request to create an
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * associated backing section. The intent behind this
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * functionality is to provide OBJT definitions within
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * filters that are not ABS. ABS symbols don't allow
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * copy-relocations to be established to filter OBJT
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * definitions.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((ms->ms_shndx == SHN_ABS) && ms->ms_size && !ms->ms_value_set) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Create backing section if not there */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sdp->sd_isc == NULL) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Is_desc *isp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ms->ms_type == STT_OBJECT) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((isp = ld_make_data(ofl, ms->ms_size)) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (Is_desc *)S_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((isp = ld_make_text(ofl, ms->ms_size)) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (Is_desc *)S_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_isc = isp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami isp->is_file = ld_map_ifl(mf);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Now that backing storage has been created,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * associate the symbol descriptor. Remove the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbols special section tag so that it will
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be assigned the correct section index as part
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * of update symbol processing.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags &= ~FLG_SY_SPECSEC;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ms->ms_sdflags &= ~FLG_SY_SPECSEC;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Indicate the new symbols scope. Although the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbols st_other field will eventually be updated as
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * part of writing out the final symbol, update the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * st_other field here to trigger better diagnostics
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * during symbol validation (for example, undefined
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * references that are defined symbolic in a mapfile).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (mv->mv_scope == FLG_SCOPE_HIDD) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * This symbol needs to be reduced to local.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ofl->ofl_flags & FLG_OF_REDLSYM) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= (FLG_SY_HIDDEN | FLG_SY_ELIM);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_sym->st_other = STV_ELIMINATE;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= FLG_SY_HIDDEN;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_sym->st_other = STV_HIDDEN;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else if (mv->mv_scope == FLG_SCOPE_ELIM) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * This symbol needs to be eliminated. Note,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the symbol is also tagged as local to trigger
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * any necessary relocation processing prior
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * to the symbol being eliminated.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= (FLG_SY_HIDDEN | FLG_SY_ELIM);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_sym->st_other = STV_ELIMINATE;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * This symbol is explicitly defined to remain
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * global.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= ms->ms_sdflags;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Qualify any global scope.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (mv->mv_scope == FLG_SCOPE_SNGL) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= (FLG_SY_SINGLE | FLG_SY_NDIR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_sym->st_other = STV_SINGLETON;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else if (mv->mv_scope == FLG_SCOPE_PROT) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= FLG_SY_PROTECT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_sym->st_other = STV_PROTECTED;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else if (mv->mv_scope == FLG_SCOPE_EXPT) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= FLG_SY_EXPORT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_sym->st_other = STV_EXPORTED;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= FLG_SY_DEFAULT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Record the present version index for later
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * potential versioning.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sdp->sd_aux->sa_overndx == 0) ||
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (sdp->sd_aux->sa_overndx == VER_NDX_GLOBAL))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_aux->sa_overndx = mv->mv_vdp->vd_ndx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_vdp->vd_flags |= FLG_VER_REFER;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = NULL;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Carry out some validity checks to ensure incompatible
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbol characteristics have not been defined.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * These checks are carried out after symbols are added
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * or resolved, to catch single instance, and
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * multi-instance definition inconsistencies.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sdp->sd_flags & (FLG_SY_HIDDEN | FLG_SY_ELIM)) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ((mv->mv_scope != FLG_SCOPE_HIDD) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (mv->mv_scope != FLG_SCOPE_ELIM))) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_SYMLCL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else if ((sdp->sd_flags &
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (FLG_SY_SINGLE | FLG_SY_EXPORT)) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ((mv->mv_scope != FLG_SCOPE_DFLT) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (mv->mv_scope != FLG_SCOPE_EXPT) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (mv->mv_scope != FLG_SCOPE_SNGL))) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_SYMGLOB);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else if ((sdp->sd_flags & FLG_SY_PROTECT) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ((mv->mv_scope != FLG_SCOPE_DFLT) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (mv->mv_scope != FLG_SCOPE_PROT))) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_SYMPROT);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else if ((sdp->sd_flags & FLG_SY_NDIR) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (mv->mv_scope == FLG_SCOPE_PROT)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_PROTNDIR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else if ((sdp->sd_flags & FLG_SY_DIR) &&
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (mv->mv_scope == FLG_SCOPE_SNGL)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conflict = MSG_INTL(MSG_MAP_DIFF_SNGLDIR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (conflict) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Select the conflict message from either a
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * single instance or multi-instance definition.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sdp->sd_file->ifl_name == mf->mf_name) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_SYMDEF2),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami demangle(ms->ms_name), conflict);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_SYMDEF1),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami demangle(ms->ms_name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_file->ifl_name, conflict);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mv->mv_errcnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Indicate that this symbol has been explicitly
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * contributed from a mapfile.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sdp->sd_flags |= (FLG_SY_MAPFILE | FLG_SY_EXPDEF);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If we've encountered a symbol definition simulate
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * that an input file has been processed - this allows
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * things like filters to be created purely from a
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mapfile.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ms->ms_type != STT_NOTYPE)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_objscnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_symbol(ofl, sdp));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If this symbol has an associated filtee, record the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * filtee string and associate the string index with the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbol. This is used later to associate the syminfo
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * information with the necessary .dynamic entry.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ms->ms_filtee) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Dfltr_desc * dftp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sfltr_desc sft;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste idx, _idx, nitems;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Make sure we don't duplicate any filtee
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * strings, and create a new descriptor if
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * necessary.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami idx = nitems = alist_nitems(ofl->ofl_dtsfltrs);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (ALIST_TRAVERSE(ofl->ofl_dtsfltrs, _idx, dftp)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((ms->ms_dft_flag != dftp->dft_flag) ||
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (strcmp(dftp->dft_str, ms->ms_filtee)))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami continue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami idx = _idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (idx == nitems) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Dfltr_desc dft;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami dft.dft_str = ms->ms_filtee;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami dft.dft_flag = ms->ms_dft_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami dft.dft_ndx = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The following append puts the new
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * item at the offset contained in
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * idx, because we know idx contains
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the index of the next available slot.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (alist_append(&ofl->ofl_dtsfltrs, &dft,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sizeof (Dfltr_desc), AL_CNT_OFL_DTSFLTRS) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Create a new filter descriptor for this
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * symbol.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sft.sft_sdp = sdp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sft.sft_idx = idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (alist_append(&ofl->ofl_symfltrs, &sft, sizeof (Sfltr_desc),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami AL_CNT_OFL_SYMFLTRS) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * In both the version 1 and version 2 syntaxes, a version definition
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * can have 0 or more inherited versions following the closing '}',
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * terminated by a ';'.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add the inherited names, and return when the terminator is seen.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiBoolean
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_sym_ver_fini(Mapfile *mf, ld_map_ver_t *mv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv; /* Value of token */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Boolean done = FALSE;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ver_desc *vdp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word hash;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Read version names until we encounter the ';' terminator.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami while (!done) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami name = tkv.tkv_str;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* The unnamed global scope can't inherit */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (mv->mv_vdp->vd_ndx == VER_NDX_GLOBAL) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_UNEXINHERIT),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Generate a new version descriptor if it doesn't
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * already exist.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* LINTED */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami hash = (Word)elf_hash(name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami vdp = ld_vers_find(name, hash, mf->mf_ofl->ofl_verdesc);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((vdp == NULL) && ((vdp = ld_vers_desc(name, hash,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami &mf->mf_ofl->ofl_verdesc)) == (Ver_desc *)S_ERROR))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add the new version descriptor to the parent version
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * descriptors reference list. Indicate the version
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * descriptors first reference (used for error diags
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * if undefined version dependencies remain).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ld_vers_find(name, hash, mv->mv_vdp->vd_deps) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (aplist_append(&mv->mv_vdp->vd_deps, vdp,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami AL_CNT_VERDESCS) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (vdp->vd_ref == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami vdp->vd_ref = mv->mv_vdp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = TRUE;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SYMEND),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}