[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Gcl-devel] Re: ACL2 Version 4.0
From: |
Matt Kaufmann |
Subject: |
Re: [Gcl-devel] Re: ACL2 Version 4.0 |
Date: |
Tue, 27 Jul 2010 15:49:07 -0500 |
Hi, Camm --
Sorry about that trouble with pathname-device, and thanks a lot for
your help on this Windows issue. I'm removing the following check
from the definition of lp in ACL2 source file interface-raw.lisp, for
future versions; I think it was misguided (overly defensive
programming), my mistake.
(when (not (equal (subseq str 0 posn)
(pathname-device path)))
(er soft 'LP
"The value of ~x0 is ~x1 while the value of ~x2 is ~x3, but ~
we expected these two values to be the same! Note that ~
the value of ~x4 is ~x5. Feel free to contact the ACL2 ~
implementors about this problem."
`(subseq ,str 0 ,posn)
(subseq str 0 posn)
`(pathname-device ,path)
(pathname-device path)
'(namestring (truename ""))
str)
(return-from lp nil))
So the definition of lp is now:
(defun lp (&rest args)
; This function can only be called from within raw lisp, because no
; ACL2 function mentions it. Thus, we assume we are in raw lisp.
; This is the top-level entry to ACL2. Note that truename can cause an error
; in some Common Lisps when the given file or directory does not exist. Hence,
; we sometimes call truename on "" rather than on a file name.
(let ((state *the-live-state*)
#+(and gcl (not ansi-cl))
(lisp::*break-enable* (debugger-enabledp *the-live-state*))
(raw-p
(cond
((null args) nil)
((equal args '(raw)) 'raw)
(t (error "LP either takes no args or a single argument, 'raw.")))))
(cond
((> *ld-level* 0)
(when (raw-mode-p *the-live-state*)
(fms "You have attempted to enter the ACL2 read-eval-print loop from ~
within raw mode. However, you appear already to be in that ~
loop. If your intention is to leave raw mode, then execute: ~
:set-raw-mode nil.~|"
nil (standard-co *the-live-state*) *the-live-state* nil))
(return-from lp nil))
(*lp-ever-entered-p*
(f-put-global 'standard-oi
(if (and raw-p (not (raw-mode-p state)))
(cons '(set-raw-mode t)
*standard-oi*)
*standard-oi*)
*the-live-state*)
(with-suppression ; package locks, not just warnings; to read 'cl::foo
(ld-fn (f-get-ld-specials *the-live-state*)
*the-live-state*
nil)))
(t (eval `(in-package ,*startup-package-name*)) ;only changes raw Lisp pkg
; Acl2-default-restart isn't enough in Allegro, at least, to get the new prompt
; when we start up:
(let* ((system-dir (let ((str (getenv$-raw "ACL2_SYSTEM_BOOKS")))
(and str
(maybe-add-separator str))))
(save-expansion (let ((s (getenv$-raw "ACL2_SAVE_EXPANSION")))
(and s
(not (equal s ""))
(not (equal (string-upcase s)
"NIL")))))
(user-home-dir-path (user-homedir-pathname))
(user-home-dir0 (and user-home-dir-path
(namestring (truename user-home-dir-path))))
(user-home-dir (if (eql (char user-home-dir0
(1- (length user-home-dir0)))
*directory-separator*)
(subseq user-home-dir0
0
(1- (length user-home-dir0)))
user-home-dir0)))
(f-put-global 'distributed-books-dir
(cond (system-dir (canonical-dirname!
(unix-full-pathname system-dir)
'lp
*the-live-state*))
(t (f-get-global 'distributed-books-dir
*the-live-state*)))
*the-live-state*)
(when (and save-expansion
(not (equal (string-upcase save-expansion)
"NIL")))
(f-put-global 'save-expansion-file t *the-live-state*))
(when user-home-dir
(f-put-global 'user-home-dir user-home-dir *the-live-state*)))
#-hons
; Hons users are presumably advanced enough to tolerate the lack of a
; "[RAW LISP]" prompt.
(install-new-raw-prompt)
(setq *lp-ever-entered-p* t)
#+(and (not acl2-loop-only) acl2-rewrite-meter)
(setq *rewrite-depth-alist* nil)
; Without the following call, it was impossible to read and write with ACL2 I/O
; functions to *standard-co* in CLISP 2.30. Apparently the appropriate Lisp
; streams at the time of the build were closed when the ACL2 image was brought
; up. So we "refresh" the appropriate property lists with the current such
; Lisp streams.
(setup-standard-io)
; The following applies to CLISP 2.30, where charset:iso-8859-1 is defined, not
to
; CLISP 2.27, where charset:utf-8 is not defined. It apparently has to be
; executed in the current Lisp session. We tried executing the following form
; before saving an image, but the value of custom:*default-file-encoding* at
; startup was #<ENCODING CHARSET:ASCII :UNIX>.
#+(and clisp unicode)
(setq custom:*default-file-encoding* charset:iso-8859-1)
#+gcl
; In GCL, at least through Version 2.6.7, there are only 1024 indices n
; available for the #n= reader macro. That is such a small number that for
; GCL, we turn off the use of this reader macro when printing out files such as
; .cert files.
(f-put-global 'print-circle-files nil state)
#+mswindows
(cond
((null (f-get-global 'mswindows-drive *the-live-state*))
(let* ((path (truename ""))
(str (namestring path))
(posn (position #\: str)))
(cond
((null posn)
(er soft 'LP
"We are unable to determine the drive using ~
(namestring (truename \"\")), which evaluates to ~p0."
str)
(return-from lp nil)))
(f-put-global 'mswindows-drive
(subseq str 0 (1+ posn))
*the-live-state*))))
(cond ((f-get-global 'connected-book-directory *the-live-state*) nil)
((null *initial-cbd*)
(setq *initial-cbd* (our-pwd))
; In CCL, it seems that *initial-cbd* as computed above could give a string
; not ending in "/". We fix that here.
(cond ((and (stringp *initial-cbd*)
(not (equal *initial-cbd* ""))
(not (eql (char *initial-cbd*
(1- (length *initial-cbd*)))
#\/)))
(setq *initial-cbd*
(concatenate 'string *initial-cbd* "/"))))
(cond ((not (absolute-pathname-string-p
*initial-cbd*
t
(os (w *the-live-state*))))
(er soft 'LP
"Our guess for the initial setting of cbd, ~x0, ~
which was generated by (our-pwd), is not a legal ~
directory! Before entering ACL2, please setq ~
*initial-cbd* to a nonempty string that represents ~
an absolute ACL2 (i.e., Unix-style) pathname. ~
Sorry for the inconvenience."
*initial-cbd*)
(return-from lp nil)))
(f-put-global 'connected-book-directory *initial-cbd*
*the-live-state*))
((not (absolute-pathname-string-p *initial-cbd*
t
(os (w *the-live-state*))))
(er soft 'LP
"The current setting of *initial-cbd*, ~x0, is ~
not a directory. Before entering ACL2, please ~
setq *initial-cbd* to a nonempty string that ~
represents the absolute ACL2 (i.e., Unix-style) ~
pathname of a directory. See :DOC cbd."
*initial-cbd*
*directory-separator*)
(return-from lp nil))
(t
(f-put-global 'connected-book-directory *initial-cbd*
*the-live-state*)))
(let ((customization-full-file-name
(initial-customization-filename)))
(cond
((or (eq customization-full-file-name :none)
(global-val 'boot-strap-flg (w state)))
nil)
(customization-full-file-name
; If the ACL2 customization file exists (and we are not booting) then it hasn't
; been included yet, and we include it now.
(fms "Customizing with ~x0.~%"
(list (cons #\0 customization-full-file-name))
*standard-co*
state
nil)
(let ((old-infixp (f-get-global 'infixp *the-live-state*)))
(f-put-global 'infixp nil *the-live-state*)
(with-suppression ; package locks, not just warnings, for read
(ld-fn (put-assoc-eq
'standard-oi
(if (and raw-p (not (raw-mode-p state)))
(cons '(set-raw-mode t)
customization-full-file-name)
customization-full-file-name)
(put-assoc-eq
'ld-error-action :return
(f-get-ld-specials *the-live-state*)))
*the-live-state*
nil))
(f-put-global 'infixp old-infixp *the-live-state*)))))
(f-put-global 'standard-oi
(if (and raw-p (not (raw-mode-p state)))
(cons '(set-raw-mode t)
*standard-oi*)
*standard-oi*)
*the-live-state*)
(f-put-global 'ld-error-action :continue *the-live-state*)
(with-suppression ; package locks, not just warnings; to read 'cl::foo
(ld-fn (f-get-ld-specials state)
*the-live-state*
nil))))
(fms "Exiting the ACL2 read-eval-print loop. To re-enter, execute (LP)."
nil *standard-co* *the-live-state* nil)
(values)))
Feel free to make this change in your copy of ACL2 Version 4.0. But
then I'd appreciate it if when you save the image with save-exec, you
add a bit about this, for example modifying your saved_acl2.c target
as shown below.
saved_acl2.c: saved_acl2
echo "(f-put-global 'old-certification-dir \"$$(pwd)/books\" state)" \
"(f-put-global 'new-certification-dir \"/usr/share/$(PD)/books\"
state)" \
":q #+(or sparc sparc64)(progn (si::sgc-on nil) (fmakunbound
'si::sgc-on))" \
"(save-exec \"address@hidden" \"Modified with LP fix for Windows
from ACL2 developers, and to produce final certification files\")" | ./$<
Thanks --
-- Matt
Cc: address@hidden
From: Camm Maguire <address@hidden>
Date: Tue, 27 Jul 2010 13:24:44 -0400
X-SpamAssassin-Status: No, hits=-2.2 required=5.0
X-UTCS-Spam-Status: No, hits=-242 required=165
Greetings!
Matt Kaufmann <address@hidden> writes:
> Hi, Camm --
>
> ACL2 expected that a call of pathname-device on
> #pZ:/home/camm/debian/acl2/acl2-4.0/ would return the string "Z".
> Here, that path was the value of (truename ""). I confess that I
> don't think much about pathname-device or Windows, and whatever
> thinking I did, I didn't document well.
>
Me too!
> What do you get when evaluating (pathname-device (truename "")) in
> that same directory?
>
(pathname-device (truename ""))
("Z:")
>
Why this is a list (like pathname-directory, I guess) I do not really
know. I can't find anything in the lisp standard that really says
what this should be.
Take care,
> Thanks --
> -- Matt
> Cc: address@hidden
> From: Camm Maguire <address@hidden>
> Date: Tue, 27 Jul 2010 12:27:07 -0400
> X-SpamAssassin-Status: No, hits=-2.2 required=5.0
> X-UTCS-Spam-Status: No, hits=-242 required=165
>
> Greetings, and thanks! I should have an updated file for you to try
> soon.
>
> Running acl2 under wine emulation for windows, I successfully built
> saved_acl2, but run into this when executing:
>
> GCL (GNU Common Lisp) 2.6.8 CLtL1 Jul 26 2010 22:47:17
> Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)
> Binary License: GPL due to GPL'ed components: (UNEXEC)
> Modifications of this banner must retain notice of a compatible license
> Dedicated to the memory of W. Schelter
>
> Use (help) to get some basic information on how to use GCL.
> Temporary directory for compiler files set to
/home/camm/debian/gcl/gcl8mac2/unixport/
>
> ACL2 Version 4.0 built July 27, 2010 15:56:04.
> Copyright (C) 2010 University of Texas at Austin
> ACL2 comes with ABSOLUTELY NO WARRANTY. This is free software and you
> are welcome to redistribute it under certain conditions. For details,
> see the GNU General Public License.
>
> Initialized with (INITIALIZE-ACL2 'INCLUDE-BOOK *ACL2-PASS-2-FILES*).
> See the documentation topic note-4-0 for recent changes.
> Note: We have modified the prompt in some underlying Lisps to further
> distinguish it from the ACL2 prompt.
>
>
> ACL2 Error in LP: The value of
> (SUBSEQ "Z:/home/camm/debian/acl2/acl2-4.0/" 0 1) is "Z" while the
> value of (PATHNAME-DEVICE
> Error: Prin1$ called on an illegal object
#pZ:/home/camm/debian/acl2/acl2-4.0/
>
> .
> Fast links are on: do (si::use-fast-links nil) for debugging
> Error signalled by LISP:LAMBDA-CLOSURE.
> Backtrace: funcall > system:top-level > lisp:lambda-closure > lp >
system:universal-error-handler > system::break-level-for-acl2 > let* > UNLESS
>
> ...
>
> Just typing (lp) at the ACL2> prompt and :q (si::save-syste "...")
> gives me a binary that starts cleanly, but cannot certify anything:
>
> | HARD ACL2 ERROR in CBD: The connected book directory has
apparently
> | not yet been set. This could be a sign that the top-level ACL2
loop,
> | generally entered using (LP), has not yet been entered.
> |
>
>
> Can you point out to me the problem? There is an obvious difficulty
> in this environment interpolating between windows and unix pathnames.
>
> Take care,
>
>
> Matt Kaufmann <address@hidden> writes:
>
> > Hi, Camm --
> >
> > I've attached a log showing those files (on my Intel-based Mac running
> > Mac OS 10.6.4).
> >
> > -- Matt
> > Cc: Matt Kaufmann <address@hidden>, address@hidden
> > From: Camm Maguire <address@hidden>
> > Date: Tue, 27 Jul 2010 10:00:52 -0400
> > X-SpamAssassin-Status: No, hits=-0.4 required=5.0
> > X-UTCS-Spam-Status: No, hits=-189 required=165
> >
> > Thank you so much! But after reviewing the below, it appears I now
> > need:
> >
> > /usr/include/mach-o/nlist.h
> > /usr/include/nlist.h
> >
> > Take care,
> >
> > "George W. Dinolt" <address@hidden> writes:
> >
> > > Camm:
> > > I have been a lurker on the list for several years. Time for a
small
> > > contribution.
> > >
> > > I tried the same test as Matt on a Snow Leopard MAC and got the
same
> > > result. I also have access to a Mac running Leopard. I was
able to
> > > compile gcl on that (after making sure that tcl/tk was not in the
> > > path). I checked the differences between Leopard and Snow
Leopard with
> > > the files you suggested we look at, they are in /usr/include.
> > >
> > > The one that is different in Snow Leopard is "loader.h". It is
> > > included below.
> > >
> > > Unfortunately, I am unable to make a machine available to you.
My
> > > machines are relatively hidden behind U.S. gov't firewalls.
> > >
> > > I hope this will be of some help.
> > >
> > > Regards,
> > > George Dinolt
> > > ----------------------------------------
> > > loader.h from Snow Leopard
> > > ----------------------------------------
> > > /*
> > > * Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
> > > *
> > > * @APPLE_LICENSE_HEADER_START@
> > > *
> > > * This file contains Original Code and/or Modifications of
Original Code
> > > * as defined in and that are subject to the Apple Public Source
License
> > > * Version 2.0 (the 'License'). You may not use this file except
in
> > > * compliance with the License. Please obtain a copy of the
License at
> > > * http://www.opensource.apple.com/apsl/ and read it before
using this
> > > * file.
> > > *
> > > * The Original Code and all software distributed under the
License are
> > > * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
KIND, EITHER
> > > * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH
WARRANTIES,
> > > * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
MERCHANTABILITY,
> > > * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
NON-INFRINGEMENT.
> > > * Please see the License for the specific language governing
rights and
> > > * limitations under the License.
> > > *
> > > * @APPLE_LICENSE_HEADER_END@
> > > */
> > > #ifndef _MACHO_LOADER_H_
> > > #define _MACHO_LOADER_H_
> > >
> > > /*
> > > * This file describes the format of mach object files.
> > > */
> > > #include <stdint.h>
> > >
> > > /*
> > > * <mach/machine.h> is needed here for the cpu_type_t and
> > > cpu_subtype_t types
> > > * and contains the constants for the possible values of these
types.
> > > */
> > > #include <mach/machine.h>
> > >
> > > /*
> > > * <mach/vm_prot.h> is needed here for the vm_prot_t type and
contains the
> > > * constants that are or'ed together for the possible values of
this type.
> > > */
> > > #include <mach/vm_prot.h>
> > >
> > > /*
> > > * <machine/thread_status.h> is expected to define the flavors
of the
> > > thread
> > > * states and the structures of those flavors for each machine.
> > > */
> > > #include <mach/machine/thread_status.h>
> > > #include <architecture/byte_order.h>
> > >
> > > /*
> > > * The 32-bit mach header appears at the very beginning of the
object
> > > file for
> > > * 32-bit architectures.
> > > */
> > > struct mach_header {
> > > uint32_t magic; /* mach magic number identifier */
> > > cpu_type_t cputype; /* cpu specifier */
> > > cpu_subtype_t cpusubtype; /* machine specifier */
> > > uint32_t filetype; /* type of file */
> > > uint32_t ncmds; /* number of load commands */
> > > uint32_t sizeofcmds; /* the size of all the load
commands */
> > > uint32_t flags; /* flags */
> > > };
> > >
> > > /* Constant for the magic field of the mach_header (32-bit
architectures) */
> > > #define MH_MAGIC 0xfeedface /* the mach magic number */
> > > #define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */
> > >
> > > /*
> > > * The 64-bit mach header appears at the very beginning of
object files for
> > > * 64-bit architectures.
> > > */
> > > struct mach_header_64 {
> > > uint32_t magic; /* mach magic number identifier */
> > > cpu_type_t cputype; /* cpu specifier */
> > > cpu_subtype_t cpusubtype; /* machine specifier */
> > > uint32_t filetype; /* type of file */
> > > uint32_t ncmds; /* number of load commands */
> > > uint32_t sizeofcmds; /* the size of all the load
commands */
> > > uint32_t flags; /* flags */
> > > uint32_t reserved; /* reserved */
> > > };
> > >
> > > /* Constant for the magic field of the mach_header_64 (64-bit
> > > architectures) */
> > > #define MH_MAGIC_64 0xfeedfacf /* the 64-bit mach magic number */
> > > #define MH_CIGAM_64 0xcffaedfe /* NXSwapInt(MH_MAGIC_64) */
> > >
> > > /*
> > > * The layout of the file depends on the filetype. For all but
the
> > > MH_OBJECT
> > > * file type the segments are padded out and aligned on a
segment alignment
> > > * boundary for efficient demand pageing. The MH_EXECUTE,
MH_FVMLIB,
> > > MH_DYLIB,
> > > * MH_DYLINKER and MH_BUNDLE file types also have the headers
included
> > > as part
> > > * of their first segment.
> > > *
> > > * The file type MH_OBJECT is a compact format intended as
output of the
> > > * assembler and input (and possibly output) of the link editor
(the .o
> > > * format). All sections are in one unnamed segment with no
segment
> > > padding.
> > > * This format is used as an executable format when the file is
so
> > > small the
> > > * segment padding greatly increases its size.
> > > *
> > > * The file type MH_PRELOAD is an executable format intended for
> > > things that
> > > * are not executed under the kernel (proms, stand alones,
kernels,
> > > etc). The
> > > * format can be executed under the kernel but may demand paged
it and not
> > > * preload it before execution.
> > > *
> > > * A core file is in MH_CORE format and can be any in an
arbritray legal
> > > * Mach-O file.
> > > *
> > > * Constants for the filetype field of the mach_header
> > > */
> > > #define MH_OBJECT 0x1 /* relocatable object file */
> > > #define MH_EXECUTE 0x2 /* demand paged executable
file */
> > > #define MH_FVMLIB 0x3 /* fixed VM shared library
file */
> > > #define MH_CORE 0x4 /* core file */
> > > #define MH_PRELOAD 0x5 /* preloaded executable file
*/
> > > #define MH_DYLIB 0x6 /* dynamically bound shared
library */
> > > #define MH_DYLINKER 0x7 /* dynamic link editor */
> > > #define MH_BUNDLE 0x8 /* dynamically bound bundle
file */
> > > #define MH_DYLIB_STUB 0x9 /* shared library stub
for static */
> > > /* linking only, no section contents */
> > > #define MH_DSYM 0xa /* companion file with only
debug */
> > > /* sections */
> > > #define MH_KEXT_BUNDLE 0xb /* x86_64 kexts */
> > >
> > > /* Constants for the flags field of the mach_header */
> > > #define MH_NOUNDEFS 0x1 /* the object file has no
undefined
> > > references */
> > > #define MH_INCRLINK 0x2 /* the object file is the
output of an
> > > incremental link against a base file
> > > and can't be link edited again */
> > > #define MH_DYLDLINK 0x4 /* the object file is input
for the
> > > dynamic linker and can't be staticly
> > > link edited again */
> > > #define MH_BINDATLOAD 0x8 /* the object file's
undefined
> > > references are bound by the dynamic
> > > linker when loaded. */
> > > #define MH_PREBOUND 0x10 /* the file has its dynamic
undefined
> > > references prebound. */
> > > #define MH_SPLIT_SEGS 0x20 /* the file has its
read-only and
> > > read-write segments split */
> > > #define MH_LAZY_INIT 0x40 /* the shared library init
routine is
> > > to be run lazily via catching memory
> > > faults to its writeable segments
> > > (obsolete) */
> > > #define MH_TWOLEVEL 0x80 /* the image is using
two-level name
> > > space bindings */
> > > #define MH_FORCE_FLAT 0x100 /* the executable is
forcing all
> > > images
> > > to use flat name space bindings */
> > > #define MH_NOMULTIDEFS 0x200 /* this umbrella
guarantees no
> > > multiple
> > > defintions of symbols in its
> > > sub-images so the two-level namespace
> > > hints can always be used. */
> > > #define MH_NOFIXPREBINDING 0x400 /* do not have dyld notify
the
> > > prebinding agent about this
> > > executable */
> > > #define MH_PREBINDABLE 0x800 /* the binary is not
prebound
> > > but can
> > > have its prebinding redone. only used
> > > when MH_PREBOUND is
not set. */
> > > #define MH_ALLMODSBOUND 0x1000 /* indicates that this
binary binds to
> > > all two-level
namespace
> > > modules of
> > > its dependent libraries. only used
> > > when MH_PREBINDABLE and MH_TWOLEVEL
> > > are both set. */
> > > #define MH_SUBSECTIONS_VIA_SYMBOLS 0x2000/* safe to divide up the
> > > sections into
> > > sub-sections via symbols for dead
> > > code stripping */
> > > #define MH_CANONICAL 0x4000 /* the binary has been
canonicalized
> > > via the unprebind operation */
> > > #define MH_WEAK_DEFINES 0x8000 /* the final linked
image contains
> > > external weak symbols */
> > > #define MH_BINDS_TO_WEAK 0x10000 /* the final linked image
uses
> > > weak symbols */
> > >
> > > #define MH_ALLOW_STACK_EXECUTION 0x20000/* When this bit is set,
all stacks
> > > in the task will be given stack
> > > execution privilege. Only used in
> > > MH_EXECUTE filetypes. */
> > > #define MH_DEAD_STRIPPABLE_DYLIB 0x400000 /* Only for use on
> > > dylibs. When
> > > linking against a dylib that
> > > has this bit set, the static linker
> > > will automatically not create a
> > > LC_LOAD_DYLIB load command to the
> > > dylib if no symbols are being
> > > referenced from the dylib. */
> > > #define MH_ROOT_SAFE 0x40000 /* When this bit is set,
the binary
> > > declares it is safe for use in
> > > processes with uid zero */
> > >
> > > #define MH_SETUID_SAFE 0x80000 /* When this bit is set,
the binary
> > > declares it is safe for use in
> > > processes when issetugid() is true */
> > >
> > > #define MH_NO_REEXPORTED_DYLIBS 0x100000 /* When this bit is set
on a
> > > dylib,
> > > the static linker does not need to
> > > examine dependent dylibs to see
> > > if any are re-exported */
> > > #define MH_PIE 0x200000 /* When this bit is set,
the OS will
> > > load the main executable at a
> > > random address. Only used in
> > > MH_EXECUTE filetypes. */
> > >
> > > /*
> > > * The load commands directly follow the mach_header. The total
size
> > > of all
> > > * of the commands is given by the sizeofcmds field in the
> > > mach_header. All
> > > * load commands must have as their first two fields cmd and
cmdsize.
> > > The cmd
> > > * field is filled in with a constant for that command type.
Each
> > > command type
> > > * has a structure specifically for it. The cmdsize field is
the size
> > > in bytes
> > > * of the particular load command structure plus anything that
follows
> > > it that
> > > * is a part of the load command (i.e. section structures,
strings,
> > > etc.). To
> > > * advance to the next load command the cmdsize can be added to
the
> > > offset or
> > > * pointer of the current load command. The cmdsize for 32-bit
> > > architectures
> > > * MUST be a multiple of 4 bytes and for 64-bit architectures
MUST be
> > > a multiple
> > > * of 8 bytes (these are forever the maximum alignment of any
load
> > > commands).
> > > * The padded bytes must be zero. All tables in the object file
must also
> > > * follow these rules so the file can be memory mapped.
Otherwise the
> > > pointers
> > > * to these tables will not work well or at all on some
machines. With all
> > > * padding zeroed like objects will compare byte for byte.
> > > */
> > > struct load_command {
> > > uint32_t cmd; /* type of load command */
> > > uint32_t cmdsize; /* total size of command in bytes */
> > > };
> > >
> > > /*
> > > * After MacOS X 10.1 when a new load command is added that is
> > > required to be
> > > * understood by the dynamic linker for the image to execute
properly the
> > > * LC_REQ_DYLD bit will be or'ed into the load command constant.
If
> > > the dynamic
> > > * linker sees such a load command it it does not understand
will issue a
> > > * "unknown load command required for execution" error and
refuse to
> > > use the
> > > * image. Other load commands without this bit that are not
> > > understood will
> > > * simply be ignored.
> > > */
> > > #define LC_REQ_DYLD 0x80000000
> > >
> > > /* Constants for the cmd field of all load commands, the type */
> > > #define LC_SEGMENT 0x1 /* segment of this file to be
mapped */
> > > #define LC_SYMTAB 0x2 /* link-edit stab symbol table
info */
> > > #define LC_SYMSEG 0x3 /* link-edit gdb symbol table info
> > > (obsolete) */
> > > #define LC_THREAD 0x4 /* thread */
> > > #define LC_UNIXTHREAD 0x5 /* unix thread (includes a
stack) */
> > > #define LC_LOADFVMLIB 0x6 /* load a specified fixed VM
shared
> > > library */
> > > #define LC_IDFVMLIB 0x7 /* fixed VM shared library
> > > identification */
> > > #define LC_IDENT 0x8 /* object identification info
(obsolete) */
> > > #define LC_FVMFILE 0x9 /* fixed VM file inclusion
(internal use) */
> > > #define LC_PREPAGE 0xa /* prepage command (internal
use) */
> > > #define LC_DYSYMTAB 0xb /* dynamic link-edit symbol
table info */
> > > #define LC_LOAD_DYLIB 0xc /* load a dynamically linked
shared
> > > library */
> > > #define LC_ID_DYLIB 0xd /* dynamically linked shared
lib ident */
> > > #define LC_LOAD_DYLINKER 0xe /* load a dynamic linker */
> > > #define LC_ID_DYLINKER 0xf /* dynamic linker
identification */
> > > #define LC_PREBOUND_DYLIB 0x10 /* modules prebound for a
> > > dynamically */
> > > /* linked shared library */
> > > #define LC_ROUTINES 0x11 /* image routines */
> > > #define LC_SUB_FRAMEWORK 0x12 /* sub framework */
> > > #define LC_SUB_UMBRELLA 0x13 /* sub umbrella */
> > > #define LC_SUB_CLIENT 0x14 /* sub client */
> > > #define LC_SUB_LIBRARY 0x15 /* sub library */
> > > #define LC_TWOLEVEL_HINTS 0x16 /* two-level namespace
lookup hints */
> > > #define LC_PREBIND_CKSUM 0x17 /* prebind checksum */
> > >
> > > /*
> > > * load a dynamically linked shared library that is allowed to
be missing
> > > * (all symbols are weak imported).
> > > */
> > > #define LC_LOAD_WEAK_DYLIB (0x18 | LC_REQ_DYLD)
> > >
> > > #define LC_SEGMENT_64 0x19 /* 64-bit segment of this
file to be
> > > mapped */
> > > #define LC_ROUTINES_64 0x1a /* 64-bit image routines */
> > > #define LC_UUID 0x1b /* the uuid */
> > > #define LC_RPATH (0x1c | LC_REQ_DYLD) /* runpath
additions */
> > > #define LC_CODE_SIGNATURE 0x1d /* local of code signature */
> > > #define LC_SEGMENT_SPLIT_INFO 0x1e /* local of info to split
segments */
> > > #define LC_REEXPORT_DYLIB (0x1f | LC_REQ_DYLD) /* load and
re-export
> > > dylib */
> > > #define LC_LAZY_LOAD_DYLIB 0x20 /* delay load of dylib
until
> > > first use */
> > > #define LC_ENCRYPTION_INFO 0x21 /* encrypted segment
information */
> > > #define LC_DYLD_INFO 0x22 /* compressed dyld
information */
> > > #define LC_DYLD_INFO_ONLY (0x22|LC_REQ_DYLD) /* compressed
dyld
> > > information only */
> > >
> > > /*
> > > * A variable length string in a load command is represented by
an lc_str
> > > * union. The strings are stored just after the load command
structure and
> > > * the offset is from the start of the load command structure.
The size
> > > * of the string is reflected in the cmdsize field of the load
command.
> > > * Once again any padded bytes to bring the cmdsize field to a
multiple
> > > * of 4 bytes must be zero.
> > > */
> > > union lc_str {
> > > uint32_t offset; /* offset to the string */
> > > #ifndef __LP64__
> > > char *ptr; /* pointer to the string */
> > > #endif
> > > };
> > >
> > > /*
> > > * The segment load command indicates that a part of this file
is to be
> > > * mapped into the task's address space. The size of this
segment in
> > > memory,
> > > * vmsize, maybe equal to or larger than the amount to map from
this file,
> > > * filesize. The file is mapped starting at fileoff to the
beginning of
> > > * the segment in memory, vmaddr. The rest of the memory of the
segment,
> > > * if any, is allocated zero fill on demand. The segment's
maximum virtual
> > > * memory protection and initial virtual memory protection are
specified
> > > * by the maxprot and initprot fields. If the segment has
sections
> > > then the
> > > * section structures directly follow the segment command and
their size is
> > > * reflected in cmdsize.
> > > */
> > > struct segment_command { /* for 32-bit architectures */
> > > uint32_t cmd; /* LC_SEGMENT */
> > > uint32_t cmdsize; /* includes sizeof section structs */
> > > char segname[16]; /* segment name */
> > > uint32_t vmaddr; /* memory address of this segment
*/
> > > uint32_t vmsize; /* memory size of this segment */
> > > uint32_t fileoff; /* file offset of this segment */
> > > uint32_t filesize; /* amount to map from the file */
> > > vm_prot_t maxprot; /* maximum VM protection */
> > > vm_prot_t initprot; /* initial VM protection */
> > > uint32_t nsects; /* number of sections in segment
*/
> > > uint32_t flags; /* flags */
> > > };
> > >
> > > /*
> > > * The 64-bit segment load command indicates that a part of this
file
> > > is to be
> > > * mapped into a 64-bit task's address space. If the 64-bit
segment has
> > > * sections then section_64 structures directly follow the
64-bit segment
> > > * command and their size is reflected in cmdsize.
> > > */
> > > struct segment_command_64 { /* for 64-bit architectures */
> > > uint32_t cmd; /* LC_SEGMENT_64 */
> > > uint32_t cmdsize; /* includes sizeof section_64
structs */
> > > char segname[16]; /* segment name */
> > > uint64_t vmaddr; /* memory address of this segment
*/
> > > uint64_t vmsize; /* memory size of this segment */
> > > uint64_t fileoff; /* file offset of this segment */
> > > uint64_t filesize; /* amount to map from the file */
> > > vm_prot_t maxprot; /* maximum VM protection */
> > > vm_prot_t initprot; /* initial VM protection */
> > > uint32_t nsects; /* number of sections in segment
*/
> > > uint32_t flags; /* flags */
> > > };
> > >
> > > /* Constants for the flags field of the segment_command */
> > > #define SG_HIGHVM 0x1 /* the file contents for this
segment is for
> > > the high part of the VM space, the low part
> > > is zero filled (for stacks in core files) */
> > > #define SG_FVMLIB 0x2 /* this segment is the VM that is
> > > allocated by
> > > a fixed VM library, for overlap checking in
> > > the link editor */
> > > #define SG_NORELOC 0x4 /* this segment has nothing that
was
> > > relocated
> > > in it and nothing relocated to it, that is
> > > it maybe safely replaced without relocation*/
> > > #define SG_PROTECTED_VERSION_1 0x8 /* This segment is
protected. If the
> > > segment starts at file offset 0, the
> > > first page of the segment is not
> > > protected. All other pages of the
> > > segment are protected. */
> > >
> > > /*
> > > * A segment is made up of zero or more sections. Non-MH_OBJECT
files have
> > > * all of their segments with the proper sections in each, and
padded
> > > to the
> > > * specified segment alignment when produced by the link editor.
The first
> > > * segment of a MH_EXECUTE and MH_FVMLIB format file contains the
> > > mach_header
> > > * and load commands of the object file before its first
section. The zero
> > > * fill sections are always last in their segment (in all
formats). This
> > > * allows the zeroed segment padding to be mapped into memory
where
> > > zero fill
> > > * sections might be. The gigabyte zero fill sections, those
with the
> > > section
> > > * type S_GB_ZEROFILL, can only be in a segment with sections of
this type.
> > > * These segments are then placed after all other segments.
> > > *
> > > * The MH_OBJECT format has all of its sections in one segment
for
> > > * compactness. There is no padding to a specified segment
boundary
> > > and the
> > > * mach_header and load commands are not part of the segment.
> > > *
> > > * Sections with the same section name, sectname, going into the
same
> > > segment,
> > > * segname, are combined by the link editor. The resulting
section is
> > > aligned
> > > * to the maximum alignment of the combined sections and is the
new
> > > section's
> > > * alignment. The combined sections are aligned to their
original
> > > alignment in
> > > * the combined section. Any padded bytes to get the specified
> > > alignment are
> > > * zeroed.
> > > *
> > > * The format of the relocation entries referenced by the reloff
and nreloc
> > > * fields of the section structure for mach object files is
described
> > > in the
> > > * header file <reloc.h>.
> > > */
> > > struct section { /* for 32-bit architectures */
> > > char sectname[16]; /* name of this section */
> > > char segname[16]; /* segment this section goes in
*/
> > > uint32_t addr; /* memory address of this section */
> > > uint32_t size; /* size in bytes of this section */
> > > uint32_t offset; /* file offset of this section */
> > > uint32_t align; /* section alignment (power of 2)
*/
> > > uint32_t reloff; /* file offset of relocation
entries */
> > > uint32_t nreloc; /* number of relocation entries */
> > > uint32_t flags; /* flags (section type and
attributes)*/
> > > uint32_t reserved1; /* reserved (for offset or index)
*/
> > > uint32_t reserved2; /* reserved (for count or sizeof)
*/
> > > };
> > >
> > > struct section_64 { /* for 64-bit architectures */
> > > char sectname[16]; /* name of this section */
> > > char segname[16]; /* segment this section goes in
*/
> > > uint64_t addr; /* memory address of this section */
> > > uint64_t size; /* size in bytes of this section */
> > > uint32_t offset; /* file offset of this section */
> > > uint32_t align; /* section alignment (power of 2)
*/
> > > uint32_t reloff; /* file offset of relocation
entries */
> > > uint32_t nreloc; /* number of relocation entries */
> > > uint32_t flags; /* flags (section type and
attributes)*/
> > > uint32_t reserved1; /* reserved (for offset or index)
*/
> > > uint32_t reserved2; /* reserved (for count or sizeof)
*/
> > > uint32_t reserved3; /* reserved */
> > > };
> > >
> > > /*
> > > * The flags field of a section structure is separated into two
parts
> > > a section
> > > * type and section attributes. The section types are mutually
> > > exclusive (it
> > > * can only have one type) but the section attributes are not
(it may
> > > have more
> > > * than one attribute).
> > > */
> > > #define SECTION_TYPE 0x000000ff /* 256 section types
*/
> > > #define SECTION_ATTRIBUTES 0xffffff00 /* 24 section
attributes */
> > >
> > > /* Constants for the type of a section */
> > > #define S_REGULAR 0x0 /* regular section */
> > > #define S_ZEROFILL 0x1 /* zero fill on demand
section */
> > > #define S_CSTRING_LITERALS 0x2 /* section with only
literal C
> > > strings*/
> > > #define S_4BYTE_LITERALS 0x3 /* section with only 4 byte
> > > literals */
> > > #define S_8BYTE_LITERALS 0x4 /* section with only 8 byte
> > > literals */
> > > #define S_LITERAL_POINTERS 0x5 /* section with only
pointers to */
> > > /* literals */
> > > /*
> > > * For the two types of symbol pointers sections and the symbol
stubs
> > > section
> > > * they have indirect symbol table entries. For each of the
entries in the
> > > * section the indirect symbol table entries, in corresponding
order in the
> > > * indirect symbol table, start at the index stored in the
reserved1 field
> > > * of the section structure. Since the indirect symbol table
entries
> > > * correspond to the entries in the section the number of
indirect
> > > symbol table
> > > * entries is inferred from the size of the section divided by
the
> > > size of the
> > > * entries in the section. For symbol pointers sections the
size of
> > > the entries
> > > * in the section is 4 bytes and for symbol stubs sections the
byte
> > > size of the
> > > * stubs is stored in the reserved2 field of the section
structure.
> > > */
> > > #define S_NON_LAZY_SYMBOL_POINTERS 0x6 /* section with
only
> > > non-lazy
> > > symbol pointers */
> > > #define S_LAZY_SYMBOL_POINTERS 0x7 /* section with
only
> > > lazy symbol
> > > pointers */
> > > #define S_SYMBOL_STUBS 0x8 /* section with only
symbol
> > > stubs, byte size of stub in
> > > the reserved2 field */
> > > #define S_MOD_INIT_FUNC_POINTERS 0x9 /* section with
only function
> > > pointers for initialization*/
> > > #define S_MOD_TERM_FUNC_POINTERS 0xa /* section with
only function
> > > pointers for termination */
> > > #define S_COALESCED 0xb /* section contains
symbols that
> > > are to be coalesced */
> > > #define S_GB_ZEROFILL 0xc /* zero fill on
demand section
> > > (that can be larger than 4
> > > gigabytes) */
> > > #define S_INTERPOSING 0xd /* section with only
pairs of
> > > function pointers for
> > > interposing */
> > > #define S_16BYTE_LITERALS 0xe /* section with only
16 byte
> > > literals */
> > > #define S_DTRACE_DOF 0xf /* section contains
> > > DTrace Object Format */
> > > #define S_LAZY_DYLIB_SYMBOL_POINTERS 0x10 /* section
with only lazy
> > > symbol pointers to lazy
> > > loaded dylibs */
> > > /*
> > > * Constants for the section attributes part of the flags field
of a
> > > section
> > > * structure.
> > > */
> > > #define SECTION_ATTRIBUTES_USR 0xff000000 /* User setable
> > > attributes */
> > > #define S_ATTR_PURE_INSTRUCTIONS 0x80000000 /* section
contains only true
> > > machine instructions */
> > > #define S_ATTR_NO_TOC 0x40000000 /* section contains
coalesced
> > > symbols that are not to be
> > > in a ranlib table of
> > > contents */
> > > #define S_ATTR_STRIP_STATIC_SYMS 0x20000000 /* ok to strip
static symbols
> > > in this section in files
> > > with the MH_DYLDLINK flag */
> > > #define S_ATTR_NO_DEAD_STRIP 0x10000000 /* no dead
stripping */
> > > #define S_ATTR_LIVE_SUPPORT 0x08000000 /* blocks are live
if they
> > > reference live blocks */
> > > #define S_ATTR_SELF_MODIFYING_CODE 0x04000000 /* Used with
i386
> > > code stubs
> > > written on by dyld */
> > > /*
> > > * If a segment contains any sections marked with S_ATTR_DEBUG
then all
> > > * sections in that segment must have this attribute. No section
> > > other than
> > > * a section marked with this attribute may reference the
contents of this
> > > * section. A section with this attribute may contain no
symbols and
> > > must have
> > > * a section type S_REGULAR. The static linker will not copy
section
> > > contents
> > > * from sections with this attribute into its output file.
These sections
> > > * generally contain DWARF debugging info.
> > > */
> > > #define S_ATTR_DEBUG 0x02000000 /* a debug section
*/
> > > #define SECTION_ATTRIBUTES_SYS 0x00ffff00 /* system
setable
> > > attributes */
> > > #define S_ATTR_SOME_INSTRUCTIONS 0x00000400 /* section
contains some
> > > machine instructions */
> > > #define S_ATTR_EXT_RELOC 0x00000200 /* section has
external
> > > relocation entries */
> > > #define S_ATTR_LOC_RELOC 0x00000100 /* section has local
> > > relocation entries */
> > >
> > >
> > > /*
> > > * The names of segments and sections in them are mostly
meaningless to the
> > > * link-editor. But there are few things to support traditional
UNIX
> > > * executables that require the link-editor and assembler to use
some names
> > > * agreed upon by convention.
> > > *
> > > * The initial protection of the "__TEXT" segment has write
protection
> > > turned
> > > * off (not writeable).
> > > *
> > > * The link-editor will allocate common symbols at the end of the
> > > "__common"
> > > * section in the "__DATA" segment. It will create the section
and segment
> > > * if needed.
> > > */
> > >
> > > /* The currently known segment names and the section names in
those
> > > segments */
> > >
> > > #define SEG_PAGEZERO "__PAGEZERO" /* the pagezero
segment
> > > which has no */
> > > /* protections and catches NULL */
> > > /* references for MH_EXECUTE files */
> > >
> > >
> > > #define SEG_TEXT "__TEXT" /* the tradition UNIX text
segment */
> > > #define SECT_TEXT "__text" /* the real text part of the
text */
> > > /* section no headers, and no padding */
> > > #define SECT_FVMLIB_INIT0 "__fvmlib_init0" /* the fvmlib
> > > initialization */
> > > /* section */
> > > #define SECT_FVMLIB_INIT1 "__fvmlib_init1" /* the section
following
> > > the */
> > > /* fvmlib initialization */
> > > /* section */
> > >
> > > #define SEG_DATA "__DATA" /* the tradition UNIX data
segment */
> > > #define SECT_DATA "__data" /* the real initialized data
section */
> > > /* no padding, no bss overlap */
> > > #define SECT_BSS "__bss" /* the real uninitialized
data
> > > section*/
> > > /* no padding */
> > > #define SECT_COMMON "__common" /* the section common
symbols are */
> > > /* allocated in by the link editor */
> > >
> > > #define SEG_OBJC "__OBJC" /* objective-C runtime
segment */
> > > #define SECT_OBJC_SYMBOLS "__symbol_table" /* symbol table */
> > > #define SECT_OBJC_MODULES "__module_info" /* module
information */
> > > #define SECT_OBJC_STRINGS "__selector_strs" /* string table */
> > > #define SECT_OBJC_REFS "__selector_refs" /* string table */
> > >
> > > #define SEG_ICON "__ICON" /* the icon segment */
> > > #define SECT_ICON_HEADER "__header" /* the icon headers */
> > > #define SECT_ICON_TIFF "__tiff" /* the icons in tiff
format */
> > >
> > > #define SEG_LINKEDIT "__LINKEDIT" /* the segment
containing
> > > all structs */
> > > /* created and maintained by the link */
> > > /* editor. Created with -seglinkedit */
> > > /* option to ld(1) for MH_EXECUTE and */
> > > /* FVMLIB file types only */
> > >
> > > #define SEG_UNIXSTACK "__UNIXSTACK" /* the unix stack
segment */
> > >
> > > #define SEG_IMPORT "__IMPORT" /* the segment for the self
(dyld) */
> > > /* modifing code stubs that has read, */
> > > /* write and execute permissions */
> > >
> > > /*
> > > * Fixed virtual memory shared libraries are identified by two
things. The
> > > * target pathname (the name of the library as found for
execution),
> > > and the
> > > * minor version number. The address of where the headers are
loaded is in
> > > * header_addr. (THIS IS OBSOLETE and no longer supported).
> > > */
> > > struct fvmlib {
> > > union lc_str name; /* library's target pathname */
> > > uint32_t minor_version; /* library's minor version
number */
> > > uint32_t header_addr; /* library's header address */
> > > };
> > >
> > > /*
> > > * A fixed virtual shared library (filetype == MH_FVMLIB in the
mach
> > > header)
> > > * contains a fvmlib_command (cmd == LC_IDFVMLIB) to identify
the library.
> > > * An object that uses a fixed virtual shared library also
contains a
> > > * fvmlib_command (cmd == LC_LOADFVMLIB) for each library it
uses.
> > > * (THIS IS OBSOLETE and no longer supported).
> > > */
> > > struct fvmlib_command {
> > > uint32_t cmd; /* LC_IDFVMLIB or LC_LOADFVMLIB */
> > > uint32_t cmdsize; /* includes pathname string */
> > > struct fvmlib fvmlib; /* the library
identification */
> > > };
> > >
> > > /*
> > > * Dynamicly linked shared libraries are identified by two
things. The
> > > * pathname (the name of the library as found for execution),
and the
> > > * compatibility version number. The pathname must match and the
> > > compatibility
> > > * number in the user of the library must be greater than or
equal to the
> > > * library being used. The time stamp is used to record the
time a
> > > library was
> > > * built and copied into user so it can be use to determined if
the
> > > library used
> > > * at runtime is exactly the same as used to built the program.
> > > */
> > > struct dylib {
> > > union lc_str name; /* library's path name */
> > > uint32_t timestamp; /* library's build time stamp
*/
> > > uint32_t current_version; /* library's current
version number */
> > > uint32_t compatibility_version; /* library's
compatibility vers
> > > number*/
> > > };
> > >
> > > /*
> > > * A dynamically linked shared library (filetype == MH_DYLIB in
the
> > > mach header)
> > > * contains a dylib_command (cmd == LC_ID_DYLIB) to identify the
library.
> > > * An object that uses a dynamically linked shared library also
contains a
> > > * dylib_command (cmd == LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB, or
> > > * LC_REEXPORT_DYLIB) for each library it uses.
> > > */
> > > struct dylib_command {
> > > uint32_t cmd; /* LC_ID_DYLIB,
LC_LOAD_{,WEAK_}DYLIB,
> > > LC_REEXPORT_DYLIB */
> > > uint32_t cmdsize; /* includes pathname string */
> > > struct dylib dylib; /* the library identification
*/
> > > };
> > >
> > > /*
> > > * A dynamically linked shared library may be a subframework of
an umbrella
> > > * framework. If so it will be linked with "-umbrella
umbrella_name" where
> > > * Where "umbrella_name" is the name of the umbrella framework. A
> > > subframework
> > > * can only be linked against by its umbrella framework or other
> > > subframeworks
> > > * that are part of the same umbrella framework. Otherwise the
static link
> > > * editor produces an error and states to link against the
umbrella
> > > framework.
> > > * The name of the umbrella framework for subframeworks is
recorded in the
> > > * following structure.
> > > */
> > > struct sub_framework_command {
> > > uint32_t cmd; /* LC_SUB_FRAMEWORK */
> > > uint32_t cmdsize; /* includes umbrella string */
> > > union lc_str umbrella; /* the umbrella framework name
*/
> > > };
> > >
> > > /*
> > > * For dynamically linked shared libraries that are subframework
of an
> > > umbrella
> > > * framework they can allow clients other than the umbrella
framework
> > > or other
> > > * subframeworks in the same umbrella framework. To do this the
> > > subframework
> > > * is built with "-allowable_client client_name" and an
LC_SUB_CLIENT load
> > > * command is created for each -allowable_client flag. The
client_name is
> > > * usually a framework name. It can also be a name used for
bundles
> > > clients
> > > * where the bundle is built with "-client_name client_name".
> > > */
> > > struct sub_client_command {
> > > uint32_t cmd; /* LC_SUB_CLIENT */
> > > uint32_t cmdsize; /* includes client string */
> > > union lc_str client; /* the client name */
> > > };
> > >
> > > /*
> > > * A dynamically linked shared library may be a sub_umbrella of
an umbrella
> > > * framework. If so it will be linked with "-sub_umbrella
> > > umbrella_name" where
> > > * Where "umbrella_name" is the name of the sub_umbrella
framework. When
> > > * staticly linking when -twolevel_namespace is in effect a
twolevel
> > > namespace
> > > * umbrella framework will only cause its subframeworks and those
> > > frameworks
> > > * listed as sub_umbrella frameworks to be implicited linked in.
Any other
> > > * dependent dynamic libraries will not be linked it when
> > > -twolevel_namespace
> > > * is in effect. The primary library recorded by the static
linker when
> > > * resolving a symbol in these libraries will be the umbrella
framework.
> > > * Zero or more sub_umbrella frameworks may be use by an umbrella
> > > framework.
> > > * The name of a sub_umbrella framework is recorded in the
following
> > > structure.
> > > */
> > > struct sub_umbrella_command {
> > > uint32_t cmd; /* LC_SUB_UMBRELLA */
> > > uint32_t cmdsize; /* includes sub_umbrella string */
> > > union lc_str sub_umbrella; /* the sub_umbrella
framework name */
> > > };
> > >
> > > /*
> > > * A dynamically linked shared library may be a sub_library of
another
> > > shared
> > > * library. If so it will be linked with "-sub_library
library_name" where
> > > * Where "library_name" is the name of the sub_library shared
library.
> > > When
> > > * staticly linking when -twolevel_namespace is in effect a
twolevel
> > > namespace
> > > * shared library will only cause its subframeworks and those
frameworks
> > > * listed as sub_umbrella frameworks and libraries listed as
> > > sub_libraries to
> > > * be implicited linked in. Any other dependent dynamic
libraries
> > > will not be
> > > * linked it when -twolevel_namespace is in effect. The primary
library
> > > * recorded by the static linker when resolving a symbol in
these libraries
> > > * will be the umbrella framework (or dynamic library). Zero or
more
> > > sub_library
> > > * shared libraries may be use by an umbrella framework or (or
dynamic
> > > library).
> > > * The name of a sub_library framework is recorded in the
following
> > > structure.
> > > * For example /usr/lib/libobjc_profile.A.dylib would be
recorded as
> > > "libobjc".
> > > */
> > > struct sub_library_command {
> > > uint32_t cmd; /* LC_SUB_LIBRARY */
> > > uint32_t cmdsize; /* includes sub_library string */
> > > union lc_str sub_library; /* the sub_library name */
> > > };
> > >
> > > /*
> > > * A program (filetype == MH_EXECUTE) that is
> > > * prebound to its dynamic libraries has one of these for each
library that
> > > * the static linker used in prebinding. It contains a bit
vector for the
> > > * modules in the library. The bits indicate which modules are
bound
> > > (1) and
> > > * which are not (0) from the library. The bit for module 0 is
the low bit
> > > * of the first byte. So the bit for the Nth module is:
> > > * (linked_modules[N/8] >> N%8) & 1
> > > */
> > > struct prebound_dylib_command {
> > > uint32_t cmd; /* LC_PREBOUND_DYLIB */
> > > uint32_t cmdsize; /* includes strings */
> > > union lc_str name; /* library's path name */
> > > uint32_t nmodules; /* number of modules in library */
> > > union lc_str linked_modules; /* bit vector of linked
modules */
> > > };
> > >
> > > /*
> > > * A program that uses a dynamic linker contains a
dylinker_command to
> > > identify
> > > * the name of the dynamic linker (LC_LOAD_DYLINKER). And a
dynamic linker
> > > * contains a dylinker_command to identify the dynamic linker
> > > (LC_ID_DYLINKER).
> > > * A file can have at most one of these.
> > > */
> > > struct dylinker_command {
> > > uint32_t cmd; /* LC_ID_DYLINKER or
LC_LOAD_DYLINKER */
> > > uint32_t cmdsize; /* includes pathname string */
> > > union lc_str name; /* dynamic linker's path name */
> > > };
> > >
> > > /*
> > > * Thread commands contain machine-specific data structures
suitable for
> > > * use in the thread state primitives. The machine specific data
> > > structures
> > > * follow the struct thread_command as follows.
> > > * Each flavor of machine specific data structure is preceded by
an
> > > unsigned
> > > * long constant for the flavor of that data structure, an
uint32_t
> > > * that is the count of longs of the size of the state data
structure
> > > and then
> > > * the state data structure follows. This triple may be
repeated for many
> > > * flavors. The constants for the flavors, counts and state
data structure
> > > * definitions are expected to be in the header file
> > > <machine/thread_status.h>.
> > > * These machine specific data structures sizes must be
multiples of
> > > * 4 bytes The cmdsize reflects the total size of the
thread_command
> > > * and all of the sizes of the constants for the flavors, counts
and state
> > > * data structures.
> > > *
> > > * For executable objects that are unix processes there will be
one
> > > * thread_command (cmd == LC_UNIXTHREAD) created for it by the
link-editor.
> > > * This is the same as a LC_THREAD, except that a stack is
automatically
> > > * created (based on the shell's limit for the stack size).
Command
> > > arguments
> > > * and environment variables are copied onto that stack.
> > > */
> > > struct thread_command {
> > > uint32_t cmd; /* LC_THREAD or LC_UNIXTHREAD */
> > > uint32_t cmdsize; /* total size of this command */
> > > /* uint32_t flavor flavor of thread state */
> > > /* uint32_t count count of longs in thread state */
> > > /* struct XXX_thread_state state thread state for this
flavor */
> > > /* ... */
> > > };
> > >
> > > /*
> > > * The routines command contains the address of the dynamic
shared library
> > > * initialization routine and an index into the module table for
the module
> > > * that defines the routine. Before any modules are used from
the
> > > library the
> > > * dynamic linker fully binds the module that defines the
> > > initialization routine
> > > * and then calls it. This gets called before any module
initialization
> > > * routines (used for C++ static constructors) in the library.
> > > */
> > > struct routines_command { /* for 32-bit architectures */
> > > uint32_t cmd; /* LC_ROUTINES */
> > > uint32_t cmdsize; /* total size of this command */
> > > uint32_t init_address; /* address of initialization
routine */
> > > uint32_t init_module; /* index into the module table
that */
> > > /* the init routine is defined in */
> > > uint32_t reserved1;
> > > uint32_t reserved2;
> > > uint32_t reserved3;
> > > uint32_t reserved4;
> > > uint32_t reserved5;
> > > uint32_t reserved6;
> > > };
> > >
> > > /*
> > > * The 64-bit routines command. Same use as above.
> > > */
> > > struct routines_command_64 { /* for 64-bit architectures */
> > > uint32_t cmd; /* LC_ROUTINES_64 */
> > > uint32_t cmdsize; /* total size of this command */
> > > uint64_t init_address; /* address of initialization
routine */
> > > uint64_t init_module; /* index into the module table
that */
> > > /* the init routine is defined in */
> > > uint64_t reserved1;
> > > uint64_t reserved2;
> > > uint64_t reserved3;
> > > uint64_t reserved4;
> > > uint64_t reserved5;
> > > uint64_t reserved6;
> > > };
> > >
> > > /*
> > > * The symtab_command contains the offsets and sizes of the
link-edit
> > > 4.3BSD
> > > * "stab" style symbol table information as described in the
header files
> > > * <nlist.h> and <stab.h>.
> > > */
> > > struct symtab_command {
> > > uint32_t cmd; /* LC_SYMTAB */
> > > uint32_t cmdsize; /* sizeof(struct symtab_command) */
> > > uint32_t symoff; /* symbol table offset */
> > > uint32_t nsyms; /* number of symbol table entries
*/
> > > uint32_t stroff; /* string table offset */
> > > uint32_t strsize; /* string table size in bytes */
> > > };
> > >
> > > /*
> > > * This is the second set of the symbolic information which is
used to
> > > support
> > > * the data structures for the dynamically link editor.
> > > *
> > > * The original set of symbolic information in the symtab_command
> > > which contains
> > > * the symbol and string tables must also be present when this
load
> > > command is
> > > * present. When this load command is present the symbol table
is
> > > organized
> > > * into three groups of symbols:
> > > * local symbols (static and debugging symbols) - grouped by
module
> > > * defined external symbols - grouped by module (sorted by
name if
> > > not lib)
> > > * undefined external symbols (sorted by name if
MH_BINDATLOAD is
> > > not set,
> > > * and in order the were seen by the
static
> > > * linker if MH_BINDATLOAD is set)
> > > * In this load command there are offsets and counts to each of
the
> > > three groups
> > > * of symbols.
> > > *
> > > * This load command contains a the offsets and sizes of the
following new
> > > * symbolic information tables:
> > > * table of contents
> > > * module table
> > > * reference symbol table
> > > * indirect symbol table
> > > * The first three tables above (the table of contents, module
table and
> > > * reference symbol table) are only present if the file is a
> > > dynamically linked
> > > * shared library. For executable and object modules, which are
files
> > > * containing only one module, the information that would be in
these three
> > > * tables is determined as follows:
> > > * table of contents - the defined external symbols are
sorted by name
> > > * module table - the file contains only one module so
everything in the
> > > * file is part of the module.
> > > * reference symbol table - is the defined and undefined
external
> > > symbols
> > > *
> > > * For dynamically linked shared library files this load command
also
> > > contains
> > > * offsets and sizes to the pool of relocation entries for all
sections
> > > * separated into two groups:
> > > * external relocation entries
> > > * local relocation entries
> > > * For executable and object modules the relocation entries
continue
> > > to hang
> > > * off the section structures.
> > > */
> > > struct dysymtab_command {
> > > uint32_t cmd; /* LC_DYSYMTAB */
> > > uint32_t cmdsize; /* sizeof(struct dysymtab_command) */
> > >
> > > /*
> > > * The symbols indicated by symoff and nsyms of the
LC_SYMTAB load
> > > command
> > > * are grouped into the following three groups:
> > > * local symbols (further grouped by the module they are
from)
> > > * defined external symbols (further grouped by the
module they
> > > are from)
> > > * undefined symbols
> > > *
> > > * The local symbols are used only for debugging. The
dynamic binding
> > > * process may have to use them to indicate to the debugger
the local
> > > * symbols for a module that is being bound.
> > > *
> > > * The last two groups are used by the dynamic binding
process to
> > > do the
> > > * binding (indirectly through the module table and the
reference
> > > symbol
> > > * table when this is a dynamically linked shared library
file).
> > > */
> > > uint32_t ilocalsym; /* index to local symbols */
> > > uint32_t nlocalsym; /* number of local symbols */
> > >
> > > uint32_t iextdefsym;/* index to externally defined symbols */
> > > uint32_t nextdefsym;/* number of externally defined symbols
*/
> > >
> > > uint32_t iundefsym; /* index to undefined symbols */
> > > uint32_t nundefsym; /* number of undefined symbols */
> > >
> > > /*
> > > * For the for the dynamic binding process to find which
module a
> > > symbol
> > > * is defined in the table of contents is used (analogous to
the ranlib
> > > * structure in an archive) which maps defined external
symbols to
> > > modules
> > > * they are defined in. This exists only in a dynamically
linked
> > > shared
> > > * library file. For executable and object modules the
defined
> > > external
> > > * symbols are sorted by name and is use as the table of
contents.
> > > */
> > > uint32_t tocoff; /* file offset to table of contents */
> > > uint32_t ntoc; /* number of entries in table of contents
*/
> > >
> > > /*
> > > * To support dynamic binding of "modules" (whole object
files)
> > > the symbol
> > > * table must reflect the modules that the file was created
from.
> > > This is
> > > * done by having a module table that has indexes and counts
into
> > > the merged
> > > * tables for each module. The module structure that these
two entries
> > > * refer to is described below. This exists only in a
dynamically
> > > linked
> > > * shared library file. For executable and object modules
the
> > > file only
> > > * contains one module so everything in the file belongs to
the module.
> > > */
> > > uint32_t modtaboff; /* file offset to module table */
> > > uint32_t nmodtab; /* number of module table entries */
> > >
> > > /*
> > > * To support dynamic module binding the module structure
for each
> > > module
> > > * indicates the external references (defined and undefined)
each
> > > module
> > > * makes. For each module there is an offset and a count
into the
> > > * reference symbol table for the symbols that the module
references.
> > > * This exists only in a dynamically linked shared library
file. For
> > > * executable and object modules the defined external
symbols and the
> > > * undefined external symbols indicates the external
references.
> > > */
> > > uint32_t extrefsymoff; /* offset to referenced symbol
table */
> > > uint32_t nextrefsyms; /* number of referenced symbol table
> > > entries */
> > >
> > > /*
> > > * The sections that contain "symbol pointers" and "routine
stubs" have
> > > * indexes and (implied counts based on the size of the
section
> > > and fixed
> > > * size of the entry) into the "indirect symbol" table for
each pointer
> > > * and stub. For every section of these two types the index
into the
> > > * indirect symbol table is stored in the section header in
the field
> > > * reserved1. An indirect symbol table entry is simply a
32bit
> > > index into
> > > * the symbol table to the symbol that the pointer or stub is
> > > referring to.
> > > * The indirect symbol table is ordered to match the entries
in
> > > the section.
> > > */
> > > uint32_t indirectsymoff; /* file offset to the indirect
symbol table */
> > > uint32_t nindirectsyms; /* number of indirect symbol table
entries */
> > >
> > > /*
> > > * To support relocating an individual module in a library
file
> > > quickly the
> > > * external relocation entries for each module in the
library need
> > > to be
> > > * accessed efficiently. Since the relocation entries can't
be
> > > accessed
> > > * through the section headers for a library file they are
> > > separated into
> > > * groups of local and external entries further grouped by
module.
> > > In this
> > > * case the presents of this load command who's extreloff,
nextrel,
> > > * locreloff and nlocrel fields are non-zero indicates that
the
> > > relocation
> > > * entries of non-merged sections are not referenced through
the
> > > section
> > > * structures (and the reloff and nreloc fields in the
section
> > > headers are
> > > * set to zero).
> > > *
> > > * Since the relocation entries are not accessed through the
> > > section headers
> > > * this requires the r_address field to be something other
than a
> > > section
> > > * offset to identify the item to be relocated. In this case
> > > r_address is
> > > * set to the offset from the vmaddr of the first LC_SEGMENT
command.
> > > * For MH_SPLIT_SEGS images r_address is set to the the
offset from the
> > > * vmaddr of the first read-write LC_SEGMENT command.
> > > *
> > > * The relocation entries are grouped by module and the
module table
> > > * entries have indexes and counts into them for the group
of external
> > > * relocation entries for that the module.
> > > *
> > > * For sections that are merged across modules there must
not be any
> > > * remaining external relocation entries for them (for
merged sections
> > > * remaining relocation entries must be local).
> > > */
> > > uint32_t extreloff; /* offset to external relocation
entries */
> > > uint32_t nextrel; /* number of external relocation
entries */
> > >
> > > /*
> > > * All the local relocation entries are grouped together
(they are not
> > > * grouped by their module since they are only used if the
object
> > > is moved
> > > * from it staticly link edited address).
> > > */
> > > uint32_t locreloff; /* offset to local relocation entries
*/
> > > uint32_t nlocrel; /* number of local relocation entries */
> > >
> > > };
> > >
> > > /*
> > > * An indirect symbol table entry is simply a 32bit index into
the
> > > symbol table
> > > * to the symbol that the pointer or stub is refering to.
Unless it
> > > is for a
> > > * non-lazy symbol pointer section for a defined symbol which
strip(1) as
> > > * removed. In which case it has the value
INDIRECT_SYMBOL_LOCAL. If the
> > > * symbol was also absolute INDIRECT_SYMBOL_ABS is or'ed with
that.
> > > */
> > > #define INDIRECT_SYMBOL_LOCAL 0x80000000
> > > #define INDIRECT_SYMBOL_ABS 0x40000000
> > >
> > >
> > > /* a table of contents entry */
> > > struct dylib_table_of_contents {
> > > uint32_t symbol_index; /* the defined external symbol
> > > (index into the symbol table) */
> > > uint32_t module_index; /* index into the module table
this symbol
> > > is defined in */
> > > };
> > >
> > > /* a module table entry */
> > > struct dylib_module {
> > > uint32_t module_name; /* the module name (index into
string
> > > table) */
> > >
> > > uint32_t iextdefsym; /* index into externally defined
symbols */
> > > uint32_t nextdefsym; /* number of externally defined
symbols */
> > > uint32_t irefsym; /* index into reference symbol
table */
> > > uint32_t nrefsym; /* number of reference symbol table
entries */
> > > uint32_t ilocalsym; /* index into symbols for local
symbols */
> > > uint32_t nlocalsym; /* number of local symbols */
> > >
> > > uint32_t iextrel; /* index into external relocation
entries */
> > > uint32_t nextrel; /* number of external relocation
entries */
> > >
> > > uint32_t iinit_iterm; /* low 16 bits are the index into
the init
> > > section, high 16 bits are the index into
> > > the term section */
> > > uint32_t ninit_nterm; /* low 16 bits are the number of
init section
> > > entries, high 16 bits are the number of
> > > term section entries */
> > >
> > > uint32_t /* for this module address of the start
of */
> > > objc_module_info_addr; /* the (__OBJC,__module_info)
section */
> > > uint32_t /* for this module size of */
> > > objc_module_info_size; /* the (__OBJC,__module_info)
section */
> > > };
> > >
> > > /* a 64-bit module table entry */
> > > struct dylib_module_64 {
> > > uint32_t module_name; /* the module name (index into
string
> > > table) */
> > >
> > > uint32_t iextdefsym; /* index into externally defined
symbols */
> > > uint32_t nextdefsym; /* number of externally defined
symbols */
> > > uint32_t irefsym; /* index into reference symbol
table */
> > > uint32_t nrefsym; /* number of reference symbol table
entries */
> > > uint32_t ilocalsym; /* index into symbols for local
symbols */
> > > uint32_t nlocalsym; /* number of local symbols */
> > >
> > > uint32_t iextrel; /* index into external relocation
entries */
> > > uint32_t nextrel; /* number of external relocation
entries */
> > >
> > > uint32_t iinit_iterm; /* low 16 bits are the index into
the init
> > > section, high 16 bits are the index into
> > > the term section */
> > > uint32_t ninit_nterm; /* low 16 bits are the number of
init
> > > section
> > > entries, high 16 bits are the number of
> > > term section entries */
> > >
> > > uint32_t /* for this module size of */
> > > objc_module_info_size; /* the (__OBJC,__module_info)
section */
> > > uint64_t /* for this module address of the start
of */
> > > objc_module_info_addr; /* the (__OBJC,__module_info)
section */
> > > };
> > >
> > > /*
> > > * The entries in the reference symbol table are used when
loading the
> > > module
> > > * (both by the static and dynamic link editors) and if the
module is
> > > unloaded
> > > * or replaced. Therefore all external symbols (defined and
undefined) are
> > > * listed in the module's reference table. The flags describe
the type of
> > > * reference that is being made. The constants for the flags are
> > > defined in
> > > * <mach-o/nlist.h> as they are also used for symbol table
entries.
> > > */
> > > struct dylib_reference {
> > > uint32_t isym:24, /* index into the symbol table */
> > > flags:8; /* flags to indicate the type of
reference */
> > > };
> > >
> > > /*
> > > * The twolevel_hints_command contains the offset and number of
hints
> > > in the
> > > * two-level namespace lookup hints table.
> > > */
> > > struct twolevel_hints_command {
> > > uint32_t cmd; /* LC_TWOLEVEL_HINTS */
> > > uint32_t cmdsize; /* sizeof(struct
twolevel_hints_command) */
> > > uint32_t offset; /* offset to the hint table */
> > > uint32_t nhints; /* number of hints in the hint table */
> > > };
> > >
> > > /*
> > > * The entries in the two-level namespace lookup hints table are
> > > twolevel_hint
> > > * structs. These provide hints to the dynamic link editor
where to start
> > > * looking for an undefined symbol in a two-level namespace
image. The
> > > * isub_image field is an index into the sub-images
(sub-frameworks and
> > > * sub-umbrellas list) that made up the two-level image that the
undefined
> > > * symbol was found in when it was built by the static link
editor. If
> > > * isub-image is 0 the the symbol is expected to be defined in
library
> > > and not
> > > * in the sub-images. If isub-image is non-zero it is an index
into
> > > the array
> > > * of sub-images for the umbrella with the first index in the
> > > sub-images being
> > > * 1. The array of sub-images is the ordered list of sub-images
of the
> > > umbrella
> > > * that would be searched for a symbol that has the umbrella
recorded
> > > as its
> > > * primary library. The table of contents index is an index
into the
> > > * library's table of contents. This is used as the starting
point of the
> > > * binary search or a directed linear search.
> > > */
> > > struct twolevel_hint {
> > > uint32_t
> > > isub_image:8, /* index into the sub images */
> > > itoc:24; /* index into the table of contents */
> > > };
> > >
> > > /*
> > > * The prebind_cksum_command contains the value of the original
check
> > > sum for
> > > * prebound files or zero. When a prebound file is first
created or
> > > modified
> > > * for other than updating its prebinding information the value
of the
> > > check sum
> > > * is set to zero. When the file has it prebinding re-done and
if the
> > > value of
> > > * the check sum is zero the original check sum is calculated
and stored in
> > > * cksum field of this load command in the output file. If when
the
> > > prebinding
> > > * is re-done and the cksum field is non-zero it is left
unchanged from the
> > > * input file.
> > > */
> > > struct prebind_cksum_command {
> > > uint32_t cmd; /* LC_PREBIND_CKSUM */
> > > uint32_t cmdsize; /* sizeof(struct prebind_cksum_command)
*/
> > > uint32_t cksum; /* the check sum or zero */
> > > };
> > >
> > > /*
> > > * The uuid load command contains a single 128-bit unique random
> > > number that
> > > * identifies an object produced by the static link editor.
> > > */
> > > struct uuid_command {
> > > uint32_t cmd; /* LC_UUID */
> > > uint32_t cmdsize; /* sizeof(struct uuid_command) */
> > > uint8_t uuid[16]; /* the 128-bit uuid */
> > > };
> > >
> > > /*
> > > * The rpath_command contains a path which at runtime should be
added to
> > > * the current run path used to find @rpath prefixed dylibs.
> > > */
> > > struct rpath_command {
> > > uint32_t cmd; /* LC_RPATH */
> > > uint32_t cmdsize; /* includes string */
> > > union lc_str path; /* path to add to run path */
> > > };
> > >
> > > /*
> > > * The linkedit_data_command contains the offsets and sizes of a
blob
> > > * of data in the __LINKEDIT segment.
> > > */
> > > struct linkedit_data_command {
> > > uint32_t cmd; /* LC_CODE_SIGNATURE or
> > > LC_SEGMENT_SPLIT_INFO */
> > > uint32_t cmdsize; /* sizeof(struct
linkedit_data_command) */
> > > uint32_t dataoff; /* file offset of data in __LINKEDIT
segment */
> > > uint32_t datasize; /* file size of data in __LINKEDIT
segment */
> > > };
> > >
> > > /*
> > > * The encryption_info_command contains the file offset and size
of an
> > > * of an encrypted segment.
> > > */
> > > struct encryption_info_command {
> > > uint32_t cmd; /* LC_ENCRYPTION_INFO */
> > > uint32_t cmdsize; /* sizeof(struct
encryption_info_command) */
> > > uint32_t cryptoff; /* file offset of encrypted range */
> > > uint32_t cryptsize; /* file size of encrypted range */
> > > uint32_t cryptid; /* which enryption system,
> > > 0 means not-encrypted yet */
> > > };
> > >
> > > /*
> > > * The dyld_info_command contains the file offsets and sizes of
> > > * the new compressed form of the information dyld needs to
> > > * load the image. This information is used by dyld on Mac OS X
> > > * 10.6 and later. All information pointed to by this command
> > > * is encoded using byte streams, so no endian swapping is needed
> > > * to interpret it.
> > > */
> > > struct dyld_info_command {
> > > uint32_t cmd; /* LC_DYLD_INFO or LC_DYLD_INFO_ONLY */
> > > uint32_t cmdsize; /* sizeof(struct
dyld_info_command) */
> > >
> > > /*
> > > * Dyld rebases an image whenever dyld loads it at an
address different
> > > * from its preferred address. The rebase information is a
stream
> > > * of byte sized opcodes whose symbolic names start with
> > > REBASE_OPCODE_.
> > > * Conceptually the rebase information is a table of tuples:
> > > * <seg-index, seg-offset, type>
> > > * The opcodes are a compressed way to encode the table by
only
> > > * encoding when a column changes. In addition simple
patterns
> > > * like "every n'th offset for m times" can be encoded in a
few
> > > * bytes.
> > > */
> > > uint32_t rebase_off; /* file offset to rebase info */
> > > uint32_t rebase_size; /* size of rebase info */
> > >
> > > /*
> > > * Dyld binds an image during the loading process, if the
image
> > > * requires any pointers to be initialized to symbols in
other images.
> > > * The rebase information is a stream of byte sized
> > > * opcodes whose symbolic names start with BIND_OPCODE_.
> > > * Conceptually the bind information is a table of tuples:
> > > * <seg-index, seg-offset, type, symbol-library-ordinal,
> > > symbol-name, addend>
> > > * The opcodes are a compressed way to encode the table by
only
> > > * encoding when a column changes. In addition simple
patterns
> > > * like for runs of pointers initialzed to the same value
can be
> > > * encoded in a few bytes.
> > > */
> > > uint32_t bind_off; /* file offset to binding info */
> > > uint32_t bind_size; /* size of binding info */
> > >
> > > /*
> > > * Some C++ programs require dyld to unique symbols so that
all
> > > * images in the process use the same copy of some code/data.
> > > * This step is done after binding. The content of the
weak_bind
> > > * info is an opcode stream like the bind_info. But it is
sorted
> > > * alphabetically by symbol name. This enable dyld to walk
> > > * all images with weak binding information in order and look
> > > * for collisions. If there are no collisions, dyld does
> > > * no updating. That means that some fixups are also encoded
> > > * in the bind_info. For instance, all calls to "operator
new"
> > > * are first bound to libstdc++.dylib using the information
> > > * in bind_info. Then if some image overrides operator new
> > > * that is detected when the weak_bind information is
processed
> > > * and the call to operator new is then rebound.
> > > */
> > > uint32_t weak_bind_off; /* file offset to weak binding
info */
> > > uint32_t weak_bind_size; /* size of weak binding info */
> > >
> > > /*
> > > * Some uses of external symbols do not need to be bound
immediately.
> > > * Instead they can be lazily bound on first use. The
lazy_bind
> > > * are contains a stream of BIND opcodes to bind all lazy
symbols.
> > > * Normal use is that dyld ignores the lazy_bind section when
> > > * loading an image. Instead the static linker arranged for
the
> > > * lazy pointer to initially point to a helper function which
> > > * pushes the offset into the lazy_bind area for the symbol
> > > * needing to be bound, then jumps to dyld which simply adds
> > > * the offset to lazy_bind_off to get the information on what
> > > * to bind.
> > > */
> > > uint32_t lazy_bind_off; /* file offset to lazy binding
info */
> > > uint32_t lazy_bind_size; /* size of lazy binding infs */
> > >
> > > /*
> > > * The symbols exported by a dylib are encoded in a trie.
This
> > > * is a compact representation that factors out common
prefixes.
> > > * It also reduces LINKEDIT pages in RAM because it encodes
all
> > > * information (name, address, flags) in one small,
contiguous range.
> > > * The export area is a stream of nodes. The first node
sequentially
> > > * is the start node for the trie.
> > > *
> > > * Nodes for a symbol start with a byte that is the length of
> > > * the exported symbol information for the string so far.
> > > * If there is no exported symbol, the byte is zero. If there
> > > * is exported info, it follows the length byte. The
exported
> > > * info normally consists of a flags and offset both encoded
> > > * in uleb128. The offset is location of the content named
> > > * by the symbol. It is the offset from the mach_header for
> > > * the image.
> > > *
> > > * After the initial byte and optional exported symbol
information
> > > * is a byte of how many edges (0-255) that this node has
leaving
> > > * it, followed by each edge.
> > > * Each edge is a zero terminated cstring of the addition
chars
> > > * in the symbol, followed by a uleb128 offset for the node
that
> > > * edge points to.
> > > *
> > > */
> > > uint32_t export_off; /* file offset to lazy binding
info */
> > > uint32_t export_size; /* size of lazy binding infs */
> > > };
> > >
> > > /*
> > > * The following are used to encode rebasing information
> > > */
> > > #define REBASE_TYPE_POINTER 1
> > > #define REBASE_TYPE_TEXT_ABSOLUTE32 2
> > > #define REBASE_TYPE_TEXT_PCREL32 3
> > >
> > > #define REBASE_OPCODE_MASK 0xF0
> > > #define REBASE_IMMEDIATE_MASK 0x0F
> > > #define REBASE_OPCODE_DONE 0x00
> > > #define REBASE_OPCODE_SET_TYPE_IMM 0x10
> > > #define REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x20
> > > #define REBASE_OPCODE_ADD_ADDR_ULEB 0x30
> > > #define REBASE_OPCODE_ADD_ADDR_IMM_SCALED 0x40
> > > #define REBASE_OPCODE_DO_REBASE_IMM_TIMES 0x50
> > > #define REBASE_OPCODE_DO_REBASE_ULEB_TIMES 0x60
> > > #define REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB 0x70
> > > #define REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB 0x80
> > >
> > >
> > > /*
> > > * The following are used to encode binding information
> > > */
> > > #define BIND_TYPE_POINTER 1
> > > #define BIND_TYPE_TEXT_ABSOLUTE32 2
> > > #define BIND_TYPE_TEXT_PCREL32 3
> > >
> > > #define BIND_SPECIAL_DYLIB_SELF 0
> > > #define BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE -1
> > > #define BIND_SPECIAL_DYLIB_FLAT_LOOKUP -2
> > >
> > > #define BIND_SYMBOL_FLAGS_WEAK_IMPORT 0x1
> > > #define BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION 0x8
> > >
> > > #define BIND_OPCODE_MASK 0xF0
> > > #define BIND_IMMEDIATE_MASK 0x0F
> > > #define BIND_OPCODE_DONE 0x00
> > > #define BIND_OPCODE_SET_DYLIB_ORDINAL_IMM 0x10
> > > #define BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB 0x20
> > > #define BIND_OPCODE_SET_DYLIB_SPECIAL_IMM 0x30
> > > #define BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM 0x40
> > > #define BIND_OPCODE_SET_TYPE_IMM 0x50
> > > #define BIND_OPCODE_SET_ADDEND_SLEB 0x60
> > > #define BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x70
> > > #define BIND_OPCODE_ADD_ADDR_ULEB 0x80
> > > #define BIND_OPCODE_DO_BIND 0x90
> > > #define BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB 0xA0
> > > #define BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED 0xB0
> > > #define BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB 0xC0
> > >
> > >
> > > /*
> > > * The following are used on the flags byte of a terminal node
> > > * in the export information.
> > > */
> > > #define EXPORT_SYMBOL_FLAGS_KIND_MASK 0x03
> > > #define EXPORT_SYMBOL_FLAGS_KIND_REGULAR 0x00
> > > #define EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL 0x01
> > > #define EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION 0x04
> > > #define EXPORT_SYMBOL_FLAGS_INDIRECT_DEFINITION 0x08
> > > #define EXPORT_SYMBOL_FLAGS_HAS_SPECIALIZATIONS 0x10
> > >
> > > /*
> > > * The symseg_command contains the offset and size of the GNU
style
> > > * symbol table information as described in the header file
<symseg.h>.
> > > * The symbol roots of the symbol segments must also be aligned
properly
> > > * in the file. So the requirement of keeping the offsets
aligned to a
> > > * multiple of a 4 bytes translates to the length field of the
symbol
> > > * roots also being a multiple of a long. Also the padding must
again be
> > > * zeroed. (THIS IS OBSOLETE and no longer supported).
> > > */
> > > struct symseg_command {
> > > uint32_t cmd; /* LC_SYMSEG */
> > > uint32_t cmdsize; /* sizeof(struct symseg_command) */
> > > uint32_t offset; /* symbol segment offset */
> > > uint32_t size; /* symbol segment size in bytes */
> > > };
> > >
> > > /*
> > > * The ident_command contains a free format string table
following the
> > > * ident_command structure. The strings are null terminated and
the
> > > size of
> > > * the command is padded out with zero bytes to a multiple of 4
bytes/
> > > * (THIS IS OBSOLETE and no longer supported).
> > > */
> > > struct ident_command {
> > > uint32_t cmd; /* LC_IDENT */
> > > uint32_t cmdsize; /* strings that follow this command */
> > > };
> > >
> > > /*
> > > * The fvmfile_command contains a reference to a file to be
loaded at the
> > > * specified virtual address. (Presently, this command is
reserved for
> > > * internal use. The kernel ignores this command when loading a
> > > program into
> > > * memory).
> > > */
> > > struct fvmfile_command {
> > > uint32_t cmd; /* LC_FVMFILE */
> > > uint32_t cmdsize; /* includes pathname string */
> > > union lc_str name; /* files pathname */
> > > uint32_t header_addr; /* files virtual address */
> > > };
> > >
> > > #endif /* _MACHO_LOADER_H_ */
> > >
> > >
> > > On 07/26/10 15:21, Camm Maguire wrote:
> > >> Greetings1
> > >>
> > >> Matt Kaufmann<address@hidden> writes:
> > >>
> > >>
> > >>> Hi, Camm --
> > >>>
> > >>> I'd be very happy to give you access to my laptop, which is
the Intel
> > >>> box in question (which is running Mac OS 10.6.4, by the way).
But I
> > >>> don't know how to do it. I think could create an account, but
how do
> > >>>
> > >> Well, this looks difficult. It would be great if you could
send me
> > >> these files:
> > >>
> > >> #include<mach-o/loader.h>
> > >> #include<mach-o/nlist.h>
> > >>
> > >> #include<mach/mach.h>
> > >>
> > >> Separately, if you are interested, I can send you a small patch
that
> > >> steps around rsym_macosx all together. Of course, if you are
still on
> > >> vacation, please don't bother about this until you get home!
If there
> > >> is a machine at ut you could point me to, that of course would
be
> > >> great, but if you'd have to ask David Ranger, perhaps I could
just
> > >> email him myself.
> > >>
> > >> Last update, gcl can now run cross compiled for windows on
Linux under
> > >> wine. maxima just passed all its tests. Checking acl2 ....
The idea
> > >> being to get one tree verified on both these seldom used
machines (mac
> > >> and windows) and then finalize gcl 2.6.8.
> > >>
> > >> Take care,
> > >>
> > >>
> > >>> -- Matt
> > >>> From: Camm Maguire<address@hidden>
> > >>> Date: Mon, 26 Jul 2010 11:07:47 -0400
> > >>> X-SpamAssassin-Status: No, hits=0.2 required=5.0
> > >>> X-UTCS-Spam-Status: No, hits=-180 required=165
> > >>>
> > >>> Greetings! Sigh. I was afraid of this. There are
multiple versions
> > >>> of mac os x out there which apparently differ in
significant ways.
> > >>> Not sure of the versioning system, but 10.4, 10.5, and
10.6 sound
> > >>> familiar. This code was well tested on the axiom intel
mac box. Could
> > >>> you please provide access to the box in question?
> > >>>
> > >>> Take care,
> > >>> --
> > >>> Camm Maguire
address@hidden
> > >>>
==========================================================================
> > >>> "The earth is but one country, and mankind its citizens."
-- Baha'u'llah
> > >>>
> > >>>
> > >>>
> > >>>
> > >>>
> > >>
> > >
> > >
> > >
> > >
> >
> > --
> > Camm Maguire
address@hidden
> >
==========================================================================
> > "The earth is but one country, and mankind its citizens." --
Baha'u'llah/$ cat /usr/include/mach-o/nlist.h
> > /*
> > * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
> > *
> > * @APPLE_LICENSE_HEADER_START@
> > *
> > * This file contains Original Code and/or Modifications of Original
Code
> > * as defined in and that are subject to the Apple Public Source
License
> > * Version 2.0 (the 'License'). You may not use this file except in
> > * compliance with the License. Please obtain a copy of the License at
> > * http://www.opensource.apple.com/apsl/ and read it before using this
> > * file.
> > *
> > * The Original Code and all software distributed under the License
are
> > * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND,
EITHER
> > * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
> > * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
> > * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
NON-INFRINGEMENT.
> > * Please see the License for the specific language governing rights
and
> > * limitations under the License.
> > *
> > * @APPLE_LICENSE_HEADER_END@
> > */
> > #ifndef _MACHO_NLIST_H_
> > #define _MACHO_NLIST_H_
> > /* $NetBSD: nlist.h,v 1.5 1994/10/26 00:56:11 cgd Exp $ */
> >
> > /*-
> > * Copyright (c) 1991, 1993
> > * The Regents of the University of California. All rights
reserved.
> > * (c) UNIX System Laboratories, Inc.
> > * All or some portions of this file are derived from material
licensed
> > * to the University of California by American Telephone and Telegraph
> > * Co. or Unix System Laboratories, Inc. and are reproduced herein
with
> > * the permission of UNIX System Laboratories, Inc.
> > *
> > * Redistribution and use in source and binary forms, with or without
> > * modification, are permitted provided that the following conditions
> > * are met:
> > * 1. Redistributions of source code must retain the above copyright
> > * notice, this list of conditions and the following disclaimer.
> > * 2. Redistributions in binary form must reproduce the above
copyright
> > * notice, this list of conditions and the following disclaimer in
the
> > * documentation and/or other materials provided with the
distribution.
> > * 3. All advertising materials mentioning features or use of this
software
> > * must display the following acknowledgement:
> > * This product includes software developed by the University of
> > * California, Berkeley and its contributors.
> > * 4. Neither the name of the University nor the names of its
contributors
> > * may be used to endorse or promote products derived from this
software
> > * without specific prior written permission.
> > *
> > * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS
IS'' AND
> > * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE
> > * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE
> > * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
LIABLE
> > * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL
> > * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS
> > * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION)
> > * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT
> > * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY
> > * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF
> > * SUCH DAMAGE.
> > *
> > * @(#)nlist.h 8.2 (Berkeley) 1/21/94
> > */
> > #include <stdint.h>
> >
> > /*
> > * Format of a symbol table entry of a Mach-O file for 32-bit
architectures.
> > * Modified from the BSD format. The modifications from the original
format
> > * were changing n_other (an unused field) to n_sect and the addition
of the
> > * N_SECT type. These modifications are required to support symbols
in a larger
> > * number of sections not just the three sections (text, data and
bss) in a BSD
> > * file.
> > */
> > struct nlist {
> > union {
> > #ifndef __LP64__
> > char *n_name; /* for use when in-core */
> > #endif
> > int32_t n_strx; /* index into the string table */
> > } n_un;
> > uint8_t n_type; /* type flag, see below */
> > uint8_t n_sect; /* section number or NO_SECT */
> > int16_t n_desc; /* see <mach-o/stab.h> */
> > uint32_t n_value; /* value of this symbol (or stab
offset) */
> > };
> >
> > /*
> > * This is the symbol table entry structure for 64-bit architectures.
> > */
> > struct nlist_64 {
> > union {
> > uint32_t n_strx; /* index into the string table */
> > } n_un;
> > uint8_t n_type; /* type flag, see below */
> > uint8_t n_sect; /* section number or NO_SECT */
> > uint16_t n_desc; /* see <mach-o/stab.h> */
> > uint64_t n_value; /* value of this symbol (or stab offset) */
> > };
> >
> > /*
> > * Symbols with a index into the string table of zero (n_un.n_strx ==
0) are
> > * defined to have a null, "", name. Therefore all string indexes to
non null
> > * names must not have a zero string index. This is bit historical
information
> > * that has never been well documented.
> > */
> >
> > /*
> > * The n_type field really contains four fields:
> > * unsigned char N_STAB:3,
> > * N_PEXT:1,
> > * N_TYPE:3,
> > * N_EXT:1;
> > * which are used via the following masks.
> > */
> > #define N_STAB 0xe0 /* if any of these bits set, a symbolic
debugging entry */
> > #define N_PEXT 0x10 /* private external symbol bit */
> > #define N_TYPE 0x0e /* mask for the type bits */
> > #define N_EXT 0x01 /* external symbol bit, set for external
symbols */
> >
> > /*
> > * Only symbolic debugging entries have some of the N_STAB bits set
and if any
> > * of these bits are set then it is a symbolic debugging entry (a
stab). In
> > * which case then the values of the n_type field (the entire field)
are given
> > * in <mach-o/stab.h>
> > */
> >
> > /*
> > * Values for N_TYPE bits of the n_type field.
> > */
> > #define N_UNDF 0x0 /* undefined, n_sect == NO_SECT
*/
> > #define N_ABS 0x2 /* absolute, n_sect == NO_SECT
*/
> > #define N_SECT 0xe /* defined in section number
n_sect */
> > #define N_PBUD 0xc /* prebound undefined (defined
in a dylib) */
> > #define N_INDR 0xa /* indirect */
> >
> > /*
> > * If the type is N_INDR then the symbol is defined to be the same as
another
> > * symbol. In this case the n_value field is an index into the
string table
> > * of the other symbol's name. When the other symbol is defined then
they both
> > * take on the defined type and value.
> > */
> >
> > /*
> > * If the type is N_SECT then the n_sect field contains an ordinal of
the
> > * section the symbol is defined in. The sections are numbered from
1 and
> > * refer to sections in order they appear in the load commands for
the file
> > * they are in. This means the same ordinal may very well refer to
different
> > * sections in different files.
> > *
> > * The n_value field for all symbol table entries (including
N_STAB's) gets
> > * updated by the link editor based on the value of it's n_sect field
and where
> > * the section n_sect references gets relocated. If the value of the
n_sect
> > * field is NO_SECT then it's n_value field is not changed by the
link editor.
> > */
> > #define NO_SECT 0 /* symbol is not in any section
*/
> > #define MAX_SECT 255 /* 1 thru 255 inclusive */
> >
> > /*
> > * Common symbols are represented by undefined (N_UNDF) external
(N_EXT) types
> > * who's values (n_value) are non-zero. In which case the value of
the n_value
> > * field is the size (in bytes) of the common symbol. The n_sect
field is set
> > * to NO_SECT. The alignment of a common symbol may be set as a
power of 2
> > * between 2^1 and 2^15 as part of the n_desc field using the macros
below. If
> > * the alignment is not set (a value of zero) then natural alignment
based on
> > * the size is used.
> > */
> > #define GET_COMM_ALIGN(n_desc) (((n_desc) >> 8) & 0x0f)
> > #define SET_COMM_ALIGN(n_desc,align) \
> > (n_desc) = (((n_desc) & 0xf0ff) | (((align) & 0x0f) << 8))
> >
> > /*
> > * To support the lazy binding of undefined symbols in the dynamic
link-editor,
> > * the undefined symbols in the symbol table (the nlist structures)
are marked
> > * with the indication if the undefined reference is a lazy reference
or
> > * non-lazy reference. If both a non-lazy reference and a lazy
reference is
> > * made to the same symbol the non-lazy reference takes precedence.
A reference
> > * is lazy only when all references to that symbol are made through a
symbol
> > * pointer in a lazy symbol pointer section.
> > *
> > * The implementation of marking nlist structures in the symbol table
for
> > * undefined symbols will be to use some of the bits of the n_desc
field as a
> > * reference type. The mask REFERENCE_TYPE will be applied to the
n_desc field
> > * of an nlist structure for an undefined symbol to determine the
type of
> > * undefined reference (lazy or non-lazy).
> > *
> > * The constants for the REFERENCE FLAGS are propagated to the
reference table
> > * in a shared library file. In that case the constant for a defined
symbol,
> > * REFERENCE_FLAG_DEFINED, is also used.
> > */
> > /* Reference type bits of the n_desc field of undefined symbols */
> > #define REFERENCE_TYPE 0x7
> > /* types of references */
> > #define REFERENCE_FLAG_UNDEFINED_NON_LAZY 0
> > #define REFERENCE_FLAG_UNDEFINED_LAZY 1
> > #define REFERENCE_FLAG_DEFINED 2
> > #define REFERENCE_FLAG_PRIVATE_DEFINED 3
> > #define REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 4
> > #define REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 5
> >
> > /*
> > * To simplify stripping of objects that use are used with the
dynamic link
> > * editor, the static link editor marks the symbols defined an object
that are
> > * referenced by a dynamicly bound object (dynamic shared libraries,
bundles).
> > * With this marking strip knows not to strip these symbols.
> > */
> > #define REFERENCED_DYNAMICALLY 0x0010
> >
> > /*
> > * For images created by the static link editor with the
-twolevel_namespace
> > * option in effect the flags field of the mach header is marked with
> > * MH_TWOLEVEL. And the binding of the undefined references of the
image are
> > * determined by the static link editor. Which library an undefined
symbol is
> > * bound to is recorded by the static linker in the high 8 bits of
the n_desc
> > * field using the SET_LIBRARY_ORDINAL macro below. The ordinal
recorded
> > * references the libraries listed in the Mach-O's LC_LOAD_DYLIB load
commands
> > * in the order they appear in the headers. The library ordinals
start from 1.
> > * For a dynamic library that is built as a two-level namespace image
the
> > * undefined references from module defined in another use the same
nlist struct
> > * an in that case SELF_LIBRARY_ORDINAL is used as the library
ordinal. For
> > * defined symbols in all images they also must have the library
ordinal set to
> > * SELF_LIBRARY_ORDINAL. The EXECUTABLE_ORDINAL refers to the
executable
> > * image for references from plugins that refer to the executable
that loads
> > * them.
> > *
> > * The DYNAMIC_LOOKUP_ORDINAL is for undefined symbols in a two-level
namespace
> > * image that are looked up by the dynamic linker with flat namespace
semantics.
> > * This ordinal was added as a feature in Mac OS X 10.3 by reducing
the
> > * value of MAX_LIBRARY_ORDINAL by one. So it is legal for existing
binaries
> > * or binaries built with older tools to have 0xfe (254) dynamic
libraries. In
> > * this case the ordinal value 0xfe (254) must be treated as a
library ordinal
> > * for compatibility.
> > */
> > #define GET_LIBRARY_ORDINAL(n_desc) (((n_desc) >> 8) & 0xff)
> > #define SET_LIBRARY_ORDINAL(n_desc,ordinal) \
> > (n_desc) = (((n_desc) & 0x00ff) | (((ordinal) & 0xff) << 8))
> > #define SELF_LIBRARY_ORDINAL 0x0
> > #define MAX_LIBRARY_ORDINAL 0xfd
> > #define DYNAMIC_LOOKUP_ORDINAL 0xfe
> > #define EXECUTABLE_ORDINAL 0xff
> >
> > /*
> > * The bit 0x0020 of the n_desc field is used for two non-overlapping
purposes
> > * and has two different symbolic names, N_NO_DEAD_STRIP and
N_DESC_DISCARDED.
> > */
> >
> > /*
> > * The N_NO_DEAD_STRIP bit of the n_desc field only ever appears in a
> > * relocatable .o file (MH_OBJECT filetype). And is used to indicate
to the
> > * static link editor it is never to dead strip the symbol.
> > */
> > #define N_NO_DEAD_STRIP 0x0020 /* symbol is not to be dead stripped */
> >
> > /*
> > * The N_DESC_DISCARDED bit of the n_desc field never appears in
linked image.
> > * But is used in very rare cases by the dynamic link editor to mark
an in
> > * memory symbol as discared and longer used for linking.
> > */
> > #define N_DESC_DISCARDED 0x0020 /* symbol is discarded */
> >
> > /*
> > * The N_WEAK_REF bit of the n_desc field indicates to the dynamic
linker that
> > * the undefined symbol is allowed to be missing and is to have the
address of
> > * zero when missing.
> > */
> > #define N_WEAK_REF 0x0040 /* symbol is weak referenced */
> >
> > /*
> > * The N_WEAK_DEF bit of the n_desc field indicates to the static and
dynamic
> > * linkers that the symbol definition is weak, allowing a non-weak
symbol to
> > * also be used which causes the weak definition to be discared.
Currently this
> > * is only supported for symbols in coalesed sections.
> > */
> > #define N_WEAK_DEF 0x0080 /* coalesed symbol is a weak definition
*/
> >
> > /*
> > * The N_REF_TO_WEAK bit of the n_desc field indicates to the dynamic
linker
> > * that the undefined symbol should be resolved using flat namespace
searching.
> > */
> > #define N_REF_TO_WEAK 0x0080 /* reference to a weak symbol */
> >
> > /*
> > * The N_ARM_THUMB_DEF bit of the n_desc field indicates that the
symbol is
> > * a defintion of a Thumb function.
> > */
> > #define N_ARM_THUMB_DEF 0x0008 /* symbol is a Thumb function
(ARM) */
> >
> > #ifndef __STRICT_BSD__
> > #if __cplusplus
> > extern "C" {
> > #endif /* __cplusplus */
> > /*
> > * The function nlist(3) from the C library.
> > */
> > extern int nlist (const char *filename, struct nlist *list);
> > #if __cplusplus
> > }
> > #endif /* __cplusplus */
> > #endif /* __STRICT_BSD__ */
> >
> > #endif /* _MACHO_LIST_H_ */
> > /$ cat /usr/include/nlist.h
> > /*-
> > * Copyright (c) 1991, 1993
> > * The Regents of the University of California. All rights
reserved.
> > * (c) UNIX System Laboratories, Inc.
> > * All or some portions of this file are derived from material
licensed
> > * to the University of California by American Telephone and Telegraph
> > * Co. or Unix System Laboratories, Inc. and are reproduced herein
with
> > * the permission of UNIX System Laboratories, Inc.
> > *
> > * Redistribution and use in source and binary forms, with or without
> > * modification, are permitted provided that the following conditions
> > * are met:
> > * 1. Redistributions of source code must retain the above copyright
> > * notice, this list of conditions and the following disclaimer.
> > * 2. Redistributions in binary form must reproduce the above
copyright
> > * notice, this list of conditions and the following disclaimer in
the
> > * documentation and/or other materials provided with the
distribution.
> > * 3. All advertising materials mentioning features or use of this
software
> > * must display the following acknowledgement:
> > * This product includes software developed by the University of
> > * California, Berkeley and its contributors.
> > * 4. Neither the name of the University nor the names of its
contributors
> > * may be used to endorse or promote products derived from this
software
> > * without specific prior written permission.
> > *
> > * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS
IS'' AND
> > * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE
> > * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE
> > * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
LIABLE
> > * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL
> > * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS
> > * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION)
> > * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT
> > * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY
> > * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF
> > * SUCH DAMAGE.
> > *
> > * @(#)nlist.h 8.2 (Berkeley) 1/21/94
> > */
> >
> > #ifndef _NLIST_H_
> > #define _NLIST_H_
> >
> > /*
> > * Symbol table entry format. The #ifdef's are so that programs
including
> > * nlist.h can initialize nlist structures statically.
> > */
> > struct nlist {
> > #ifdef _AOUT_INCLUDE_
> > union {
> > char *n_name; /* symbol name (in memory) */
> > long n_strx; /* file string table offset (on disk) */
> > } n_un;
> > #else
> > char *n_name; /* symbol name (in memory) */
> > #endif
> >
> > #define N_UNDF 0x00 /* undefined */
> > #define N_ABS 0x02 /* absolute address */
> > #define N_TEXT 0x04 /* text segment */
> > #define N_DATA 0x06 /* data segment */
> > #define N_BSS 0x08 /* bss segment */
> > #define N_COMM 0x12 /* common reference */
> > #define N_FN 0x1e /* file name */
> >
> > #define N_EXT 0x01 /* external (global) bit, OR'ed
in */
> > #define N_TYPE 0x1e /* mask for all the type bits */
> > unsigned char n_type; /* type defines */
> >
> > char n_other; /* spare */
> > #define n_hash n_desc /* used internally by ld(1);
XXX */
> > short n_desc; /* used by stab entries */
> > unsigned long n_value; /* address/value of the symbol */
> > };
> >
> > #define N_FORMAT "%08x" /* namelist value format; XXX */
> > #define N_STAB 0x0e0 /* mask for debugger symbols --
stab(5) */
> >
> > #include <sys/cdefs.h>
> >
> > __BEGIN_DECLS
> > int nlist(const char *, struct nlist *);
> > __END_DECLS
> >
> > #endif /* !_NLIST_H_ */
> > /$ =
>
> --
> Camm Maguire address@hidden
>
==========================================================================
> "The earth is but one country, and mankind its citizens." --
Baha'u'llah
>
>
>
>
--
Camm Maguire address@hidden
==========================================================================
"The earth is but one country, and mankind its citizens." -- Baha'u'llah
- [Gcl-devel] Re: ACL2 Version 4.0, (continued)
- [Gcl-devel] Re: ACL2 Version 4.0, Camm Maguire, 2010/07/25
- [Gcl-devel] Re: ACL2 Version 4.0, Matt Kaufmann, 2010/07/26
- Message not available
- Message not available
- Message not available
- [Gcl-devel] Re: ACL2 Version 4.0, Camm Maguire, 2010/07/26
- [Gcl-devel] Re: ACL2 Version 4.0, Matt Kaufmann, 2010/07/26
- Re: [Gcl-devel] Re: ACL2 Version 4.0, George W. Dinolt, 2010/07/26
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Camm Maguire, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Matt Kaufmann, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Camm Maguire, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Matt Kaufmann, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Camm Maguire, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0,
Matt Kaufmann <=
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Matt Kaufmann, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Camm Maguire, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Matt Kaufmann, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Camm Maguire, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Matt Kaufmann, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Camm Maguire, 2010/07/27
- Re: [Gcl-devel] Re: ACL2 Version 4.0, Matt Kaufmann, 2010/07/28
- [Gcl-devel] gcl-2.6.8, Camm Maguire, 2010/07/28
- Re: [Gcl-devel] gcl-2.6.8, Gabriel Dos Reis, 2010/07/29
- Re: [Gcl-devel] gcl-2.6.8, Camm Maguire, 2010/07/30