xref: /illumos-gate/usr/src/cmd/sgs/libelf/common/member.h (revision edd580643f2cf1434e252cd7779e83182ea84945)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1988 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 /*
27  * Copyright (c) 1995 by Sun Microsystems, Inc.
28  * All rights reserved.
29  */
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI" 	/* SVr4.0 1.2	*/
32 
33 
34 
35 /*
36  * Member handling
37  *	Archive members have an ASCII header.  A Member structure
38  *	holds internal information.  Because the ASCII file header
39  *	may be clobbered, Member holds a private, safe copy.
40  *	The ar_name member of m_hdr points at m_name except for string
41  *	table names.  Ar_rawname in m_hdr always points at m_raw.
42  *
43  *	m_raw	The original ar_name with null termination.
44  *		E.g., "name/           "
45  *
46  *	m_name	The processed name, with '/' terminator changed to '\0'.
47  *		Unused for string table names.  E.g., "name\0           "
48  *
49  *	To improve performance of member lookup we allocate lists which
50  * 	contain MEMIDENTNO members:
51  *
52  *	ed_memlist -->   ---------------------
53  *			|       m_next        |
54  *			|       m_end         |
55  *			|       m_free        |
56  *			|---------------------|
57  *			| m_offset | m_member |
58  *			| m_offset | m_member |
59  *			|     "    |    "     |
60  *			 ---------------------
61  */
62 
63 
64 #define	ARSZ(m)		(sizeof ((struct ar_hdr *)0)->m)
65 
66 #define	MEMIDENTNO	126
67 
68 struct	Member
69 {
70 	Elf_Arhdr	m_hdr;
71 	int		m_err;
72 	long		m_slide;
73 	char		m_raw[ARSZ(ar_name)+1];
74 	char		m_name[ARSZ(ar_name)+1];
75 };
76 
77 struct	Memident
78 {
79 	char *		m_offset;
80 	struct Member *	m_member;
81 };
82 
83 struct	Memlist
84 {
85 	struct Memlist *	m_next;
86 	struct Memident *	m_end;
87 	struct Memident *	m_free;
88 };
89