usr/src/cmd/sgs/pvs/common/pvs.c
author Richard Lowe <richlowe@richlowe.net>
Tue, 06 Aug 2013 21:21:56 +0000
changeset 14228 f40648257ac6
parent 11993 a39d3ec14d8f
permissions -rw-r--r--
4000 pvs can't deal with extended sections Reviewed by: Jason King <[email protected]> Reviewed by: Josef 'Jeff' Sipek <[email protected]> Approved by: Robert Mustacchi <[email protected]>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1618
8c9a4f31d225 6316708 LD_DEBUG should provide a means of identifying/isolating individual
rie
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
8c9a4f31d225 6316708 LD_DEBUG should provide a means of identifying/isolating individual
rie
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
1618
8c9a4f31d225 6316708 LD_DEBUG should provide a means of identifying/isolating individual
rie
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
11993
a39d3ec14d8f 6931044 ld should not allow SHT_PROGBITS .eh_frame sections on amd64
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 7682
diff changeset
    23
 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
 * Analyze the versioning information within a file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 *   -C		demangle C++ symbol names.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 *   -d		dump version definitions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 *
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    34
 *   -l		print reduced (local) symbols. Implies -s.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 *   -n		normalize any version definitions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 *   -o		dump output in one-line fashion	(more suitable for grep'ing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 *		and diff'ing).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 *   -r		dump the version requirements on library dependencies
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 *   -s		display the symbols associated with each version definition.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 *   -v		verbose output.  With the -r and -d options any WEAK attribute
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *		is displayed.  With the -d option, any version inheritance,
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    47
 *		and the base version are displayed.  With the -r option,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    48
 *		WEAK and INFO attributes are displayed. With the -s option
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    49
 *		the version symbol is displayed.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    50
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    51
 *   -I index	only print the specifed version index, or index range.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 *   -N name	only print the specifed `name'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include	<fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include	<stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#include	<libelf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include	<link.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include	<stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include	<string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include	<unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#include	<locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#include	<errno.h>
1618
8c9a4f31d225 6316708 LD_DEBUG should provide a means of identifying/isolating individual
rie
parents: 0
diff changeset
    64
#include	<sgs.h>
8c9a4f31d225 6316708 LD_DEBUG should provide a means of identifying/isolating individual
rie
parents: 0
diff changeset
    65
#include	<conv.h>
8c9a4f31d225 6316708 LD_DEBUG should provide a means of identifying/isolating individual
rie
parents: 0
diff changeset
    66
#include	<gelf.h>
8c9a4f31d225 6316708 LD_DEBUG should provide a means of identifying/isolating individual
rie
parents: 0
diff changeset
    67
#include	<debug.h>
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    68
#include	<ctype.h>
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    69
#include	<alist.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#include	"msg.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    72
/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    73
 * Define Alist initialization sizes.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    74
 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    75
#define	AL_CNT_MATCH_LIST	5	/* match_list initial alist count */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    76
#define	AL_CNT_GVER_DESC	25	/* version tracking descriptors */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
typedef struct cache {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	Elf_Scn		*c_scn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	Elf_Data	*c_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	char		*c_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
} Cache;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
typedef struct gver_desc {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	const char	*vd_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	unsigned long	vd_hash;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	GElf_Half	vd_ndx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	GElf_Half	vd_flags;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    89
	APlist		*vd_deps;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
} GVer_desc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    92
/* Versym related data used by gvers_syms() */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    93
typedef struct {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    94
	GElf_Versym	*vsd_vsp;   	/* ptr to versym data */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    95
	Elf_Data	*vsd_sym_data;	/* ptr to symtab data */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    96
	Word		vsd_symn;	/* # of symbols in symtab */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    97
	const char	*vsd_strs;	/* string table data */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    98
} Gver_sym_data;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
    99
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   100
/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   101
 * Type used to manage -I and -N options:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   102
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   103
 * The -I option specifies a VERSYM index, or index range. The
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   104
 * result is to select the VERDEF or VERNEED records with
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   105
 * indexes that match those given.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   106
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   107
 * -N options come in two forms:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   108
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   109
 *	1) name
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   110
 *	2) needobj (version)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   111
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   112
 * The meaning of the first case depends on the type of
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   113
 * version record being matched:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   114
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   115
 *	VERDEF - name is the name of a version defined
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   116
 *		by the object being processed (i.e. SUNW_1.1).
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   117
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   118
 *	VERNEED - name is the name of the object file
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   119
 *		on which the dependency exists (i.e. libc.so.1).
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   120
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   121
 * -N options of the second form only apply to VERNEED records.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   122
 * They are used to specify a version from a needed object.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   123
 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   124
/* match_opt_t is  used to note which match option was used */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   125
typedef enum {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   126
	MATCH_OPT_NAME,		/* Record contains a name */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   127
	MATCH_OPT_NEED_VER,	/* Record contains needed object and version */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   128
	MATCH_OPT_NDX,		/* Record contains a single index */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   129
	MATCH_OPT_RANGE,	/* Record contains an index range */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   130
} match_opt_t;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   131
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   132
typedef struct {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   133
	match_opt_t	opt_type;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   134
	union {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   135
		struct {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   136
			const char *version;	/* MATCH_OPT_{NAME|NEED_VER} */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   137
			const char *needobj;	/* MATCH_OPT_NEED_VER only */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   138
		} name;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   139
		struct {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   140
			int start;		/* MATCH_OPT_{NDX|RANGE} */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   141
			int end;		/* MATCH_OPT_RANGE only) */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   142
		} ndx;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   143
	} value;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   144
} match_rec_t;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   145
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   146
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   147
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
static const char	*cname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
static int		Cflag, dflag, lflag, nflag, oflag, rflag, sflag, vflag;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   150
static Alist		*match_list;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   152
/* Used to track whether an option defaulted to on, or was explicitly set */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
#define	DEF_DEFINED	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
#define	USR_DEFINED	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 * Determine whether a symbol name should be demangled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
static const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
demangle(const char *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	if (Cflag)
1618
8c9a4f31d225 6316708 LD_DEBUG should provide a means of identifying/isolating individual
rie
parents: 0
diff changeset
   163
		return (Elf_demangle_name(name));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		return (name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
/*
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   169
 * Append an item to the specified list, and return a pointer to the list
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   170
 * node created.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   171
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   172
 * exit:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   173
 *	On success, a new list node is created and the item is
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   174
 *	added to the list. On failure, a fatal error is issued
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   175
 *	and the process exits.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   176
 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   177
static void
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   178
pvs_aplist_append(APlist **lst, const void *item, const char *file)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   179
{
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   180
	if (aplist_append(lst, item, AL_CNT_GVER_DESC) == NULL) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   181
		int err = errno;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   182
		(void) fprintf(stderr, MSG_INTL(MSG_SYS_MALLOC), cname, file,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   183
		    strerror(err));
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   184
		exit(1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   185
	}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   186
}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   187
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   188
/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   189
 * Add an entry to match_list for use by match(). This routine is for
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   190
 * use during getopt() processing.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   191
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   192
 * entry:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   193
 *	opt - One of 'N' or 'I', indicating the option
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   194
 *	str - Value string corresponding to opt
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   195
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   196
 * exit:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   197
 *	The new match record has been added. On error, a fatal
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   198
 *	error is issued and and the process exits.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   199
 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   200
static void
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   201
add_match_record(int opt, const char *str)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   202
{
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   203
	/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   204
	 * Macros for removing leading and trailing whitespace:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   205
	 *	WS_SKIP - Advance _str without passing the NULL termination,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   206
	 *		until the first character is not whitespace.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   207
	 *	WS_SKIP_LIMIT - Advance _str without passing _limit,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   208
	 *		until the first character is not whitespace.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   209
	 *	WS_RSKIP_LIMIT - Move _tail back without passing _str,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   210
	 *		until the character before it is not whitespace.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   211
	 *		Write a NULL termination at that point.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   212
	 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   213
#define	WS_SKIP(_str) for (; *(_str) && isspace(*(_str)); (_str)++)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   214
#define	WS_SKIP_LIMIT(_str, _limit) \
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   215
	while (((_str) < s2) && isspace(*(_str))) \
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   216
		(_str)++
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   217
#define	WS_RSKIP_LIMIT(_str, _tail) \
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   218
	while (((_tail) > (_str)) && isspace(*((_tail) - 1)))	\
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   219
		(_tail)--;					\
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   220
	*(_tail) = '\0'
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   221
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   222
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   223
	match_rec_t	*rec;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   224
	char		*lstr, *s1, *s2;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   225
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   226
	rec = alist_append(&match_list, NULL, sizeof (match_rec_t),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   227
	    AL_CNT_MATCH_LIST);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   228
	if (rec == NULL) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   229
		int err = errno;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   230
		(void) fprintf(stderr, MSG_INTL(MSG_SYS_MALLOC), cname,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   231
		    MSG_INTL(MSG_STR_MATCH_RECORD), strerror(err));
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   232
		exit(1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   233
	}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   234
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   235
	if (opt == 'N') {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   236
		if ((lstr = strdup(str)) == NULL) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   237
			int err = errno;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   238
			(void) fprintf(stderr, MSG_INTL(MSG_SYS_MALLOC),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   239
			    cname, MSG_INTL(MSG_STR_MATCH_RECORD),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   240
			    strerror(err));
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   241
			exit(1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   242
		}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   243
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   244
		/* Strip leading/trailing whitespace */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   245
		s2 = lstr + strlen(lstr);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   246
		WS_SKIP_LIMIT(lstr, s2);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   247
		WS_RSKIP_LIMIT(lstr, s2);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   248
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   249
		/* Assume this is a plain string */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   250
		rec->opt_type = MATCH_OPT_NAME;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   251
		rec->value.name.version = lstr;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   252
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   253
		/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   254
		 * If s2 points at a closing paren, then this might
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   255
		 * be a MATCH_OPT_NEED_VER case. Otherwise we're done.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   256
		 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   257
		if ((s2 == lstr) || (*(s2 - 1) != ')'))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   258
			return;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   259
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   260
		/* We have a closing paren. Locate the opening one. */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   261
		for (s1 = lstr; *s1 && (*s1 != '('); s1++)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   262
			;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   263
		if (*s1 != '(')
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   264
			return;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   265
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   266
		rec->opt_type = MATCH_OPT_NEED_VER;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   267
		rec->value.name.needobj = lstr;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   268
		rec->value.name.version = s1 + 1;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   269
		s2--;		/* Points at closing paren */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   270
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   271
		/* Remove whitespace from head/tail of version */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   272
		WS_SKIP_LIMIT(rec->value.name.version, s2);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   273
		WS_RSKIP_LIMIT(rec->value.name.version, s2);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   274
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   275
		/* Terminate needobj, skipping trailing whitespace */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   276
		WS_RSKIP_LIMIT(rec->value.name.needobj, s1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   277
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   278
		return;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   279
	}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   280
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   281
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   282
	/* If we get here, we are looking at a -I index option */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   283
	rec->value.ndx.start = strtol(str, &s2, 10);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   284
	/* Value must use some of the input, and be positive */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   285
	if ((str == s2) || (rec->value.ndx.start < 1))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   286
		goto syntax_error;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   287
	str = s2;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   288
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   289
	WS_SKIP(str);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   290
	if (*str != ':') {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   291
		rec->opt_type = MATCH_OPT_NDX;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   292
	} else {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   293
		str++;					/* Skip the ':' */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   294
		rec->opt_type = MATCH_OPT_RANGE;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   295
		WS_SKIP(str);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   296
		if (*str == '\0') {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   297
			rec->value.ndx.end = -1;	/* Indicates "to end" */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   298
		} else {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   299
			rec->value.ndx.end = strtol(str, &s2, 10);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   300
			if ((str == s2) || (rec->value.ndx.end < 0))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   301
				goto syntax_error;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   302
			str = s2;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   303
			WS_SKIP(str);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   304
		}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   305
	}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   306
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   307
	/* If we are successful, there is nothing left to parse */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   308
	if (*str == '\0')
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   309
		return;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   310
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   311
	/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   312
	 * If we get here, there is leftover input. Fall through
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   313
	 * to issue a syntax error.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   314
	 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   315
syntax_error:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   316
	(void) fprintf(stderr, MSG_INTL(MSG_USAGE_BRIEF), cname);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   317
	exit(1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   318
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   319
#undef	WS_SKIP
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   320
#undef	WS_SKIP_LIMIT
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   321
#undef	WS_RSKIP_LIMIT
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   322
}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   323
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   324
/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   325
 * Returns True (1) if the version with the given name or index should
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   326
 * be displayed, and False (0) if it should not be.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   327
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   328
 * entry:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   329
 *	needobj - NULL for VERDEF records, the name of the
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   330
 *		needed object for VERNEED.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   331
 *	version - NULL, or needed version
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   332
 *	ndx - Versym index of version under consideration, or a value less
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   333
 *		than 1 to indicate that no valid index is given.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   334
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   335
 * exit:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   336
 *	True will be returned if the given name/index matches those given
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   337
 *	by one of the -I or -N command line options, or if no such option
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   338
 *	was used in the command invocation.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   339
 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   340
int
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   341
match(const char *needobj, const char *version, int ndx)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   342
{
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   343
	Aliste		_idx;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   344
	match_rec_t	*rec;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   345
	const char	*str;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   346
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   347
	/* If there is no match list, then we approve everything */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   348
	if (alist_nitems(match_list) == 0)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   349
		return (1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   350
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   351
	/* Run through the match records and check for a hit */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   352
	for (ALIST_TRAVERSE(match_list, _idx, rec)) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   353
		switch (rec->opt_type) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   354
		case MATCH_OPT_NAME:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   355
			if (needobj)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   356
				str = needobj;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   357
			else if (version)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   358
				str = version;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   359
			else
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   360
				break;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   361
			if (strcmp(rec->value.name.version, str) == 0)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   362
				return (1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   363
			break;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   364
		case MATCH_OPT_NEED_VER:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   365
			if (needobj && version &&
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   366
			    (strcmp(rec->value.name.needobj, needobj) == 0) &&
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   367
			    (strcmp(rec->value.name.version, version) == 0))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   368
				return (1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   369
			break;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   370
		case MATCH_OPT_NDX:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   371
			if ((ndx > 0) && (ndx == rec->value.ndx.start))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   372
				return (1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   373
			break;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   374
		case MATCH_OPT_RANGE:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   375
			/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   376
			 * A range end value less than 0 means that any value
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   377
			 * above the start is acceptible.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   378
			 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   379
			if ((ndx > 0) &&
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   380
			    (ndx >= rec->value.ndx.start) &&
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   381
			    ((rec->value.ndx.end < 0) ||
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   382
			    (ndx <= rec->value.ndx.end)))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   383
				return (1);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   384
			break;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   385
		}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   386
	}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   387
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   388
	/* Nothing matched */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   389
	return (0);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   390
}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   391
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   392
/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   393
 * List the symbols that belong to a specified version
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   394
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   395
 * entry:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   396
 *	vsdata - VERSYM related data from the object
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   397
 *	vd_ndx - The VERSYM index for symbols to display
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   398
 *	vd_name - Version name
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   399
 *	needobj - NULL for symbols corresponding to a VERDEF
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   400
 *		record. Name of the needed object in the case
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   401
 *		of a VERNEED record.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   402
 *	file - Object file
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   403
 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   404
static void
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   405
gvers_syms(const Gver_sym_data *vsdata, GElf_Half vd_ndx,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   406
    const char *vd_name, const char *needobj, const char *file)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   407
{
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   408
	GElf_Sym	sym;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   409
	int		_symn;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   410
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   411
	for (_symn = 0; _symn < vsdata->vsd_symn; _symn++) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   412
		size_t		size =	0;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   413
		const char	*name;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   414
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   415
		if (vsdata->vsd_vsp[_symn] != vd_ndx)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   416
			continue;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   417
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   418
		(void) gelf_getsym(vsdata->vsd_sym_data, _symn, &sym);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   419
		name = demangle(vsdata->vsd_strs + sym.st_name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   420
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   421
		/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   422
		 * Symbols that reference a VERDEF record
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   423
		 * have some extra details to handle.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   424
		 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   425
		if (needobj == NULL) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   426
			/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   427
			 * For data symbols defined by this object,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   428
			 * determine the size.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   429
			 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   430
			if ((GELF_ST_TYPE(sym.st_info) == STT_OBJECT) ||
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   431
			    (GELF_ST_TYPE(sym.st_info) == STT_COMMON) ||
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   432
			    (GELF_ST_TYPE(sym.st_info) == STT_TLS))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   433
				size = (size_t)sym.st_size;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   434
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   435
			/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   436
			 * Only output the version symbol when the verbose
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   437
			 * flag is used.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   438
			 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   439
			if (!vflag && (sym.st_shndx == SHN_ABS) &&
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   440
			    (strcmp(name, vd_name) == 0))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   441
				continue;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   442
		}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   443
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   444
		if (oflag) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   445
			if (needobj == NULL)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   446
				(void) printf(MSG_ORIG(MSG_FMT_SYM_OFIL),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   447
				    file, vd_name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   448
			else
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   449
				(void) printf(MSG_ORIG(MSG_FMT_SYM_NEED_OFIL),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   450
				    file, needobj, vd_name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   451
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   452
			if (size)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   453
				(void) printf(MSG_ORIG(MSG_FMT_SYM_SZ_OFLG),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   454
				    name, (ulong_t)size);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   455
			else
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   456
				(void) printf(MSG_ORIG(MSG_FMT_SYM_OFLG), name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   457
		} else {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   458
			if (size)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   459
				(void) printf(MSG_ORIG(MSG_FMT_SYM_SZ), name,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   460
				    (ulong_t)size);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   461
			else
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   462
				(void) printf(MSG_ORIG(MSG_FMT_SYM), name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   463
		}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   464
	}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   465
}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   466
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   467
/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
 * Print any reduced symbols.  The convention is that reduced symbols exist as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
 * LOCL entries in the .symtab, between the FILE symbol for the output file and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
 * the first FILE symbol for any input file used to build the output file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
sym_local(Cache *cache, Cache *csym, const char *file)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	int		symn, _symn, found = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	GElf_Shdr	shdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	GElf_Sym	sym;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   478
	char		*strs;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
	(void) gelf_getshdr(csym->c_scn, &shdr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	strs = (char *)cache[shdr.sh_link].c_data->d_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	/* LINTED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	symn = shdr.sh_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	 * Verify symtab[1] is the output file symbol.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	(void) gelf_getsym(csym->c_data, 1, &sym);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	if (GELF_ST_TYPE(sym.st_info) != STT_FILE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		(void) fprintf(stderr, MSG_INTL(MSG_VER_UNREDSYMS), cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
		    file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		(void) fprintf(stderr, MSG_INTL(MSG_VER_NOTSTTFILE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
		    csym->c_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	 * Scan the remaining symbols until the next file symbol is found.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	for (_symn = 2; _symn < symn; _symn++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
		const char	*name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		(void) gelf_getsym(csym->c_data, _symn, &sym);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
		if (GELF_ST_TYPE(sym.st_info) == STT_SECTION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		if (GELF_ST_TYPE(sym.st_info) == STT_FILE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
		 * Its possible that section symbols are followed immediately
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		 * by globals.  This is the case if an object (filter) is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
		 * generated exclusively from mapfile symbol definitions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
		if (GELF_ST_BIND(sym.st_info) != STB_LOCAL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
		name = demangle(strs + sym.st_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
		if (oflag) {
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   520
			(void) printf(MSG_ORIG(MSG_FMT_LOCSYM_OFLG),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   521
			    file, name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
			if (found == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
				found = 1;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   525
				(void) printf(MSG_ORIG(MSG_FMT_LOCSYM_HDR));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
			}
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   527
			(void) printf(MSG_ORIG(MSG_FMT_LOCSYM), name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
/*
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   533
 * Print data from the files VERNEED section.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   534
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   535
 * If we have been asked to display symbols, then the
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   536
 * output format follows that used for verdef sections,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   537
 * with each version displayed separately. For instance:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   538
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   539
 *	libc.so.1 (SUNW_1.7):
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   540
 *		sym1;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   541
 *		sym2;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   542
 *	libc.so.1 (SUNW_1.9):
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   543
 *		sym3;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   544
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   545
 * If we are not displaying symbols, then a terse format
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   546
 * is used, which combines all the needed versions from
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   547
 * a given object into a single line. In this case, the
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   548
 * versions are shown whether or not they contribute symbols.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   549
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   550
 *	libc.so.1 (SUNW_1.7, SUNW_1.9);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
static int
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   553
gvers_need(Cache *cache, Cache *need, const Gver_sym_data *vsdata,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   554
    const char *file)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	unsigned int	num, _num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	char		*strs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	GElf_Verneed	*vnd = need->c_data->d_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	GElf_Shdr	shdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	int		error = 0;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   561
	int		show = vflag || (vsdata == NULL) || !oflag;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   562
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	(void) gelf_getshdr(need->c_scn, &shdr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	 * Verify the version revision.  We only check the first version
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	 * structure as it is assumed all other version structures in this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	 * data section will be of the same revision.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
	if (vnd->vn_version > VER_DEF_CURRENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		(void) fprintf(stderr, MSG_INTL(MSG_VER_HIGHREV), cname, file,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
		    vnd->vn_version, VER_DEF_CURRENT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	 * Get the data buffer for the associated string table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	strs = (char *)cache[shdr.sh_link].c_data->d_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	num = shdr.sh_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
	for (_num = 1; _num <= num; _num++,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	    vnd = (GElf_Verneed *)((uintptr_t)vnd + vnd->vn_next)) {
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   583
		GElf_Vernaux	*vnap;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   584
		Word		ndx;
11993
a39d3ec14d8f 6931044 ld should not allow SHT_PROGBITS .eh_frame sections on amd64
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 7682
diff changeset
   585
		const char	*needobj, *dep;
a39d3ec14d8f 6931044 ld should not allow SHT_PROGBITS .eh_frame sections on amd64
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 7682
diff changeset
   586
		int		started = 0, listcnt = 0;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   588
		vnap = (GElf_Vernaux *) ((uintptr_t)vnd + vnd->vn_aux);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   589
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   590
		/* Obtain the needed object file name */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   591
		needobj = (char *)(strs + vnd->vn_file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   595
		/* Process the versions needed from this object */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   596
		for (ndx = 0; ndx < vnd->vn_cnt; ndx++,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   597
		    vnap = (GElf_Vernaux *)((uintptr_t)vnap + vnap->vna_next)) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   598
			Conv_ver_flags_buf_t	ver_flags_buf;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   599
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   600
			dep = (char *)(strs + vnap->vna_name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   601
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   602
			if (!match(needobj, dep, vnap->vna_other))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   603
				continue;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   605
			if (show) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   606
				if ((started == 0) || (vsdata != NULL))  {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   607
					/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   608
					 * If one-line ouput is called for
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   609
					 * display the filename being processed.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   610
					 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   611
					if (oflag && show)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   612
						(void) printf(
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   613
						    MSG_ORIG(MSG_FMT_OFIL),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   614
						    file);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   615
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   616
					(void) printf(
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   617
					    MSG_ORIG(MSG_FMT_LIST_BEGIN),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   618
					    needobj);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   619
					started = 1;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   620
				}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   622
				/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   623
				 * If not showing symbols, only show INFO
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   624
				 * versions in verbose mode. They don't
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   625
				 * actually contribute to the version
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   626
				 * interface as seen by rtld, so listing them
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   627
				 * without qualification can be misleading.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   628
				 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   629
				if (vflag || (vsdata != NULL) ||
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   630
				    (alist_nitems(match_list) != 0) ||
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   631
				    !(vnap->vna_flags & VER_FLG_INFO)) {
11993
a39d3ec14d8f 6931044 ld should not allow SHT_PROGBITS .eh_frame sections on amd64
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 7682
diff changeset
   632
					const char *fmt = (listcnt == 0) ?
a39d3ec14d8f 6931044 ld should not allow SHT_PROGBITS .eh_frame sections on amd64
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 7682
diff changeset
   633
					    MSG_ORIG(MSG_FMT_LIST_FIRST) :
a39d3ec14d8f 6931044 ld should not allow SHT_PROGBITS .eh_frame sections on amd64
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 7682
diff changeset
   634
					    MSG_ORIG(MSG_FMT_LIST_NEXT);
a39d3ec14d8f 6931044 ld should not allow SHT_PROGBITS .eh_frame sections on amd64
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 7682
diff changeset
   635
a39d3ec14d8f 6931044 ld should not allow SHT_PROGBITS .eh_frame sections on amd64
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 7682
diff changeset
   636
					if (vsdata == NULL)
a39d3ec14d8f 6931044 ld should not allow SHT_PROGBITS .eh_frame sections on amd64
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 7682
diff changeset
   637
						listcnt++;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   638
					(void) printf(fmt, dep);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   640
					/* Show non-zero flags */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   641
					if (vflag && (vnap->vna_flags != 0))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   642
						(void) printf(
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   643
						    MSG_ORIG(MSG_FMT_VER_FLG),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   644
						    conv_ver_flags(
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   645
						    vnap->vna_flags,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   646
						    CONV_FMT_NOBKT,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   647
						    &ver_flags_buf));
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   648
				}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   649
				if (vsdata != NULL)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   650
					(void) printf(oflag ?
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   651
					    MSG_ORIG(MSG_FMT_LIST_END_SEM) :
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   652
					    MSG_ORIG(MSG_FMT_LIST_END_COL));
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   653
			}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   654
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   655
			/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   656
			 * If we are showing symbols, and vna_other is
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   657
			 * non-zero, list them here.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   658
			 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   659
			 * A value of 0 means that this object uses
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   660
			 * traditional Solaris versioning rules, under
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   661
			 * which VERSYM does not contain indexes to VERNEED
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   662
			 * records. In this case, there is nothing to show.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   663
			 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   664
			if (vsdata && (vnap->vna_other > 0))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   665
				gvers_syms(vsdata, vnap->vna_other,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   666
				    dep, needobj, file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
		}
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   668
		if (show && started && (vsdata == NULL))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   669
			(void) printf(MSG_ORIG(MSG_FMT_LIST_END_SEM));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
/*
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   675
 * Return a GVer_desc descriptor for the given version if one
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   676
 * exists.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   677
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   678
 * entry:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   679
 *	name - Version name
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   680
 *	hash - ELF hash of name
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   681
 *	lst - APlist of existing descriptors.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   682
 *	file - Object file containing the version
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   683
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   684
 * exit:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   685
 *	Return the corresponding GVer_desc struct if it
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   686
 *	exists, and NULL otherwise.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
 */
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   688
static GVer_desc *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   689
gvers_find(const char *name, unsigned long hash, APlist *lst)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
{
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   691
	Aliste		idx;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   692
	GVer_desc	*vdp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   694
	for (APLIST_TRAVERSE(lst, idx, vdp))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   695
		if ((vdp->vd_hash == hash) &&
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   696
		    (strcmp(vdp->vd_name, name) == 0))
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   697
			return (vdp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   699
	return (NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   702
/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   703
 * Return a GVer_desc descriptor for the given version.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   704
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   705
 * entry:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   706
 *	name - Version name
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   707
 *	hash - ELF hash of name
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   708
 *	lst - List of existing descriptors.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   709
 *	file - Object file containing the version
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   710
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   711
 * exit:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   712
 *	Return the corresponding GVer_desc struct. If the
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   713
 * 	descriptor does not already exist, it is created.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   714
 *	On error, a fatal error is issued and the process exits.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   715
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
static GVer_desc *
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   717
gvers_desc(const char *name, unsigned long hash, APlist **lst, const char *file)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
	GVer_desc	*vdp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   721
	if ((vdp = gvers_find(name, hash, *lst)) == NULL) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   722
		if ((vdp = calloc(sizeof (GVer_desc), 1)) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
			int err = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
			(void) fprintf(stderr, MSG_INTL(MSG_SYS_MALLOC), cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
			    file, strerror(err));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
		vdp->vd_name = name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
		vdp->vd_hash = hash;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   732
		pvs_aplist_append(lst, vdp, file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	return (vdp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   737
/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   738
 * Insert a version dependency for the given GVer_desc descriptor.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   739
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   740
 * entry:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   741
 *	name - Dependency version name
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   742
 *	hash - ELF hash of name
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   743
 *	lst - List of existing descriptors.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   744
 *	vdp - Existing version descriptor to which the dependency
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   745
 *		is to be added.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   746
 *	file - Object file containing the version
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   747
 *
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   748
 * exit:
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   749
 *	A descriptor for the dependency version is looked up
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   750
 *	(created if necessary), and then added to the dependency
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   751
 *	list for vdp. Returns the dependency descriptor. On error,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   752
 *	a fatal error is issued and the process exits.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   753
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
static GVer_desc *
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   755
gvers_depend(const char *name, unsigned long hash, GVer_desc *vdp, APlist **lst,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
    const char *file)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
	GVer_desc	*_vdp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   760
	_vdp = gvers_desc(name, hash, lst, file);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   761
	pvs_aplist_append(&vdp->vd_deps, _vdp, file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
	return (vdp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
static void
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   766
gvers_derefer(GVer_desc *vdp, int weak)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
{
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   768
	Aliste		idx;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   769
	GVer_desc 	*_vdp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
	 * If the head of the list was a weak then we only clear out
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
	 * weak dependencies, but if the head of the list was 'strong'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
	 * we clear the REFER bit on all dependencies.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
	if ((weak && (vdp->vd_flags & VER_FLG_WEAK)) || (!weak))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
		vdp->vd_flags &= ~FLG_VER_AVAIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   779
	for (APLIST_TRAVERSE(vdp->vd_deps, idx, _vdp))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
		gvers_derefer(_vdp, weak);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
static void
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   785
recurse_syms(const Gver_sym_data *vsdata, GVer_desc *vdp, const char *file)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
{
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   787
	Aliste		idx;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
	GVer_desc	*_vdp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   790
	for (APLIST_TRAVERSE(vdp->vd_deps, idx, _vdp)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
		if (!oflag)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   792
			(void) printf(MSG_ORIG(MSG_FMT_TNCO), _vdp->vd_name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   793
		gvers_syms(vsdata, _vdp->vd_ndx, _vdp->vd_name, NULL, file);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   794
		if (aplist_nitems(_vdp->vd_deps) != 0)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   795
			recurse_syms(vsdata, _vdp, file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
 * Print the files version definition sections.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
static int
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   804
gvers_def(Cache *cache, Cache *def, const Gver_sym_data *vsdata,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   805
    const char *file)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	unsigned int	num, _num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	char		*strs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
	GElf_Verdef	*vdf = def->c_data->d_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
	GElf_Shdr	shdr;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   811
	GVer_desc	*vdp, *bvdp = NULL;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   812
	Aliste		idx1;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   813
	APlist		*verdefs = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
	int		error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
	 * Verify the version revision.  We only check the first version
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
	 * structure as it is assumed all other version structures in this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
	 * data section will be of the same revision.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
	if (vdf->vd_version > VER_DEF_CURRENT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
		(void) fprintf(stderr, MSG_INTL(MSG_VER_HIGHREV), cname, file,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
		    vdf->vd_version, VER_DEF_CURRENT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
	 * Get the data buffer for the associated string table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	(void) gelf_getshdr(def->c_scn, &shdr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	strs = (char *)cache[shdr.sh_link].c_data->d_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	num = shdr.sh_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	 * Process the version definitions placing each on a version dependency
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	 * list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	for (_num = 1; _num <= num; _num++,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
	    vdf = (GElf_Verdef *)((uintptr_t)vdf + vdf->vd_next)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
		GElf_Half	cnt = vdf->vd_cnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
		GElf_Half	ndx = vdf->vd_ndx;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   841
		GElf_Verdaux	*vdap;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
		const char	*_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   844
		vdap = (GElf_Verdaux *)((uintptr_t)vdf + vdf->vd_aux);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   845
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
		 * Determine the version name and any dependencies.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
		_name = (char *)(strs + vdap->vda_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   851
		vdp = gvers_desc(_name, elf_hash(_name), &verdefs, file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
		vdp->vd_ndx = ndx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
		vdp->vd_flags = vdf->vd_flags | FLG_VER_AVAIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
		vdap = (GElf_Verdaux *)((uintptr_t)vdap + vdap->vda_next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
		for (cnt--; cnt; cnt--,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		    vdap = (GElf_Verdaux *)((uintptr_t)vdap + vdap->vda_next)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
			_name = (char *)(strs + vdap->vda_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
			if (gvers_depend(_name, elf_hash(_name), vdp,
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   860
			    &verdefs, file) == NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
		 * Remember the base version for possible later use.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
		if (ndx == VER_NDX_GLOBAL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
			bvdp = vdp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
	 * Normalize the dependency list if required.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
	if (nflag) {
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   875
		for (APLIST_TRAVERSE(verdefs, idx1, vdp)) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   876
			Aliste		idx2;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   877
			GVer_desc 	*_vdp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
			int		type = vdp->vd_flags & VER_FLG_WEAK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   880
			for (APLIST_TRAVERSE(vdp->vd_deps, idx2, _vdp))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
				gvers_derefer(_vdp, type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
		 * Always dereference the base version.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
		if (bvdp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
			bvdp->vd_flags &= ~FLG_VER_AVAIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	 * Traverse the dependency list and print out the appropriate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	 * information.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
	 */
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   896
	for (APLIST_TRAVERSE(verdefs, idx1, vdp)) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   897
		Aliste		idx2;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   898
		GVer_desc 	*_vdp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
		int		count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   901
		if (!match(NULL, vdp->vd_name, vdp->vd_ndx))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
			continue;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   903
		if ((alist_nitems(match_list) == 0) &&
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   904
		    !(vdp->vd_flags & FLG_VER_AVAIL))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
		error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
		if (vflag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
			 * If the verbose flag is set determine if this version
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
			 * has a `weak' attribute, and print any version
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
			 * dependencies this version inherits.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
			if (oflag)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   916
				(void) printf(MSG_ORIG(MSG_FMT_OFIL), file);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   917
			(void) printf(MSG_ORIG(MSG_FMT_VER_NAME), vdp->vd_name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   918
			if ((vdp->vd_flags & MSK_VER_USER) != 0) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   919
				Conv_ver_flags_buf_t	ver_flags_buf;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   920
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   921
				(void) printf(MSG_ORIG(MSG_FMT_VER_FLG),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   922
				    conv_ver_flags(
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   923
				    vdp->vd_flags & MSK_VER_USER,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   924
				    CONV_FMT_NOBKT, &ver_flags_buf));
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   925
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
			count = 1;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   928
			for (APLIST_TRAVERSE(vdp->vd_deps, idx2, _vdp)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
				const char	*_name = _vdp->vd_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
				if (count++ == 1) {
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   932
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
					if (oflag)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   934
						(void) printf(
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   935
						    MSG_ORIG(MSG_FMT_IN_OFLG),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   936
						    _name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
					else if (vdp->vd_flags & VER_FLG_WEAK)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   938
						(void) printf(
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   939
						    MSG_ORIG(MSG_FMT_IN_WEAK),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   940
						    _name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
					else
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   942
						(void) printf(
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   943
						    MSG_ORIG(MSG_FMT_IN),
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
						    _name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
				} else
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   946
					(void) printf(
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   947
					    MSG_ORIG(MSG_FMT_LIST_NEXT), _name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
			if (count != 1)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   951
				(void) printf(MSG_ORIG(MSG_FMT_IN_END));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   953
			if (vsdata && !oflag)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   954
				(void) printf(MSG_ORIG(MSG_FMT_COL_NL));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
			else
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   956
				(void) printf(MSG_ORIG(MSG_FMT_SEM_NL));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
		} else {
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   958
			if (vsdata && !oflag)
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   959
				(void) printf(MSG_ORIG(MSG_FMT_TNCO),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   960
				    vdp->vd_name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   961
			else if (!vsdata) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
				if (oflag)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   963
					(void) printf(MSG_ORIG(MSG_FMT_OFIL),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   964
					    file);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   965
				(void) printf(MSG_ORIG(MSG_FMT_TNSE),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   966
				    vdp->vd_name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   970
		/* If we are not printing symbols, we're done */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   971
		if (vsdata == NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
		/*
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   975
		 * If a specific version to match has been specified then
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   976
		 * display any of its own symbols plus any inherited from
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   977
		 * other versions. Otherwise simply print out the symbols
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   978
		 * for this version.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
		 */
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   980
		gvers_syms(vsdata, vdp->vd_ndx, vdp->vd_name, NULL, file);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   981
		if (alist_nitems(match_list) != 0) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   982
			recurse_syms(vsdata, vdp, file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
			/*
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   985
			 * If the verbose flag is set, and this is not
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   986
			 * the base version, then add the base version as a
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   987
			 * dependency.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
			 */
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   989
			if (vflag && bvdp &&
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   990
			    !match(NULL, bvdp->vd_name, bvdp->vd_ndx)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
				if (!oflag)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   992
					(void) printf(MSG_ORIG(MSG_FMT_TNCO),
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   993
					    bvdp->vd_name);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   994
				gvers_syms(vsdata, bvdp->vd_ndx,
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
   995
				    bvdp->vd_name, NULL, file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
main(int argc, char **argv, char **envp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
	GElf_Shdr	shdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
	Elf		*elf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
	Elf_Scn		*scn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
	Elf_Data	*data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
	GElf_Ehdr 	ehdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
	int		nfile, var;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
	char		*names;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
	Cache		*cache, *_cache;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
	Cache		*_cache_def, *_cache_need, *_cache_sym, *_cache_loc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
	int		error = 0;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1015
	Gver_sym_data 	vsdata_s;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1016
	const Gver_sym_data	*vsdata = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
	 * Check for a binary that better fits this architecture.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
	 */
2647
e440e3da2a6f 6464235 executing the 64-bit ld(1) should be easy
rie
parents: 1618
diff changeset
  1021
	(void) conv_check_native(argv, envp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
	 * Establish locale.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
	(void) setlocale(LC_MESSAGES, MSG_ORIG(MSG_STR_EMPTY));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
	(void) textdomain(MSG_ORIG(MSG_SUNW_OST_SGS));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
	cname = argv[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
	Cflag = dflag = lflag = nflag = oflag = rflag = sflag = vflag = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	opterr = 0;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1033
	while ((var = getopt(argc, argv, MSG_ORIG(MSG_STR_OPTIONS))) != EOF) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
		switch (var) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
		case 'C':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
			Cflag = USR_DEFINED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
		case 'd':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
			dflag = USR_DEFINED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
		case 'l':
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1042
			lflag = sflag = USR_DEFINED;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
		case 'n':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
			nflag = USR_DEFINED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
		case 'o':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
			oflag = USR_DEFINED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
		case 'r':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
			rflag = USR_DEFINED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
		case 's':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
			sflag = USR_DEFINED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
		case 'v':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
			vflag = USR_DEFINED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
			break;
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1059
		case 'I':
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
		case 'N':
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1061
			add_match_record(var, optarg);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
			(void) fprintf(stderr, MSG_INTL(MSG_USAGE_BRIEF),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
			    cname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
			(void) fprintf(stderr, MSG_INTL(MSG_USAGE_DETAIL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
	 * No files specified on the command line?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
	if ((nfile = argc - optind) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
		(void) fprintf(stderr, MSG_INTL(MSG_USAGE_BRIEF), cname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
	 * By default print both version definitions and needed dependencies.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
	 */
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1084
	if ((dflag == 0) && (rflag == 0) && (lflag == 0))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
		dflag = rflag = DEF_DEFINED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
	 * Open the input file and initialize the elf interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
	for (; optind < argc; optind++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
		int		derror = 0, nerror = 0,	err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
		const char	*file = argv[optind];
14228
f40648257ac6 4000 pvs can't deal with extended sections
Richard Lowe <richlowe@richlowe.net>
parents: 11993
diff changeset
  1093
		size_t		shnum = 0;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
		if ((var = open(file, O_RDONLY)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
			err = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
			(void) fprintf(stderr, MSG_INTL(MSG_SYS_OPEN),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
			    cname, file, strerror(err));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
			error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
		(void) elf_version(EV_CURRENT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
		if ((elf = elf_begin(var, ELF_C_READ, NULL)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
			(void) fprintf(stderr, MSG_ORIG(MSG_ELF_BEGIN), cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
			    file, elf_errmsg(elf_errno()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
			error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
			(void) close(var);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
		if (elf_kind(elf) != ELF_K_ELF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
			(void) fprintf(stderr, MSG_INTL(MSG_ELF_NOTELF), cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
			    file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
			error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
			(void) close(var);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
			(void) elf_end(elf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
		if (gelf_getehdr(elf, &ehdr) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
			(void) fprintf(stderr, MSG_ORIG(MSG_ELF_GETEHDR), cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
			    file, elf_errmsg(elf_errno()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
			error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
			(void) close(var);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
			(void) elf_end(elf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
		 *  Obtain the .shstrtab data buffer to provide the required
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
		 * section name strings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
		if ((scn = elf_getscn(elf, ehdr.e_shstrndx)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
			(void) fprintf(stderr, MSG_ORIG(MSG_ELF_GETSCN), cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
			    file, elf_errmsg(elf_errno()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
			error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
			(void) close(var);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
			(void) elf_end(elf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
		if ((data = elf_getdata(scn, NULL)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
			(void) fprintf(stderr, MSG_ORIG(MSG_ELF_GETDATA), cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
			    file, elf_errmsg(elf_errno()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
			error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
			(void) close(var);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
			(void) elf_end(elf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
		names = data->d_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
		 * Fill in the cache descriptor with information for each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
		 * section we might need.   We probably only need to save
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
		 * read-only allocable sections as this is where the version
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
		 * structures and their associated symbols and strings live.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
		 * However, God knows what someone can do with a mapfile, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
		 * as elf_begin has already gone through all the overhead we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
		 * might as well set up the cache for every section.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
		 */
14228
f40648257ac6 4000 pvs can't deal with extended sections
Richard Lowe <richlowe@richlowe.net>
parents: 11993
diff changeset
  1158
		if (elf_getshdrnum(elf, &shnum) == -1) {
f40648257ac6 4000 pvs can't deal with extended sections
Richard Lowe <richlowe@richlowe.net>
parents: 11993
diff changeset
  1159
			(void) fprintf(stderr, MSG_ORIG(MSG_ELF_GETSHDRNUM),
f40648257ac6 4000 pvs can't deal with extended sections
Richard Lowe <richlowe@richlowe.net>
parents: 11993
diff changeset
  1160
			    cname, file, elf_errmsg(elf_errno()));
f40648257ac6 4000 pvs can't deal with extended sections
Richard Lowe <richlowe@richlowe.net>
parents: 11993
diff changeset
  1161
			exit(1);
f40648257ac6 4000 pvs can't deal with extended sections
Richard Lowe <richlowe@richlowe.net>
parents: 11993
diff changeset
  1162
		}
f40648257ac6 4000 pvs can't deal with extended sections
Richard Lowe <richlowe@richlowe.net>
parents: 11993
diff changeset
  1163
f40648257ac6 4000 pvs can't deal with extended sections
Richard Lowe <richlowe@richlowe.net>
parents: 11993
diff changeset
  1164
		if ((cache = calloc(shnum, sizeof (Cache))) == NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
			int err = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
			(void) fprintf(stderr, MSG_INTL(MSG_SYS_MALLOC), cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
			    file, strerror(err));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1171
		_cache_def = _cache_need = _cache_sym = _cache_loc = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
		_cache = cache;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
		_cache++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
		for (scn = NULL; scn = elf_nextscn(elf, scn); _cache++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
			if (gelf_getshdr(scn, &shdr) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
				(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
				    MSG_ORIG(MSG_ELF_GETSHDR), cname, file,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
				    elf_errmsg(elf_errno()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
				error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
			if ((_cache->c_data = elf_getdata(scn, NULL)) ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
			    NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
				(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
				    MSG_ORIG(MSG_ELF_GETDATA), cname, file,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
				    elf_errmsg(elf_errno()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
				error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
			_cache->c_scn = scn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
			_cache->c_name = names + shdr.sh_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
			 * Remember the version sections and symbol table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
			 */
2766
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1196
			switch (shdr.sh_type) {
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1197
			case SHT_SUNW_verdef:
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1198
				if (dflag)
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1199
					_cache_def = _cache;
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1200
				break;
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1201
			case SHT_SUNW_verneed:
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1202
				if (rflag)
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1203
					_cache_need = _cache;
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1204
				break;
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1205
			case SHT_SUNW_versym:
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1206
				if (sflag)
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1207
					_cache_sym = _cache;
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1208
				break;
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1209
			case SHT_SYMTAB:
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1210
				if (lflag)
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1211
					_cache_loc = _cache;
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1212
				break;
897bcb036a29 PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition
ab196087
parents: 2647
diff changeset
  1213
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
		 * Before printing anything out determine if any warnings are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
		 * necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
		 */
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1220
		if (lflag && (_cache_loc == NULL)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
			(void) fprintf(stderr, MSG_INTL(MSG_VER_UNREDSYMS),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
			    cname, file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
			(void) fprintf(stderr, MSG_INTL(MSG_VER_NOSYMTAB));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
		 * If there is more than one input file, and we're not printing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
		 * one-line output, display the filename being processed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
		if ((nfile > 1) && !oflag)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1231
			(void) printf(MSG_ORIG(MSG_FMT_FILE), file);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1232
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1233
		/*
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1234
		 * If we're printing symbols, then collect the data
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1235
		 * necessary to do that.
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1236
		 */
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1237
		if (_cache_sym != NULL) {
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1238
			vsdata = &vsdata_s;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1239
			(void) gelf_getshdr(_cache_sym->c_scn, &shdr);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1240
			vsdata_s.vsd_vsp =
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1241
			    (GElf_Versym *)_cache_sym->c_data->d_buf;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1242
			vsdata_s.vsd_sym_data = cache[shdr.sh_link].c_data;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1243
			(void) gelf_getshdr(cache[shdr.sh_link].c_scn, &shdr);
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1244
			vsdata_s.vsd_symn = shdr.sh_size / shdr.sh_entsize;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1245
			vsdata_s.vsd_strs =
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1246
			    (const char *)cache[shdr.sh_link].c_data->d_buf;
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1247
		}
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1248
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
		 * Print the files version needed sections.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
		if (_cache_need)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1254
			nerror = gvers_need(cache, _cache_need, vsdata, file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
		 * Print the files version definition sections.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
		if (_cache_def)
7682
b04d06fd448f 6749055 ld should generate GNU style VERSYM indexes for VERNEED records
Ali Bahrami <Ali.Bahrami@Sun.COM>
parents: 2766
diff changeset
  1260
			derror = gvers_def(cache, _cache_def, vsdata, file);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
		 * Print any local symbol reductions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
		if (_cache_loc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
			sym_local(cache, _cache_loc, file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
		 * Determine the error return.  There are three conditions that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
		 * may produce an error (a non-zero return):
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
		 *  o	if the user specified -d and no version definitions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
		 *	were found.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
		 *  o	if the user specified -r and no version requirements
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
		 *	were found.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
		 *  o	if the user specified neither -d or -r, (thus both are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
		 *	enabled by default), and no version definitions or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
		 *	version dependencies were found.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
		if (((dflag == USR_DEFINED) && (derror == 0)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
		    ((rflag == USR_DEFINED) && (nerror == 0)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
		    (rflag && dflag && (derror == 0) && (nerror == 0)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
			error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
		(void) close(var);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
		(void) elf_end(elf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
		free(cache);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
_pvs_msg(Msg mid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
	return (gettext(MSG_ORIG(mid)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
}