]>
git.saurik.com Git - apple/libc.git/blob - gen/nlist.c
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
26 * Redistribution and use in source and binary forms, with or without
27 * modification, are permitted provided that the following conditions
29 * 1. Redistributions of source code must retain the above copyright
30 * notice, this list of conditions and the following disclaimer.
31 * 2. Redistributions in binary form must reproduce the above copyright
32 * notice, this list of conditions and the following disclaimer in the
33 * documentation and/or other materials provided with the distribution.
34 * 3. All advertising materials mentioning features or use of this software
35 * must display the following acknowledgement:
36 * This product includes software developed by the University of
37 * California, Berkeley and its contributors.
38 * 4. Neither the name of the University nor the names of its contributors
39 * may be used to endorse or promote products derived from this software
40 * without specific prior written permission.
42 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 /* temporarily comment this file out for LP64, until code can be modified */
59 #include <sys/types.h>
65 /* Stuff lifted from <a.out.h> and <sys/exec.h> since they are gone */
67 * Header prepended to each a.out file.
70 unsigned short a_machtype
; /* machine type */
71 unsigned short a_magic
; /* magic number */
72 unsigned long a_text
; /* size of text segment */
73 unsigned long a_data
; /* size of initialized data */
74 unsigned long a_bss
; /* size of uninitialized data */
75 unsigned long a_syms
; /* size of symbol table */
76 unsigned long a_entry
; /* entry point */
77 unsigned long a_trsize
; /* size of text relocation */
78 unsigned long a_drsize
; /* size of data relocation */
81 #define OMAGIC 0407 /* old impure format */
82 #define NMAGIC 0410 /* read-only text */
83 #define ZMAGIC 0413 /* demand load format */
86 (((x).a_magic)!=OMAGIC && ((x).a_magic)!=NMAGIC && ((x).a_magic)!=ZMAGIC)
88 ((x).a_magic==ZMAGIC ? 0 : sizeof (struct exec))
90 (N_TXTOFF(x) + (x).a_text+(x).a_data + (x).a_trsize+(x).a_drsize)
92 #include <mach/mach.h>
93 #include <mach-o/nlist.h>
95 #include <mach-o/loader.h>
96 #include <mach-o/fat.h>
99 * CPUSUBTYPE_SUPPORT should be changed to non-zero once the
100 * cpusubtype_* routines are available in libc.
102 #define CPUSUBTYPE_SUPPORT 0
104 int __fdnlist(int fd
, struct nlist
*list
);
107 * nlist - retreive attributes from name list (string table version)
117 fd
= open(name
, O_RDONLY
, 0);
120 n
= __fdnlist(fd
, list
);
125 /* Note: __fdnlist() is called from kvm_nlist in libkvm's kvm.c */
132 register struct nlist
*p
, *q
;
133 register char *s1
, *s2
;
136 off_t sa
; /* symbol address */
137 off_t ss
; /* start of strings */
139 struct nlist space
[BUFSIZ
/sizeof (struct nlist
)];
140 unsigned arch_offset
= 0;
143 for (q
= list
, nreq
= 0; q
->n_un
.n_name
&& q
->n_un
.n_name
[0]; q
++, nreq
++) {
148 n
= strlen(q
->n_un
.n_name
);
152 if (read(fd
, (char *)&buf
, sizeof(buf
)) != sizeof(buf
) ||
153 (N_BADMAG(buf
) && *((long *)&buf
) != MH_MAGIC
&&
154 NXSwapBigLongToHost(*((long *)&buf
)) != FAT_MAGIC
)) {
158 /* Deal with fat file if necessary */
159 if (NXSwapBigLongToHost(*((long *)&buf
)) == FAT_MAGIC
) {
160 struct host_basic_info hbi
;
161 struct fat_header fh
;
162 struct fat_arch
*fat_archs
, *fap
;
166 /* Get our host info */
167 host
= mach_host_self();
168 i
= HOST_BASIC_INFO_COUNT
;
169 if (host_info(host
, HOST_BASIC_INFO
,
170 (host_info_t
)(&hbi
), &i
) != KERN_SUCCESS
) {
173 mach_port_deallocate(mach_task_self(), host
);
175 /* Read in the fat header */
176 lseek(fd
, 0, SEEK_SET
);
177 if (read(fd
, (char *)&fh
, sizeof(fh
)) != sizeof(fh
)) {
181 /* Convert fat_narchs to host byte order */
182 fh
.nfat_arch
= NXSwapBigLongToHost(fh
.nfat_arch
);
184 /* Read in the fat archs */
185 fat_archs
= (struct fat_arch
*)malloc(fh
.nfat_arch
*
186 sizeof(struct fat_arch
));
187 if (fat_archs
== NULL
) {
190 if (read(fd
, (char *)fat_archs
,
191 sizeof(struct fat_arch
) * fh
.nfat_arch
) !=
192 sizeof(struct fat_arch
) * fh
.nfat_arch
) {
198 * Convert archs to host byte ordering (a constraint of
199 * cpusubtype_getbestarch()
201 for (i
= 0; i
< fh
.nfat_arch
; i
++) {
202 fat_archs
[i
].cputype
=
203 NXSwapBigLongToHost(fat_archs
[i
].cputype
);
204 fat_archs
[i
].cpusubtype
=
205 NXSwapBigLongToHost(fat_archs
[i
].cpusubtype
);
206 fat_archs
[i
].offset
=
207 NXSwapBigLongToHost(fat_archs
[i
].offset
);
209 NXSwapBigLongToHost(fat_archs
[i
].size
);
211 NXSwapBigLongToHost(fat_archs
[i
].align
);
214 #if CPUSUBTYPE_SUPPORT
215 fap
= cpusubtype_getbestarch(hbi
.cpu_type
, hbi
.cpu_subtype
,
216 fat_archs
, fh
.nfat_arch
);
218 #warning Use the cpusubtype functions!!!
220 for (i
= 0; i
< fh
.nfat_arch
; i
++) {
221 if (fat_archs
[i
].cputype
== hbi
.cpu_type
) {
226 #endif /* CPUSUBTYPE_SUPPORT */
231 arch_offset
= fap
->offset
;
234 /* Read in the beginning of the architecture-specific file */
235 lseek(fd
, arch_offset
, SEEK_SET
);
236 if (read(fd
, (char *)&buf
, sizeof(buf
)) != sizeof(buf
)) {
241 if (*((long *)&buf
) == MH_MAGIC
) {
242 struct mach_header mh
;
243 struct load_command
*load_commands
, *lcp
;
244 struct symtab_command
*stp
;
247 lseek(fd
, arch_offset
, SEEK_SET
);
248 if (read(fd
, (char *)&mh
, sizeof(mh
)) != sizeof(mh
)) {
251 load_commands
= (struct load_command
*)malloc(mh
.sizeofcmds
);
252 if (load_commands
== NULL
) {
255 if (read(fd
, (char *)load_commands
, mh
.sizeofcmds
) !=
262 for (i
= 0; i
< mh
.ncmds
; i
++) {
263 if (lcp
->cmdsize
% sizeof(long) != 0 ||
265 (char *)lcp
+ lcp
->cmdsize
>
266 (char *)load_commands
+ mh
.sizeofcmds
) {
270 if (lcp
->cmd
== LC_SYMTAB
) {
272 sizeof(struct symtab_command
)) {
276 stp
= (struct symtab_command
*)lcp
;
279 lcp
= (struct load_command
*)
280 ((char *)lcp
+ lcp
->cmdsize
);
286 sa
= stp
->symoff
+ arch_offset
;
287 ss
= stp
->stroff
+ arch_offset
;
288 n
= stp
->nsyms
* sizeof(struct nlist
);
292 sa
= N_SYMOFF(buf
) + arch_offset
;
293 ss
= sa
+ buf
.a_syms
+ arch_offset
;
297 lseek(fd
, sa
, SEEK_SET
);
304 if (read(fd
, (char *)space
, m
) != m
)
307 savpos
= lseek(fd
, 0, SEEK_CUR
);
308 for (q
= space
; (m
-= sizeof(struct nlist
)) >= 0; q
++) {
311 if (q
->n_un
.n_strx
== 0 || q
->n_type
& N_STAB
)
313 lseek(fd
, ss
+q
->n_un
.n_strx
, SEEK_SET
);
314 read(fd
, nambuf
, maxlen
+1);
315 for (p
= list
; p
->n_un
.n_name
&& p
->n_un
.n_name
[0]; p
++) {
324 p
->n_value
= q
->n_value
;
325 p
->n_type
= q
->n_type
;
326 p
->n_desc
= q
->n_desc
;
327 p
->n_sect
= q
->n_sect
;
334 lseek(fd
, savpos
, SEEK_SET
);
339 #endif /* !__LP64__ */