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 2010 Sun Microsystems, Inc. All rights reserved.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Use is subject to license terms.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Map file parsing, Version 2 syntax (solaris).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include <stdio.h>
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include <unistd.h>
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include <ctype.h>
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include <sys/elf_amd64.h> /* SHF_AMD64_LARGE */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include <elfcap.h>
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include "msg.h"
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include "_libld.h"
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#include "_map.h"
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Use a case insensitive string match when looking up capability mask
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * values by name, and omit the AV_ prefix.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define ELFCAP_STYLE ELFCAP_STYLE_LC | ELFCAP_STYLE_F_ICMP
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Signature for functions used to parse top level mapfile directives
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef Token (*dir_func_t)(Mapfile *mf);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Signature for functions used to parse attribute level assignments
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_tok - One of the equal tokens (TK_EQUAL, TK_PLUSEQ, TK_MINUSEQ)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * or TK_ERROR. See the comment for attr_fmt_t below.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * uvalue - An arbitrary pointer "user value" passed by the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * caller to parse_attributes() for use by the function.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef Token (* attr_func_t)(Mapfile *mf, Token eq_tok, void *uvalue);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Signature for gettoken_str() err_func argument. This is a function
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * called to issue an appropriate error message.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The gts prefix stands for "Get Token Str"
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef void (* gts_efunc_t)(Mapfile *mf, Token tok, ld_map_tkval_t *tkv);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The attr_fmt_t tells parse_attributes how far to go in parsing
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * an attribute before it calls the at_func function to take over:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ATTR_FMT_NAME - Parse the name, and immediately call the function.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * This is useful in cases where there is more than
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * one possible syntax for a given attribute. The value of
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_tok passed to the at_func function will be TK_ERROR,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * reflecting the fact that it has no meaning in this context.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ATTR_FMT_EQ - Parse the name, and the following '=', and then call
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the function. The value passed to the at_func function for
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_tok will be TK_EQUAL.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ATTR_FMT_EQ_PEQ - Parse the name, and a following equal token which
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * can be '=' or '+=', and then call the function. The value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * passed to the at_func function for eq_tok will be one of
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * TK_EQUAL, or TK_PLUSEQ.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ATTR_FMT_EQ_ALL - Parse the name, and a following equal token which
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * can be any of the three forms (=, +=, -=), and then call
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the function. The value passed to the at_func function for
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_tok will be one of TK_EQUAL, TK_PLUSEQ, or TK_MINUSEQ.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef enum {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ATTR_FMT_NAME,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ATTR_FMT_EQ,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ATTR_FMT_EQ_PEQ,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ATTR_FMT_EQ_ALL,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} attr_fmt_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Type used to describe a set of valid attributes to parse_attributes():
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_name - Name of attribute
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_func - Function to call when attribute is recognized,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_all_eq - True if attribute allows the '+=' and '-=' forms of
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * assignment token, and False to only allow '='.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The array of these structs passed to parse_attributes() must be
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * NULL terminated (the at_name field must be set to NULL).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *at_name; /* Name of attribute */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_func_t at_func; /* Function to call */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_fmt_t at_fmt; /* How much to parse before calling */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* at_func */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} attr_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Mapfile version and symbol state are separate but related concepts
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * that are best represented using two different types. However, our
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * style of passing a single uvalue via parse_attributes() makes it
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * convenient to be able to reference them from a single address.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_ver_t ss_mv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_sym_t ss_ms;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} symbol_state_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Process an expected equal operator. Deals with the fact that we
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * have three variants.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_type - Types of equal operators accepted. One of ATTR_FMT_EQ,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ATTR_FMT_EQ_PEQ, or ATTR_FMT_EQ_ALL.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * lhs - Name that appears on the left hand side of the expected
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * equal operator.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns one of TK_EQUAL, TK_PLUSEQ, TK_MINUSEQ, or TK_ERROR.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigettoken_eq(Mapfile *mf, attr_fmt_t eq_type, const char *lhs)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *err;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_EQUAL:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_PLUSEQ:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (eq_type) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case ATTR_FMT_EQ_PEQ:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case ATTR_FMT_EQ_ALL:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_MINUSEQ:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (eq_type == ATTR_FMT_EQ_ALL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (eq_type) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case ATTR_FMT_EQ:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami err = MSG_INTL(MSG_MAP_EXP_EQ);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case ATTR_FMT_EQ_PEQ:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami err = MSG_INTL(MSG_MAP_EXP_EQ_PEQ);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case ATTR_FMT_EQ_ALL:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami err = MSG_INTL(MSG_MAP_EXP_EQ_ALL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*NOTREACHED*/
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami assert(0);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, err, lhs, ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Apply one of the three equal tokens to a bitmask value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * dst - Address of bitmask variable to alter
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_tok - One of TK_EQUAL, TK_PLUSEQ, TK_MINUSEQ, representing
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the operation to carry out.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * value - Value for right hand side
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The operation has been carried out:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * TK_EQUAL - *dst is set to value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * TK_PLUSEQ - Bits in value have been set in *dst
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * TK_MINUSEQ - Bits in value have been removed from *dst
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramisetflags_eq(Word *dst, Token eq_tok, Word value)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (eq_tok) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_EQUAL:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *dst = value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_PLUSEQ:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *dst |= value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_MINUSEQ:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *dst &= ~value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*NOTREACHED*/
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami assert(0);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * Apply one of the three equal tokens to a capabilities Capmask.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * capmask - Address of Capmask variable to alter
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_tok - One of TK_EQUAL, TK_PLUSEQ, TK_MINUSEQ, representing
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the operation to carry out.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * type - Capability type (CA_SUNW_*)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * value - Value for right hand side
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * title - True if a title is needed, False otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * On success, returns TRUE (1), otherwise FALSE (0)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Boolean
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evansset_capmask(Mapfile *mf, Capmask *capmask, Token eq_tok,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word type, elfcap_mask_t value, Boolean title)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (title)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_cap_mapfile_title(mf->mf_ofl->ofl_lml,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_lineno));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_val_entry(mf->mf_ofl->ofl_lml, DBG_STATE_CURRENT,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans type, capmask->cm_val, ld_targ.t_m.m_mach));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (eq_tok) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_EQUAL:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capmask->cm_val = value;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capmask->cm_exc = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_cap_set_ovflag(mf, type);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_val_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_RESET, type, capmask->cm_val,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans ld_targ.t_m.m_mach));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_PLUSEQ:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_val_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_ADD, type, value, ld_targ.t_m.m_mach));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capmask->cm_val |= value;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capmask->cm_exc &= ~value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_MINUSEQ:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_val_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_EXCLUDE, type, value, ld_targ.t_m.m_mach));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capmask->cm_val &= ~value;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capmask->cm_exc |= value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*NOTREACHED*/
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami assert(0);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Sanity check the resulting bits */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_cap_sanitize(mf, type, capmask))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Report the final configuration */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_val_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_RESOLVED, type, capmask->cm_val, ld_targ.t_m.m_mach));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (TRUE);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans}
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans/*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * Apply one of the three equal tokens to a capabilities Caplist.
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans *
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * entry:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * mf - Mapfile descriptor
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * caplist - Address of Caplist variable to alter
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * eq_tok - One of TK_EQUAL, TK_PLUSEQ, TK_MINUSEQ, representing
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * the operation to carry out.
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * type - Capability type (CA_SUNW_*)
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * str - String for right hand side
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * title - True if a title is needed, False otherwise.
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans *
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * exit:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * On success, returns TRUE (1), otherwise FALSE (0)
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evansstatic Boolean
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evansset_capstr(Mapfile *mf, Caplist *caplist, Token eq_tok,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans Word type, APlist *strs)
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans{
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans Capstr *capstr;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans Aliste idx1;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans char *str;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_mapfile_title(mf->mf_ofl->ofl_lml, mf->mf_lineno));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if ((caplist->cl_val == NULL) || (alist_nitems(caplist->cl_val) == 0)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_ptr_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_CURRENT, type, NULL));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans } else {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (ALIST_TRAVERSE(caplist->cl_val, idx1, capstr)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_ptr_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_CURRENT, type, capstr->cs_str));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans switch (eq_tok) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans case TK_EQUAL:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (caplist->cl_val) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans (void) free(caplist->cl_val);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans caplist->cl_val = NULL;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (caplist->cl_exc) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans (void) free(caplist->cl_exc);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans caplist->cl_exc = NULL;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (strs) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (APLIST_TRAVERSE(strs, idx1, str)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if ((capstr = alist_append(&caplist->cl_val,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans NULL, sizeof (Capstr),
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans AL_CNT_CAP_NAMES)) == NULL)
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (FALSE);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capstr->cs_str = str;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_ptr_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_RESET, type, capstr->cs_str));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans } else {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_ptr_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_RESET, type, NULL));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans ld_map_cap_set_ovflag(mf, type);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans break;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans case TK_PLUSEQ:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (APLIST_TRAVERSE(strs, idx1, str)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans Aliste idx2;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans const char *ostr;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans int found = 0;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans /*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * Add this name to the list of names, provided the
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * name doesn't already exist.
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (strcmp(str, capstr->cs_str) == 0) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans found++;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans break;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if ((found == 0) && ((capstr =
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans (Capstr *)alist_append(&caplist->cl_val, NULL,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans sizeof (Capstr), AL_CNT_CAP_NAMES)) == NULL))
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (FALSE);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capstr->cs_str = str;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans /*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * Remove this name from the list of excluded names,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * provided the name already exists.
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (APLIST_TRAVERSE(caplist->cl_exc, idx2, ostr)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (strcmp(str, ostr) == 0) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans aplist_delete(caplist->cl_exc, &idx2);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans break;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_ptr_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_ADD, type, str));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans break;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans case TK_MINUSEQ:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (APLIST_TRAVERSE(strs, idx1, str)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans Aliste idx2;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans const char *ostr;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans int found = 0;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans /*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * Delete this name from the list of names, provided
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * the name already exists.
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (ALIST_TRAVERSE(caplist->cl_val, idx2, capstr)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (strcmp(str, capstr->cs_str) == 0) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans alist_delete(caplist->cl_val, &idx2);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans break;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans /*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * Add this name to the list of excluded names,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * provided the name already exists.
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (APLIST_TRAVERSE(caplist->cl_exc, idx2, ostr)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (strcmp(str, ostr) == 0) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans found++;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans break;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if ((found == 0) && (aplist_append(&caplist->cl_exc,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans str, AL_CNT_CAP_NAMES) == NULL))
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (FALSE);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_ptr_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_EXCLUDE, type, str));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans break;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans default:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans /*NOTREACHED*/
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans assert(0);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans /* Report the final configuration */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if ((caplist->cl_val == NULL) || (alist_nitems(caplist->cl_val) == 0)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_ptr_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_RESOLVED, type, NULL));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans } else {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (ALIST_TRAVERSE(caplist->cl_val, idx1, capstr)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_ptr_entry(mf->mf_ofl->ofl_lml,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_STATE_RESOLVED, type, capstr->cs_str));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Process the next token, which is expected to start an optional
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * nesting of attributes (';' or '{').
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * lhs - Name of the directive or attribute being processed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns TK_SEMICOLON or TK_LEFTBKT for success, and TK_ERROR otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigettoken_optattr(Mapfile *mf, const char *lhs)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_LEFTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SEMLBKT), lhs,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Process the next token, which is expected to be a line terminator
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * (';' or '}').
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * lhs - Name of the directive or attribute being processed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns TK_SEMICOLON or TK_RIGHTBKT for success, and TK_ERROR otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigettoken_term(Mapfile *mf, const char *lhs)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SEMRBKT), lhs,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Process the next token, which is expected to be a semicolon.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * lhs - Name of the directive or attribute being processed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns TK_SEMICOLON for success, and TK_ERROR otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigettoken_semicolon(Mapfile *mf, const char *lhs)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SEM), lhs,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Process the next token, which is expected to be a '{'
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * lhs - Name of the item directly to the left of the expected left
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * bracket.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns TK_LEFTBKT for success, and TK_ERROR otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigettoken_leftbkt(Mapfile *mf, const char *lhs)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_LEFTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_LBKT), lhs,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Process the next token, which is expected to be an integer
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * lhs - Name of the directive or attribute being processed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * tkv - Address of token value struct to be filled in
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Updates *tkv and returns TK_INT for success, TK_ERROR otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigettoken_int(Mapfile *mf, const char *lhs, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_INT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_INT), lhs,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Process the next token, which is expected to be a string
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * lhs - Name of the directive or attribute being processed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * tkv - Address of token value struct to be filled in
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * err_func - Function to call if an error occurs
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Updates *tkv and returns TK_STRING for success. Calls the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * supplied err_func function and returns TK_ERROR otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigettoken_str(Mapfile *mf, int flags, ld_map_tkval_t *tkv, gts_efunc_t efunc)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, flags, tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* User supplied function reports the error */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (* efunc)(mf, tok, tkv);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Given a construct of the following common form:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * item_name {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * attribute = ...;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * where the caller has detected the item_name and opening bracket,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * parse the construct and call the attribute functions for each
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * attribute detected, stopping when the closing '}' is seen.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * item_name - Already detected name of item for which attributes
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * are being parsed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * attr_list - NULL terminated array of attr_t structures describing the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * valid attributes for the item.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * expect_str - Comma separated string listing the names of expected
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * attributes.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * uvalue - User value, passed to the attribute functions without
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * examination by parse_attributes(), usable for maintaining
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * shared state between the caller and the functions.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * parse_attributes() reads the attribute name and equality token,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * and then calls the attribute function given by the attr_list array
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * to handle everything up to and including the terminating ';'.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * This continues until the closing '}' is seen.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If everything is successful, TK_RIGHTBKT is returned. Otherwise,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * a suitable error is issued and TK_ERROR is returned.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiparse_attributes(Mapfile *mf, const char *item_name, attr_t *attr_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami size_t attr_list_bufsize, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_t *attr;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok, op_tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int attr_cnt = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Read attributes until the closing '}' is seen */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, TK_F_KEYWORD, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr = ld_map_kwfind(tkv.tkv_str, attr_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(attr_t, at_name), sizeof (attr[0]));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (attr == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami goto bad_attr;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Depending on the value of at_fmt, there are
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * fout different actions to take:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ATTR_FMT_NAME - Call at_func function
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ATTR_FMT_EQ - Read and verify a TK_EQUAL
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ATTR_FMT_EQ_PEQ - Read and verify a TK_EQUAL
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * or TK_PLUSEQ.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ATTR_FMT_EQ_ALL - Read/Verify one of the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * three possible equal tokens
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * (TK_EQUAL, TK_PLUSEQ, TK_MINUSEQ).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (attr->at_fmt == ATTR_FMT_NAME) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Arbitrary value to pass to at_func */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami op_tok = TK_ERROR;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Read/Verify appropriate equal operator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami op_tok = gettoken_eq(mf, attr->at_fmt,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr->at_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (op_tok == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Call the associated function */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = attr->at_func(mf, op_tok, uvalue)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_cnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break; /* Ignore empty statement */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bad_attr:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans char buf[VLA_SIZE(attr_list_bufsize)];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_ATTR),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_kwnames(attr_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(attr_t, at_name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sizeof (attr[0]), buf, attr_list_bufsize),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Make sure there was at least one attribute between the {} brackets */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (attr_cnt == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_NOATTR), item_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Read whitespace delimited segment flags from the input and convert into
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * bitmask of PF_ values they represent. Flags are terminated by a semicolon
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * or right bracket.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * flags - Address of variable to be set to resulting flags value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns the terminator token (TK_SEMICOLON or TK_LEFTBKT) on success,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * and TK_ERROR otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiparse_segment_flags(Mapfile *mf, Xword *flags)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Map flag names to their values. Since DATA and STACK have
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * platform dependent values, we have to determine them at runtime.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * We indicate this by setting the top bit.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define PF_DATA 0x80000000
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#define PF_STACK 0x80000001
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami typedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } segflag_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static segflag_t flag_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_DATA), PF_DATA },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_EXECUTE), PF_X },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_READ), PF_R },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_STACK), PF_STACK },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_WRITE), PF_W },
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 flag_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with flag_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t flag_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_DATA) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_EXECUTE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_READ) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_STACK) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_WRITE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami segflag_t *flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami size_t cnt = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *flags = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Read attributes until the ';' terminator is seen */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, TK_F_KEYWORD, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami flag = ld_map_kwfind(tkv.tkv_str, flag_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(segflag_t, name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sizeof (flag_list[0]));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (flag == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami goto bad_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (flag->value) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case PF_DATA:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *flags |= ld_targ.t_m.m_dataseg_perm;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case PF_STACK:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *flags |= ld_targ.t_m.m_stack_perm;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *flags |= flag->value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami cnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_INT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Accept 0 for notational convenience, but refuse
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * any other value. Note that we don't actually have
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * to set the flags to 0 here, because there are
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * already initialized to that before the main loop.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tkv.tkv_int.tkvi_value != 0)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami goto bad_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami cnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bad_flag:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans char buf[VLA_SIZE(flag_list_bufsize)];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SEGFLAG),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_kwnames(flag_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(segflag_t, name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sizeof (flag[0]), buf, flag_list_bufsize),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Make sure there was at least one flag */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (cnt == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_NOVALUES),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_FLAGS));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#undef PF_DATA
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami#undef PF_STACK
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * Parse one of the capabilities attributes that corresponds directly to a
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * capabilities bitmask value (CA_SUNW_HW_x, CA_SUNW_SF_xx). Values can be
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * integers, or symbolic names that correspond to the capabilities mask
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * in question.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_tok - One of TK_EQUAL, TK_PLUSEQ, TK_MINUSEQ, representing
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the operation to carry out.
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * capmask - Capmask from output descriptor for capability being processed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * type - Capability type (CA_SUNW_*)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * elfcap_from_str_func - pointer to elfcap-string-to-value function
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * for capability being processed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns TK_SEMICOLON or TK_RIGHTBKT for success, and TK_ERROR otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evansparse_cap_mask(Mapfile *mf, Token eq_tok, Capmask *capmask,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word type, elfcap_from_str_func_t *elfcap_from_str_func)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami elfcap_mask_t value = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami uint64_t v;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, TK_F_KEYWORD, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((v = (* elfcap_from_str_func)(ELFCAP_STYLE,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str, ld_targ.t_m.m_mach)) != 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami value |= v;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami goto bad_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_INT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami value |= tkv.tkv_int.tkvi_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bad_flag:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_CAPMASK),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!set_capmask(mf, capmask, eq_tok, type, value, TRUE))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Parse one of the capabilities attributes that manages lists of names
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * (CA_SUNW_PLAT and CA_SUNW_MACH). Values are symbolic names that correspond
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * to the capabilities mask in question.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * eq_tok - One of TK_EQUAL, TK_PLUSEQ, TK_MINUSEQ, representing
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * the operation to carry out.
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * caplist - Caplist from output descriptor for capability being processed.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * type - Capability type (CA_SUNW_*)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Returns TK_SEMICOLON or TK_RIGHTBKT for success, and TK_ERROR otherwise.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evansparse_cap_list(Mapfile *mf, Token eq_tok, Caplist *caplist,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans Word type)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans int done, found;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans APlist *strs = NULL;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans Aliste idx;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans const char *str;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (done = 0, found = 0; done == 0; found = 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * The name is in tkv.tkv_str. Save this string for
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * set_capstr() processing, but remove any duplicates.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans for (APLIST_TRAVERSE(strs, idx, str)) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (strcmp(str, tkv.tkv_str) == 0) {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans found++;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans break;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans }
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if ((found == 0) && (aplist_append(&strs, tkv.tkv_str,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans AL_CNT_CAP_NAMES) == NULL))
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_CAPNAME),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (!set_capstr(mf, caplist, eq_tok, type, strs))
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CAPABILITY [capid] { HW = hwcap_flags...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_cap_hw(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word hw1 = 0, hw2 = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami uint64_t v;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, TK_F_KEYWORD, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((v = elfcap_hw1_from_str(ELFCAP_STYLE,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str, ld_targ.t_m.m_mach)) != 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami hw1 |= v;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((v = elfcap_hw2_from_str(ELFCAP_STYLE,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str, ld_targ.t_m.m_mach)) != 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami hw2 |= v;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami goto bad_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bad_flag:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_CAPHW),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (!set_capmask(mf, &mf->mf_ofl->ofl_ocapset.oc_hw_1, eq_tok,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami CA_SUNW_HW_1, hw1, TRUE))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (!set_capmask(mf, &mf->mf_ofl->ofl_ocapset.oc_hw_2, eq_tok,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami CA_SUNW_HW_2, hw2, FALSE))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CAPABILITY [capid] { HW_1 = value ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ---------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_cap_hw_1(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (parse_cap_mask(mf, eq_tok, &mf->mf_ofl->ofl_ocapset.oc_hw_1,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami CA_SUNW_HW_1, elfcap_hw1_from_str));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CAPABILITY [capid] { HW_2 = value ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ---------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_cap_hw_2(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (parse_cap_mask(mf, eq_tok, &mf->mf_ofl->ofl_ocapset.oc_hw_2,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami CA_SUNW_HW_2, elfcap_hw2_from_str));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CAPABILITY [capid] { SF = sfcap_flags...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_cap_sf(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word sf1 = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami uint64_t v;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, TK_F_KEYWORD, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((v = elfcap_sf1_from_str(ELFCAP_STYLE,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str, ld_targ.t_m.m_mach)) != 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sf1 |= v;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami goto bad_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bad_flag:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_CAPSF),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans if (!set_capmask(mf, &mf->mf_ofl->ofl_ocapset.oc_sf_1, eq_tok,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami CA_SUNW_SF_1, sf1, TRUE))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CAPABILITY [capid] { SF_1 = value ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ---------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_cap_sf_1(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (parse_cap_mask(mf, eq_tok, &mf->mf_ofl->ofl_ocapset.oc_sf_1,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami CA_SUNW_SF_1, elfcap_sf1_from_str));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CAPABILITY [capid] { MACHINE = value ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_cap_mach(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (parse_cap_list(mf, eq_tok, &mf->mf_ofl->ofl_ocapset.oc_mach,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans CA_SUNW_MACH));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CAPABILITY [capid] { PLATFORM = value ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_cap_plat(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans return (parse_cap_list(mf, eq_tok, &mf->mf_ofl->ofl_ocapset.oc_plat,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans CA_SUNW_PLAT));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * CAPABILITY [capid] { ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_capability(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* CAPABILITY attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static attr_t attr_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_HW), at_cap_hw, ATTR_FMT_EQ_ALL },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_HW_1), at_cap_hw_1, ATTR_FMT_EQ_ALL },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_HW_2), at_cap_hw_2, ATTR_FMT_EQ_ALL },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_MACHINE), at_cap_mach, ATTR_FMT_EQ_ALL },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_PLATFORM), at_cap_plat, ATTR_FMT_EQ_ALL },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_SF), at_cap_sf, ATTR_FMT_EQ_ALL },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_SF_1), at_cap_sf_1, ATTR_FMT_EQ_ALL },
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
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 attr_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with attr_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t attr_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_HW) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_HW_1) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_HW_2) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_MACHINE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_PLATFORM) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_SF) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_SF_1);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans Capstr *capstr;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The first token can be one of:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * - An opening '{'
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * - A name, followed by a '{', or a ';'.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Read this initial sequence.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capstr = &mf->mf_ofl->ofl_ocapset.oc_id;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * The ID name is in tkv.tkv_str. Save this name in the output
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * capabilities structure. Note, should multiple ID entries
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans * be encounterd, the last entry wins.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans DBG_CALL(Dbg_cap_id(mf->mf_ofl->ofl_lml, mf->mf_lineno,
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capstr->cs_str, tkv.tkv_str));
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans capstr->cs_str = tkv.tkv_str;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans mf->mf_ofl->ofl_ocapset.oc_flags |= FLG_OCS_USRDEFID;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The name can be followed by an opening '{', or a
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * terminating ';'
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans switch (tok = gettoken_optattr(mf, capstr->cs_str)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_SEMICOLON);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_LEFTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_LEFTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Directive has no capid, but does supply attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_CAPID),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_CAPABILITY),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Parse the attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (parse_attributes(mf, MSG_ORIG(MSG_MAPKW_CAPABILITY),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_list, attr_list_bufsize, NULL) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Terminating ';' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_semicolon(mf, MSG_ORIG(MSG_MAPKW_CAPABILITY)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_dv_allow(): Value for ALLOW= is not a version string
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_dv_allow(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_VERSION),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_ALLOW), ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * DEPEND_VERSIONS object_name { ALLOW = version
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_dv_allow(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_at_dv_allow) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Enter the version. uvalue points at the Sdf_desc descriptor */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_dv_entry(mf, uvalue, FALSE, tkv.tkv_str))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_ALLOW)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_dv_allow(): Value for REQUIRE= is not a version string
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_dv_require(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_VERSION),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_REQUIRE), ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * DEPEND_VERSIONS object_name { REQURE = version
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * --------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_dv_require(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* version_name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_at_dv_require) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Enter the version. uvalue points at the Sdf_desc descriptor */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_dv_entry(mf, uvalue, TRUE, tkv.tkv_str))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_REQUIRE)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * dir_depend_versions(): Expected object name is not present
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_dir_depend_versions(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_OBJNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_DEPEND_VERSIONS),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * DEPEND_VERSIONS object_name { ATTR = ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ---------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_depend_versions(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* DEPEND_VERSIONS attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static attr_t attr_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_ALLOW), at_dv_allow, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_REQUIRE), at_dv_require, ATTR_FMT_EQ },
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 attr_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with attr_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t attr_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_ALLOW) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_REQUIRE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sdf_desc *sdf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* object_name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_dir_depend_versions) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Get descriptor for dependency */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sdf = ld_map_dv(mf, tkv.tkv_str)) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Opening '{' token */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_leftbkt(mf, tkv.tkv_str) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Parse the attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (parse_attributes(mf, MSG_ORIG(MSG_MAPKW_DEPEND_VERSIONS),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_list, attr_list_bufsize, sdf) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Terminating ';' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_semicolon(mf, MSG_ORIG(MSG_MAPKW_DEPEND_VERSIONS)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * HDR_NOALLOC ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -----------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_hdr_noalloc(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_ofl->ofl_dtflags_1 |= DF_1_NOHDR;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_hdr_noalloc(mf->mf_ofl->ofl_lml, mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* ';' terminator token */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_semicolon(mf, MSG_ORIG(MSG_MAPKW_HDR_NOALLOC)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * PHDR_ADD_NULL = cnt ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_phdr_add_null(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv; /* Value of token */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* '=' token */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_eq(mf, ATTR_FMT_EQ,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_PHDR_ADD_NULL)) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* integer token */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_int(mf, MSG_ORIG(MSG_MAPKW_PHDR_ADD_NULL), &tkv) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami while (tkv.tkv_int.tkvi_value-- > 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sgp = ld_map_seg_alloc(NULL, PT_NULL,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SG_P_TYPE | FLG_SG_EMPTY)) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ld_map_seg_insert(mf, DBG_STATE_NEW, sgp, 0) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SEG_INS_FAIL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* ';' terminator token */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_semicolon(mf, MSG_ORIG(MSG_MAPKW_PHDR_ADD_NULL)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { ALIGN = value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_align(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* value */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_int(mf, MSG_ORIG(MSG_MAPKW_ALIGN), &tkv) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_phdr.p_align = tkv.tkv_int.tkvi_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_P_ALIGN;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_ALIGN)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_seg_assign_file_basename(): Value for FILE_BASENAME= is not a file name
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_seg_assign_file_basename(Mapfile *mf, Token tok,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_FILNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_FILE_BASENAME),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { ASSIGN { FILE_BASENAME = file_name
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ---------------------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_assign_file_basename(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc *enp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* file_name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_at_seg_assign_file_basename) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_seg_ent_files(mf, enp, TYP_ECF_BASENAME, tkv.tkv_str))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_FILE_BASENAME)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_seg_assign_file_objname(): Value for FILE_OBJNAME= is not an object name
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_seg_assign_file_objname(Mapfile *mf, Token tok,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_OBJNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_FILE_OBJNAME),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { ASSIGN { FILE_OBJNAME = name
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * --------------------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_assign_file_objname(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc *enp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* file_objname */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_at_seg_assign_file_objname) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_seg_ent_files(mf, enp, TYP_ECF_OBJNAME, tkv.tkv_str))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_FILE_OBJNAME)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_seg_assign_file_path(): Value for FILE_PATH= is not a file path
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_seg_assign_file_path(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_FILPATH),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_FILE_PATH),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { ASSIGN { FILE_PATH = file_path
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -----------------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_assign_file_path(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc *enp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* file_path */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_at_seg_assign_file_path) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_seg_ent_files(mf, enp, TYP_ECF_PATH, tkv.tkv_str))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_FILE_PATH)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { ASSIGN { FLAGS = ... ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -------------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_assign_flags(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami typedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } secflag_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static secflag_t flag_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_ALLOC), SHF_ALLOC },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_EXECUTE), SHF_EXECINSTR },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_WRITE), SHF_WRITE },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_AMD64_LARGE), SHF_AMD64_LARGE },
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 flag_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with flag_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t flag_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_ALLOC) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_EXECUTE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_WRITE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_AMD64_LARGE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc *enp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int bcnt = 0, cnt = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami secflag_t *flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Read and process tokens until the closing terminator is seen */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_BANG:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Ensure ! only specified once per flag */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (bcnt != 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal0(mf, MSG_INTL(MSG_MAP_SFLG_ONEBANG));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bcnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami flag = ld_map_kwfind(tkv.tkv_str, flag_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(secflag_t, name), sizeof (flag[0]));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (flag == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami goto bad_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami cnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami enp->ec_attrmask |= flag->value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (bcnt == 0)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami enp->ec_attrbits |= flag->value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bcnt = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bad_flag:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans char buf[VLA_SIZE(flag_list_bufsize)];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SECFLAG),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_kwnames(flag_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(secflag_t, name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sizeof (flag[0]), buf, flag_list_bufsize),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Ensure that a trailing '!' was not left at the end of the line
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * without a corresponding flag to apply it to.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (bcnt != 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal0(mf, MSG_INTL(MSG_MAP_SFLG_EXBANG));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Make sure there was at least one flag */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (cnt == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_NOVALUES),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_FLAGS));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok); /* Either TK_SEMICOLON or TK_RIGHTBKT */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_seg_assign_is_name(): Value for IS_NAME= is not a section name
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_seg_assign_is_name(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SECNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_IS_NAME), ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { ASSIGN { IS_NAME = section_name ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ---------------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_assign_is_name(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc *enp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* section_name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_at_seg_assign_is_name) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami enp->ec_is_name = tkv.tkv_str;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_IS_NAME)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_seg_assign_type(): Value for TYPE= is not a section type
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_seg_assign_type(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SHTYPE),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { ASSIGN { TYPE = section_type ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ------------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_assign_type(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc *enp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conv_strtol_uvalue_t conv_uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* section type */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, TK_F_KEYWORD, &tkv,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami gts_efunc_at_seg_assign_type) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Use the libconv iteration facility to map the given name to
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * its value. This allows us to keep up with any new sections
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * without having to change this code.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (conv_iter_strtol_init(tkv.tkv_str, &conv_uvalue) != 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conv_iter_ret_t status;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Look at the canonical form */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami status = conv_iter_sec_type(CONV_OSABI_ALL, CONV_MACH_ALL,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami CONV_FMT_ALT_CF, conv_iter_strtol, &conv_uvalue);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Failing that, look at the normal form */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (status != CONV_ITER_DONE)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (void) conv_iter_sec_type(CONV_OSABI_ALL,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami CONV_MACH_ALL, CONV_FMT_ALT_NF, conv_iter_strtol,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami &conv_uvalue);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* If we didn't match anything report error */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!conv_uvalue.csl_found) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami gts_efunc_at_seg_assign_type(mf, TK_STRING, &tkv);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami enp->ec_type = conv_uvalue.csl_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_TYPE)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { ASSIGN { ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -----------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_assign(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* segment_directive ASSIGN sub-attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static attr_t attr_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_FILE_BASENAME),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami at_seg_assign_file_basename, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_FILE_OBJNAME),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami at_seg_assign_file_objname, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_FILE_PATH),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami at_seg_assign_file_path, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_FLAGS),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami at_seg_assign_flags, ATTR_FMT_EQ_ALL },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_IS_NAME),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami at_seg_assign_is_name, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_TYPE),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami at_seg_assign_type, ATTR_FMT_EQ },
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 attr_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with attr_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t attr_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_FILE_BASENAME) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_FILE_PATH) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_FLAGS) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_FILE_OBJNAME) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_IS_NAME) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_TYPE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *name = NULL;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc *enp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ASSIGN takes an optional name, plus attributes are optional,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * so expect a name, an opening '{', or a ';'.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = ld_map_gettoken(mf, 0, &tkv);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami name = tkv.tkv_str;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = ld_map_gettoken(mf, 0, &tkv);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Add a new entrance criteria descriptor to the segment */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((enp = ld_map_seg_ent_add(mf, sgp, name)) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Having handled the name, expect either '{' or ';' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SEMLBKT),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_ASSIGN_SECTION),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* No attributes: It will match anything */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami enp->ec_flags |= FLG_EC_CATCHALL;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_LEFTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Parse the attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (parse_attributes(mf, MSG_ORIG(MSG_MAPKW_ASSIGN_SECTION),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_list, attr_list_bufsize, enp) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Terminating ';', or '}' which also terminates caller */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = gettoken_term(mf, MSG_ORIG(MSG_MAPKW_ASSIGN_SECTION));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tok == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_ent(mf->mf_ofl->ofl_lml, enp, mf->mf_ofl,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { DISABLE ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_disable(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* If the segment cannot be disabled, issue error */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_flags & FLG_SG_NODISABLE) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_CNTDISSEG), sgp->sg_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Disable the segment */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_DISABLED;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_semicolon(mf, MSG_ORIG(MSG_MAPKW_DISABLE)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { FLAGS eq-op ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * --------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Note that this routine is also used for the STACK directive,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * as STACK also manipulates a segment descriptor.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * STACK { FLAGS eq-op ... ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_flags(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Xword flags;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = parse_segment_flags(mf, &flags);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tok == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami setflags_eq(&sgp->sg_phdr.p_flags, eq_tok, flags);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_P_FLAGS;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { IS_ORDER eq_op value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -----------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_is_order(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ent_desc *enp, *enp2;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The '=' form of assignment resets the list. The list contains
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * pointers to our mapfile text, so we do not have to free anything.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (eq_tok == TK_EQUAL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami aplist_reset(sgp->sg_is_order);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * One or more ASSIGN names, terminated by a semicolon.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The referenced entrance criteria must have
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * already been defined.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami enp = ld_ent_lookup(mf->mf_ofl, tkv.tkv_str, NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (enp == NULL) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_UNKENT),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Make sure it's not already on the list
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (APLIST_TRAVERSE(sgp->sg_is_order, idx, enp2))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (enp == enp2) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_INTL(MSG_MAP_DUP_IS_ORD),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Put it at the end of the order list */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (aplist_append(&sgp->sg_is_order, enp,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami AL_CNT_SG_IS_ORDER) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_ECNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { MAX_SIZE = value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_max_size(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* value */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_int(mf, MSG_ORIG(MSG_MAPKW_MAX_SIZE), &tkv) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_length = tkv.tkv_int.tkvi_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_LENGTH;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_MAX_SIZE)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { NOHDR ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * --------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_nohdr(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Set the nohdr flag on the segment. If this segment is the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * first loadable segment, the ELF and program headers will
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * not be included.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The HDR_NOALLOC top level directive is preferred. This feature
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exists to give 1:1 feature parity with version 1 mapfiles that
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * use the ?N segment flag and expect it to only take effect
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * if that segment ends up being first.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_NOHDR;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_semicolon(mf, MSG_ORIG(MSG_MAPKW_NOHDR)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { OS_ORDER eq_op assign_name...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -----------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_os_order(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The '=' form of assignment resets the list. The list contains
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * pointers to our mapfile text, so we do not have to free anything.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (eq_tok == TK_EQUAL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami alist_reset(sgp->sg_os_order);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * One or more section names, terminated by a semicolon.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_seg_os_order_add(mf, sgp, tkv.tkv_str))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SECNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { PADDR = paddr
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_paddr(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue, *sgp2;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Ensure that the segment isn't in the segment order list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (APLIST_TRAVERSE(mf->mf_ofl->ofl_segs_order, idx, sgp2))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp == sgp2) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_INTL(MSG_MAP_CNTADDRORDER), sgp->sg_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* value */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_int(mf, MSG_ORIG(MSG_MAPKW_PADDR), &tkv) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_phdr.p_paddr = tkv.tkv_int.tkvi_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_P_PADDR;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_PADDR)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { ROUND = value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_round(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* value */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_int(mf, MSG_ORIG(MSG_MAPKW_ROUND), &tkv) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_round = tkv.tkv_int.tkvi_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_ROUND;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_ROUND)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { SIZE_SYMBOL = symbol_name
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 2 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_size_symbol(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done, cnt = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * One or more symbol names, terminated by a semicolon.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_seg_size_symbol(mf, sgp, eq_tok,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami cnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If the operator is TK_EQUAL, turn it into
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * TK_PLUSEQ for any symbol names after the first.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * These additional symbols are added, and are not
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * replacements for the first one.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami eq_tok = TK_PLUSEQ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SYMNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_SIZE_SYMBOL),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Make sure there was at least one name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (cnt == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_NOVALUES),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_SIZE_SYMBOL));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * segment_directive segment_name { VADDR = vaddr
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_seg_vaddr(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp = uvalue, *sgp2;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Ensure that the segment isn't in the segment order list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (APLIST_TRAVERSE(mf->mf_ofl->ofl_segs_order, idx, sgp2))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp == sgp2) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_INTL(MSG_MAP_CNTADDRORDER), sgp->sg_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* value */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_int(mf, MSG_ORIG(MSG_MAPKW_VADDR), &tkv) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_phdr.p_vaddr = tkv.tkv_int.tkvi_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags |= FLG_SG_P_VADDR;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_VADDR)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * {LOAD|NOTE|NULL}_SEGMENT segment_name { ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Common implementation body for the family of segment directives. These
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * take the same syntax, and share a common subset of attributes. They differ
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * in the type of segments they handle and the specific attributes accepted.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor ({LOAD|NOTE|NULL}_SEGMENT)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * dir_name - Name of directive.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * seg_type - Type of segment (PT_LOAD, PT_NOTE, PT_NULL).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * attr_list - NULL terminated attribute array
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * attr_list_bufsize - Size of required buffer to format all the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * names in attr_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * gts_efunc - Error function to pass to gettoken_str() when trying
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * to obtain a segment name token.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_segment_inner(Mapfile *mf, const char *dir_name, Word seg_type,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_t *attr_list, size_t attr_list_bufsize, gts_efunc_t gts_efunc)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Boolean new_segment;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Xword ndx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami avl_index_t where;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* segment_name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp = ld_seg_lookup(mf->mf_ofl, tkv.tkv_str, &where);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami new_segment = (sgp == NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (new_segment) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Allocate a descriptor for new segment */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if ((sgp = ld_map_seg_alloc(tkv.tkv_str, seg_type,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami FLG_SG_P_TYPE)) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Make sure it's the right type of segment */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_phdr.p_type != seg_type) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXPSEGTYPE),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami conv_phdr_type(ELFOSABI_SOLARIS, ld_targ.t_m.m_mach,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_phdr.p_type, CONV_FMT_ALT_CF, &inv_buf),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami dir_name, tkv.tkv_str);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* If it was disabled, being referenced enables it */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_flags &= ~FLG_SG_DISABLED;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (DBG_ENABLED) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Not a new segment, so show the initial value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * before modifying it.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ndx = ld_map_seg_index(mf, sgp);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_seg(mf->mf_ofl, DBG_STATE_MOD_BEFORE,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ndx, sgp, mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Attributes are optional, so expect an opening '{', or a ';'.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = gettoken_optattr(mf, dir_name)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = TK_ERROR;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_LEFTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Parse the attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (parse_attributes(mf, dir_name,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_list, attr_list_bufsize, sgp) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Terminating ';' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = gettoken_semicolon(mf, dir_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tok == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * If this is a new segment, finish its initialization
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * and insert it into the segment list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (new_segment) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ld_map_seg_insert(mf, DBG_STATE_NEW, sgp, where) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SEG_INS_FAIL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } else {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Not new. Show what's changed */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_seg(mf->mf_ofl, DBG_STATE_MOD_AFTER,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ndx, sgp, mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * dir_load_segment(): Expected loadable segment name is not present
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_dir_load_segment(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SEGNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_LOAD_SEGMENT),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * LOAD_SEGMENT segment_name { ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_load_segment(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* LOAD_SEGMENT attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static attr_t attr_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_ALIGN), at_seg_align, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_ASSIGN_SECTION),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami at_seg_assign, ATTR_FMT_NAME },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_DISABLE), at_seg_disable, ATTR_FMT_NAME },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_FLAGS), at_seg_flags,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ATTR_FMT_EQ_ALL },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_IS_ORDER), at_seg_is_order,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ATTR_FMT_EQ_PEQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_MAX_SIZE), at_seg_max_size, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_NOHDR), at_seg_nohdr, ATTR_FMT_NAME },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_OS_ORDER), at_seg_os_order,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ATTR_FMT_EQ_PEQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_PADDR), at_seg_paddr, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_ROUND), at_seg_round, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_SIZE_SYMBOL),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami at_seg_size_symbol, ATTR_FMT_EQ_PEQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_VADDR), at_seg_vaddr, ATTR_FMT_EQ },
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 attr_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with attr_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t attr_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_ALIGN) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_ASSIGN_SECTION) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_DISABLE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_FLAGS) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_IS_ORDER) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_MAX_SIZE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_PADDR) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_ROUND) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_OS_ORDER) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_SIZE_SYMBOL) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_VADDR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (dir_segment_inner(mf, MSG_ORIG(MSG_MAPKW_LOAD_SEGMENT),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami PT_LOAD, attr_list, attr_list_bufsize, gts_efunc_dir_load_segment));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Common shared segment directive attributes
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic attr_t segment_core_attr_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_ASSIGN_SECTION), at_seg_assign, ATTR_FMT_NAME },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_DISABLE), at_seg_disable, ATTR_FMT_NAME },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_IS_ORDER), at_seg_is_order, ATTR_FMT_EQ_PEQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_OS_ORDER), at_seg_os_order, ATTR_FMT_EQ_PEQ },
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 segment_core_attr_list[].
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Must be kept in sync with segment_core_attr_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic size_t segment_core_attr_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_ASSIGN_SECTION) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_DISABLE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_IS_ORDER) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_OS_ORDER);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * dir_note_segment(): Expected note segment name is not present
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_dir_note_segment(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SEGNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_NOTE_SEGMENT),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * NOTE_SEGMENT segment_name { ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_note_segment(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (dir_segment_inner(mf, MSG_ORIG(MSG_MAPKW_NOTE_SEGMENT),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami PT_NOTE, segment_core_attr_list, segment_core_attr_list_bufsize,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami gts_efunc_dir_note_segment));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * dir_null_segment(): Expected null segment name is not present
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_dir_null_segment(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SEGNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_NULL_SEGMENT),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * NULL_SEGMENT segment_name { ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_null_segment(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (dir_segment_inner(mf, MSG_ORIG(MSG_MAPKW_NULL_SEGMENT),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami PT_NULL, segment_core_attr_list, segment_core_attr_list_bufsize,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami gts_efunc_dir_null_segment));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SEGMENT_ORDER segment_name ... ;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_segment_order(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Aliste idx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp, *sgp2;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Expect either a '=' or '+=' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = gettoken_eq(mf, ATTR_FMT_EQ_PEQ,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_SEGMENT_ORDER));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tok == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_seg_order(mf->mf_ofl, ELFOSABI_SOLARIS,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_targ.t_m.m_mach, DBG_STATE_MOD_BEFORE, mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The '=' form of assignment resets the list. The list contains
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * pointers to our mapfile text, so we do not have to free anything.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tok == TK_EQUAL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami aplist_reset(mf->mf_ofl->ofl_segs_order);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Read segment names, and add to list until terminator (';') is seen */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The segment must have already been defined.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp = ld_seg_lookup(mf->mf_ofl, tkv.tkv_str, NULL);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp == NULL) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_UNKSEG),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Make sure it's not already on the list
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (APLIST_TRAVERSE(mf->mf_ofl->ofl_segs_order,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami idx, sgp2))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp == sgp2) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_INTL(MSG_MAP_DUPORDSEG),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_SEGMENT_ORDER),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * It can't be ordered and also have an explicit
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * paddr or vaddr.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (sgp->sg_flags & (FLG_SG_P_PADDR | FLG_SG_P_VADDR)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_CNTADDRORDER),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp->sg_name);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Put it at the end of the list */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (aplist_append(&mf->mf_ofl->ofl_segs_order, sgp,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami AL_CNT_SG_IS_ORDER) == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SEGNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_SEGMENT_ORDER),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami DBG_CALL(Dbg_map_seg_order(mf->mf_ofl, ELFOSABI_SOLARIS,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_targ.t_m.m_mach, DBG_STATE_MOD_AFTER, mf->mf_lineno));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * STACK { ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -----^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_stack(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* STACK attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static attr_t attr_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_FLAGS), at_seg_flags, ATTR_FMT_EQ_ALL },
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 attr_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with attr_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t attr_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_FLAGS);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Sg_desc *sgp;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Opening '{' token */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_leftbkt(mf, MSG_ORIG(MSG_MAPKW_STACK)) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Fetch the PT_SUNWSTACK segment descriptor */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sgp = ld_map_seg_stack(mf);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Parse the attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (parse_attributes(mf, MSG_ORIG(MSG_MAPKW_STACK),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_list, attr_list_bufsize, sgp) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Terminating ';' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = gettoken_semicolon(mf, MSG_ORIG(MSG_MAPKW_STACK));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tok == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (DBG_ENABLED) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Xword ndx = ld_map_seg_index(mf, sgp);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Dbg_map_seg(mf->mf_ofl, DBG_STATE_MOD_AFTER, ndx, sgp,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf->mf_lineno);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_sym_aux(): Value for AUXILIARY= is not an object name
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_sym_aux(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_OBJNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_AUX), ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SYMBOL [version_name] { symbol_name { AUXILIARY = soname
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * -------------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_sym_aux(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symbol_state_t *ss = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* auxiliary filter soname */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_at_sym_aux) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_sym_filtee(mf, &ss->ss_mv, &ss->ss_ms, FLG_SY_AUXFLTR,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_AUX)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_sym_filter(): Value for FILTER= is not an object name
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_sym_filter(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_OBJNAM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_FILTER), ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SYMBOL [version_name] { symbol_name { FILTER = soname
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ----------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_sym_filter(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symbol_state_t *ss = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* filter soname */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_at_sym_filter) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_sym_filtee(mf, &ss->ss_mv, &ss->ss_ms, FLG_SY_STDFLTR,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tkv.tkv_str);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_FILTER)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SYMBOL [version_name] { symbol_name { FLAGS = ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ---------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_sym_flags(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami typedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *name;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sd_flag_t value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } symflag_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static symflag_t symflag_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_DIRECT), FLG_SY_DIR },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_DYNSORT), FLG_SY_DYNSORT },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_EXTERN), FLG_SY_EXTERN },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_INTERPOSE), FLG_SY_INTPOSE },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_NODIRECT), FLG_SY_NDIR },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_NODYNSORT), FLG_SY_NODYNSORT },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_PARENT), FLG_SY_PARENT },
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 flag_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with flag_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t symflag_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_DIRECT) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_DYNSORT) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_EXTERN) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_INTERPOSE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_NODIRECT) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_NODYNSORT) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_PARENT);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symbol_state_t *ss = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symflag_t *symflag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int cnt = 0;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Ofl_desc *ofl = mf->mf_ofl;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, TK_F_KEYWORD, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symflag = ld_map_kwfind(tkv.tkv_str, symflag_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(symflag_t, name), sizeof (symflag[0]));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (symflag == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami goto bad_flag;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami cnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Apply the flag:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Although tempting to make all of this table-driven
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * via added fields in symflag_t, there's enough
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * variation in what each flag does to make that
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * not quite worthwhile.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Similarly, it is tempting to use common code to
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * to do this work from map_support.c. However, the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * v1 code mixes unrelated things (flags, symbol types,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * value, size, etc) in single cascading series of
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * strcmps, whereas our parsing separates those things
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * from each other. Merging the code would require doing
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * two strcmps for each item, or other complexity,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * which I judge not to be worthwhile.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (symflag->value) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case FLG_SY_DIR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags |= FLG_SY_DIR;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_flags |= FLG_OF_SYMINFO;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case FLG_SY_DYNSORT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags |= FLG_SY_DYNSORT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags &= ~FLG_SY_NODYNSORT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case FLG_SY_EXTERN:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags |= FLG_SY_EXTERN;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_flags |= FLG_OF_SYMINFO;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case FLG_SY_INTPOSE:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!(ofl->ofl_flags & FLG_OF_EXEC)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal0(mf,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_INTL(MSG_MAP_NOINTPOSE));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_mv.mv_errcnt++;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags |= FLG_SY_INTPOSE;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_flags |= FLG_OF_SYMINFO;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_dtflags_1 |= DF_1_SYMINTPOSE;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case FLG_SY_NDIR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags |= FLG_SY_NDIR;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_flags |= FLG_OF_SYMINFO;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_flags1 |=
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (FLG_OF1_NDIRECT | FLG_OF1_NGLBDIR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case FLG_SY_NODYNSORT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags &= ~FLG_SY_DYNSORT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags |= FLG_SY_NODYNSORT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case FLG_SY_PARENT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags |= FLG_SY_PARENT;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ofl->ofl_flags |= FLG_OF_SYMINFO;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bad_flag:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans char buf[VLA_SIZE(symflag_list_bufsize)];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SYMFLAG),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_kwnames(symflag_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(symflag_t, name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sizeof (symflag[0]), buf,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symflag_list_bufsize),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Make sure there was at least one flag specified */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (cnt == 0) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_NOVALUES),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_FLAGS));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok); /* Either TK_SEMICOLON or TK_RIGHTBKT */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SYMBOL [version_name] { symbol_name { SIZE = value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * --------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_sym_size(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symbol_state_t *ss = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* value */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_int(mf, MSG_ORIG(MSG_MAPKW_SIZE), &tkv) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_size = tkv.tkv_int.tkvi_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_SIZE)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramitypedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *name; /* type name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Word ms_shndx; /* symbol section index */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami uchar_t ms_type; /* STT_ symbol type */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami} at_sym_type_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic at_sym_type_t at_sym_type_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_COMMON), SHN_COMMON, STT_OBJECT },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_DATA), SHN_ABS, STT_OBJECT },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_FUNCTION), SHN_ABS, STT_FUNC },
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 at_sym_type_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with at_sym_type_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic size_t at_sym_type_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_COMMON) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_DATA) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_FUNCTION);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_sym_type(): Value for TYPE= is not a symbol type
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_at_sym_type(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans char buf[VLA_SIZE(at_sym_type_list_bufsize)];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SYMTYPE),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_kwnames(at_sym_type_list, SGSOFFSETOF(at_sym_type_t, name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sizeof (at_sym_type_list[0]), buf, at_sym_type_list_bufsize),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SYMBOL [version_name] { symbol_name { TYPE = symbol_type
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * --------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_sym_type(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symbol_state_t *ss = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami at_sym_type_t *type;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* type keyword */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, TK_F_KEYWORD, &tkv, gts_efunc_at_sym_type) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami type = ld_map_kwfind(tkv.tkv_str, at_sym_type_list,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(at_sym_type_t, name), sizeof (type[0]));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (type == NULL) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami gts_efunc_at_sym_type(mf, TK_STRING, &tkv);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_shndx = type->ms_shndx;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_sdflags |= FLG_SY_SPECSEC;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_type = type->ms_type;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_TYPE)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SYMBOL [version_name] { symbol_name { VALUE = value
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ---------------------------------------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/* ARGSUSED 1 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiat_sym_value(Mapfile *mf, Token eq_tok, void *uvalue)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symbol_state_t *ss = uvalue;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* value */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_int(mf, MSG_ORIG(MSG_MAPKW_VALUE), &tkv) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_value = tkv.tkv_int.tkvi_value;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_value_set = TRUE;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* terminator */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_term(mf, MSG_ORIG(MSG_MAPKW_VALUE)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Parse the attributes for a SCOPE or VERSION symbol directive.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * entry:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * mf - Mapfile descriptor
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * dir_name - Name of directive.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ss - Pointer to symbol state block that has had its ss_nv
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * member initialzed via a call to ld_map_sym_ver_init().
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * exit:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * parse_symbol_attributes() returns TK_RIGHTBKT on success, and TK_ERROR
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * on failure.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramiparse_symbol_attributes(Mapfile *mf, const char *dir_name, symbol_state_t *ss)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Symbol attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static attr_t attr_list[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_AUX), at_sym_aux, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_FILTER), at_sym_filter, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_FLAGS), at_sym_flags, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_SIZE), at_sym_size, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_TYPE), at_sym_type, ATTR_FMT_EQ },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_VALUE), at_sym_value, ATTR_FMT_EQ },
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 attr_list[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with attr_list.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t attr_list_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_AUX) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_FILTER) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_FLAGS) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_SIZE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_TYPE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_VALUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv, tkv_sym;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami int done;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Read attributes until the closing '}' is seen */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (done = 0; done == 0; ) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * We have to allow quotes around symbol names, but the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * name we read may also be a symbol scope keyword. We won't
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * know which until we read the following token, and so have
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * to allow quotes for both. Hence, symbol scope names can
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be quoted --- an unlikely occurrence and not worth
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * complicating the code.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv_sym)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Default value for all symbol attributes is 0 */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami (void) memset(&ss->ss_ms, 0, sizeof (ss->ss_ms));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_ms.ms_name = tkv_sym.tkv_str;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Turn off the WEAK flag to indicate that definitions
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * are associated with this version. It would probably
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be more accurate to only remove this flag with the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * specification of global symbols, however setting it
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * here allows enough slop to compensate for the
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * various user inputs we've seen so far. Only if a
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * closed version is specified (i.e., "SUNW_1.x {};")
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * will a user get a weak version (which is how we
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * document the creation of weak versions).
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_mv.mv_vdp->vd_flags &= ~VER_FLG_WEAK;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * The meaning of this name depends on the following
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * character:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * : Scope
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ; Symbol without attributes
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * { Symbol with attributes
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = ld_map_gettoken(mf, 0, &tkv)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_COLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_sym_scope(mf, tkv_sym.tkv_str,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami &ss->ss_mv);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_LEFTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* name is a symbol with attributes */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (parse_attributes(mf, tkv_sym.tkv_str,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami attr_list, attr_list_bufsize, ss) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Terminating ';', or '}' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = gettoken_term(mf,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_INTL(MSG_MAP_SYMATTR));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tok == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tok == TK_RIGHTBKT)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* FALLTHROUGH */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Add the new symbol. It should be noted that
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * all symbols added by the mapfile start out
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * with global scope, thus they will fall
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * through the normal symbol resolution
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * process. Symbols defined as locals will
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be reduced in scope after all input file
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * processing.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_sym_enter(mf, &ss->ss_mv,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami &ss->ss_ms))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SYMDELIM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break; /* Ignore empty statement */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STAR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Turn off the WEAK flag, as explained above for
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * TK_STRING.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ss->ss_mv.mv_vdp->vd_flags &= ~VER_FLG_WEAK;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_sym_autoreduce(mf, &ss->ss_mv);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Following token must be ';' to terminate the stmt,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * or '}' to terminate the whole directive.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok = gettoken_term(mf, dir_name)) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_RIGHTBKT:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami done = 1;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_SYM),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv_sym, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * In the SYMBOL directive, we keep parsing in the face of
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * errors that don't involve resources, to maximize what we
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * can report in a single invocation. If we encountered such
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * an error, act on the error(s) now.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (ss->ss_mv.mv_errcnt)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (tok);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SYMBOL_SCOPE { ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * ------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_symbol_scope(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symbol_state_t ss;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* The first token must be a '{' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_leftbkt(mf, MSG_ORIG(MSG_MAPKW_SYMBOL_SCOPE)) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Establish the version descriptor and related data */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_sym_ver_init(mf, NULL, &ss.ss_mv))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Read attributes until the closing '}' is seen */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (parse_symbol_attributes(mf, MSG_ORIG(MSG_MAPKW_SYMBOL_SCOPE),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami &ss) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Terminating ';' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (gettoken_semicolon(mf, MSG_ORIG(MSG_MAPKW_SYMBOL_SCOPE)));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * at_dv_allow(): Value for ALLOW= is not a version string
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic void
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramigts_efunc_dir_symbol_version(Mapfile *mf, Token tok, ld_map_tkval_t *tkv)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_VERSION),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami MSG_ORIG(MSG_MAPKW_SYMBOL_VERSION),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Top Level Directive:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami *
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * SYMBOL_VERSION version_name { ...
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * --------------^
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramistatic Token
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramidir_symbol_version(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami symbol_state_t ss;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* The first token must be a version name */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_str(mf, 0, &tkv, gts_efunc_dir_symbol_version) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* The next token is expected to be '{' */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (gettoken_leftbkt(mf, MSG_ORIG(MSG_MAPKW_SYMBOL_VERSION)) ==
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Establish the version descriptor and related data */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_sym_ver_init(mf, tkv.tkv_str, &ss.ss_mv))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Read attributes until the closing '}' is seen */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (parse_symbol_attributes(mf, MSG_ORIG(MSG_MAPKW_SYMBOL_VERSION),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami &ss) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Determine if any version references are provided after the close
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * bracket, parsing up to the terminating ';'.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (!ld_map_sym_ver_fini(mf, &ss.ss_mv))
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_ERROR);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TK_SEMICOLON);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami/*
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * Parse the mapfile --- Solaris syntax
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali BahramiBoolean
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahramild_map_parse_v2(Mapfile *mf)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami{
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Valid top level mapfile directives */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami typedef struct {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami const char *name; /* Directive */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami dir_func_t func; /* Function to parse directive */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami } tldir_t;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tldir_t dirlist[] = {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_CAPABILITY), dir_capability },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_DEPEND_VERSIONS), dir_depend_versions },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_HDR_NOALLOC), dir_hdr_noalloc },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_LOAD_SEGMENT), dir_load_segment },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_NOTE_SEGMENT), dir_note_segment },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_NULL_SEGMENT), dir_null_segment },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_PHDR_ADD_NULL), dir_phdr_add_null },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_SEGMENT_ORDER), dir_segment_order },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_STACK), dir_stack },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_SYMBOL_SCOPE), dir_symbol_scope },
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami { MSG_ORIG(MSG_MAPKW_SYMBOL_VERSION), dir_symbol_version },
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 dirlist[]. Must
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami * be kept in sync with dirlist.
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami static size_t dirlist_bufsize =
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_CAPABILITY) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_DEPEND_VERSIONS) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_HDR_NOALLOC) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_LOAD_SEGMENT) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_NOTE_SEGMENT) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_NULL_SEGMENT) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_PHDR_ADD_NULL) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_SEGMENT_ORDER) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_STACK) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_SYMBOL_SCOPE) +
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami KW_NAME_SIZE(MSG_MAPKW_SYMBOL_VERSION);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Token tok; /* current token. */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tkval_t tkv; /* Value of token */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tldir_t *tldir;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami Conv_inv_buf_t inv_buf;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami for (;;) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tok = ld_map_gettoken(mf, TK_F_EOFOK | TK_F_KEYWORD, &tkv);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami switch (tok) {
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_ERROR:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_EOF:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (TRUE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_SEMICOLON: /* Terminator, or empty directive: Ignore */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami case TK_STRING:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Map name to entry in dirlist[] */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami tldir = ld_map_kwfind(tkv.tkv_str, dirlist,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(tldir_t, name), sizeof (dirlist[0]));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Not a directive we know? */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tldir == NULL)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami goto bad_dirtok;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /* Call the function associated with this directive */
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami if (tldir->func(mf) == TK_ERROR)
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami break;
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami default:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami bad_dirtok:
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami {
08278a5e91755ccdb5850c19d21d42fb2e16b50eRod Evans char buf[VLA_SIZE(dirlist_bufsize)];
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami mf_fatal(mf, MSG_INTL(MSG_MAP_EXP_DIR),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_kwnames(dirlist,
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami SGSOFFSETOF(tldir_t, name),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami sizeof (dirlist[0]), buf, dirlist_bufsize),
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami ld_map_tokenstr(tok, &tkv, &inv_buf));
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami }
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami /*NOTREACHED*/
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami assert(0);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami return (FALSE);
69112edd987c28fa551d4f8d9362a84a45365f17Ali Bahrami}