summaryrefslogtreecommitdiff
path: root/usr/src/cmd/sgs/mcs/common/mcs.h
blob: f4cfa113c2fd099abdbf0b57eeced84b370cfcff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 *	Copyright (c) 1988 AT&T
 *	  All Rights Reserved
 *
 *
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
/*
 * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
 */

#ifndef	_MCS_H
#define	_MCS_H

#ifdef	__cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include <libelf.h>
#include <ar.h>
#include <string.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <memory.h>
#include <locale.h>
#include <sys/mman.h>
#include "sgs.h"
#include "gelf.h"

#define	FORMAT	"%-16s%-12ld%-6u%-6u%-8o%-10ld%-2s"
#define	ROUNDUP(x)	(((x) + 1) & ~1)
#define	TMPDIR	"/tmp"

#define	DELETED	-1	/* The section will be removed */
#define	NULLED  -2	/* The section will be nulled */
#define	EXPANDED -3	/* The size of the section expanded */
#define	SHRUNK -4	/* The section shrinked */

#define	ACT_NOP		0x00000000
#define	ACT_DELETE	0x00000001
#define	ACT_PRINT	0x00000002
#define	ACT_COMPRESS	0x00000003
#define	ACT_APPEND	0x00000004
#define	ACT_ZAP		0x00000005
#define	SET_ACTION(x, y)	x = (x & 0xfffffff0) | y
#define	GET_ACTION(x)		(x & 0x0000000f)

#define	NOSEG		0x00000010
#define	IN		0x00000020 /* section is IN a segment */
#define	PRIOR		0x00000030 /* section is PRIOR to a segment */
#define	AFTER		0x00000040 /* section is AFTER a segment */
#define	SET_LOC(x, y)	x = (x & 0xffffff0f) | y
#define	GET_LOC(x)	(x & 0x000000f0)

#define	CANDIDATE	0x00000100
#define	MOVING		0x00000200
#define	MODIFIED	0x00000400

#define	UNSET_CANDIDATE(x)	x = x & ~CANDIDATE
#define	SET_CANDIDATE(x)	x = x | CANDIDATE
#define	ISCANDIDATE(x)		(x & CANDIDATE)
#define	SET_MOVING(x)		x = (x | MOVING)
#define	GET_MOVING(x)		(x & MOVING)
#define	SET_MODIFIED(x)		x = (x | MODIFIED)
#define	GET_MODIFIED(x)		(x & MODIFIED)

#define	FAILURE 1
#define	SUCCESS 0

#define	DONT_BUILD 3 /* this code is used to prevent building a new file */
		/* because mcs was given only -p */


#define	MCS	1
#define	STRIP	2
#define	STR_STRIP	"strip"

/*
 * Structure to hold section information.
 */
typedef struct section_info_table {
	/*
	 * Section information.
	 */
	Elf_Scn		*scn;		/* Section */
	Elf_Data	*data;		/* Original data */
	Elf_Data	*mdata;		/* Modified data */
	char		*name;		/* Section name, or NULL if unknown */
	char		*rel_name;
	GElf_Shdr	shdr;
	GElf_Word	secno;		/* The new index */
	GElf_Word	osecno;		/* The original index */
	GElf_Word	rel_scn_index;
	GElf_Xword	si_flags;
	GElf_Xword	rel_loc;
} section_info_table;

/*
 * Structure to hold action information
 */
typedef struct action {
	int a_action;		/* Which action to take ? */
	int a_cnt;		/* Am I applied ? */
	char *a_string;		/* The string to be added. */
} action;

/*
 * Structure to hold the section names specified.
 */
typedef struct s_name {
	char		*name;
	struct s_name	*next;
	unsigned char	flags;
} S_Name;
#define	SECT_NAME	sect_head->name
#define	SNAME_FLG_STRNCMP	0x01	/* Use strncmp() instead of strcmp() */
					/* for section name comparison. */

/*
 * Structure to hold command information
 */
typedef struct cmd_info {
	APlist	*sh_groups;	/* list of SHT_GROUP sections */
	int	no_of_append;
	int	no_of_delete;
	int	no_of_nulled;
	int	no_of_compressed;
	int	no_of_moved;
	size_t	str_size;	/* size of string to be appended */
	int	ci_flags;	/* Various flags */
} Cmd_Info;

#define	MIGHT_CHG	0x0001
#define	aFLAG		0x0002
#define	cFLAG		0x0004
#define	dFLAG		0x0008
#define	lFLAG		0x0010
#define	pFLAG		0x0020
#define	xFLAG		0x0040
#define	VFLAG		0x0080
#define	zFLAG		0x0100
#define	I_AM_STRIP	0x0200
#define	SHF_GROUP_MOVE	0x0400	/* SHF_GROUP section moves */
#define	SHF_GROUP_DEL	0x0800	/* SHF_GROUP section deleted */

#define	CHK_OPT(_x, _y)	(((_x)->ci_flags & (_y)) != 0)
#define	SET_OPT(_x, _y)	((_x)->ci_flags |= (_y))

/*
 * Segment Table
 */
typedef struct seg_table {
	GElf_Off	p_offset;
	GElf_Xword	p_memsz;
	GElf_Xword	p_filesz;
} Seg_Table;

/*
 * Temporary files
 */
typedef struct {
	const char	*tmp_name;	/* NULL, or name of temp file */
	int		tmp_unlink;   /* True if should unlink prior to exit */
} Tmp_File;

/*
 * Function prototypes.
 */
int		apply_action(section_info_table *, char *, Cmd_Info *);
int		each_file(char *, Cmd_Info *);
void		error_message(int, ...);
void		mcs_exit(int);
int		sectcmp(char *);
void		free_tempfile(Tmp_File *);

/*
 * Error messages
 */
#define	MALLOC_ERROR		0
#define	USAGE_ERROR		1
#define	ELFVER_ERROR		2
#define	OPEN_ERROR		3
#define	LIBELF_ERROR		4
#define	OPEN_TEMP_ERROR		5
#define	WRITE_ERROR		6
#define	GETARHDR_ERROR		7
#define	FILE_TYPE_ERROR		8
#define	NOT_MANIPULATED_ERROR	9
#define	WRN_MANIPULATED_ERROR	10
#define	NO_SECT_TABLE_ERROR	11
#define	READ_ERROR		12
#define	READ_MANI_ERROR		13
#define	WRITE_MANI_ERROR	14
#define	LSEEK_MANI_ERROR	15
#define	SYM_TAB_AR_ERROR	16
#define	EXEC_AR_ERROR		17
#define	READ_SYS_ERROR		18
#define	OPEN_WRITE_ERROR	19
#define	ACT_PRINT_ERROR		20
#define	ACT_DELETE1_ERROR	21
#define	ACT_DELETE2_ERROR	22
#define	ACT_APPEND1_ERROR	23
#define	ACT_APPEND2_ERROR	24
#define	ACT_COMPRESS1_ERROR	25
#define	ACT_COMPRESS2_ERROR	26
#define	ACCESS_ERROR		27
#define	WRITE_MANI_ERROR2	28

#define	PLAIN_ERROR	0
#define	LIBelf_ERROR	1
#define	SYSTEM_ERROR	2

#ifdef	__cplusplus
}
#endif

#endif	/* _MCS_H */