NMEDIT(1) NMEDIT(1)
NAME
nmedit - change global symbols to local symbols
SYNOPSIS
nmedit -s list_file [-R list_file] [-p] [-A] [-] [[-arch
arch_type] ...] object_file ... [-o output]
DESCRIPTION
Nmedit changes the global symbols not listed in the
list_file file of the -s list_file option to static sym-
bols. Undefined symbols and common symbols are not
effected and shouldn't be listed in list_file. For
dynamic libraries symbols are turned into private extern
symbols that are no longer external (rather than static
symbols). This is done so that the references between
modules of a dynamic library are resolved to the symbols
in the dynamic library. Nmedit differs from strip(1) in
that it also changes the symbolic debugging information
(produce by the -g option to cc(1)) for the global symbols
it changes to static symbols so that the resulting object
can still be used with the debugger.
Nmedit like strip(1) is useful to limit the symbols for
use with later linking. This allows control of the inter-
face that the executable wants to provide to the objects
that it will dynamically load, and it will not have to
publish symbols that are not part of its interface. For
example an executable that wishes to allow only a subset
of its global symbols but all of the shared libraries
globals to be used would have its symbol table edited
with:
% nmedit -s interface_symbols -A executable
where the file interface_symbols would contain only those
symbols from the executable that it wishes the objects
loaded at runtime to have access to. Another example is
an object that is made up of a number of other objects
that will be loaded into an executable would built and
then have its symbol table edited with:
% ld -o relocatable.o -r a.o b.o c.o
% nmedit -s interface_symbols relocatable.o
which would leave only the symbols listed in the file
interface_symbols (and the undefined and common symbols)
as global symbols in the object file.
The one or more of the following options is required to
nmedit(1) is:
-s filename
Leave the symbol table entries for the global sym-
bols listed in filename global but turn all other
global symbols (except undefined and common sym-
bols) into static symbols. The symbol names listed
in filename must be one per line. Leading and
trailing white space are not part of the symbol
name. Lines starting with # are ignored, as are
lines with only white space.
-R filename
Change the symbol table entries for the global sym-
bols listed in filename into static symbols. This
file has the same format as the -s filename option
above. If the -R filename option is specified
without the -s filename option, then all symbols
not listed in the -R filename option's filename are
left as globals. If both a -R filename and a -s
filename are given the symbols listed in the -R
filename are basically ignored and only those sym-
bols listed in the -s filename are saved.
-p Change symbols to private externs instead of
static. This is allowed as the only option to
change all defined global symbols to private
externs.
The options to nmedit(1) are:
-A Leave all global absolute symbols except those with
a value of zero, and save objective-C class symbols
as globals. This is intended for use of programs
that load code at runtime and want the loaded code
to use symbols from the shared libraries.
- Treat all remaining arguments as file names and not
options.
-arch arch_type
Specifies the architecture, arch_type, of the file
for nmedit(1) to process when the file is a fat
file (see arch(3) for the currently know
arch_types). The arch_type can be all to process
all architectures in the file. The default is to
process all architectures that are contained in the
file.
-o output
Write the result into the file output.
SEE ALSO
strip(1), ld(1), arch(3)
BUGS
The changing of the symbolic debugging information by
nmedit is not known to be totally correct and could cause
the debugger to crash, get confused or produce incorrect
information.
Apple Computer, Inc. March 19, 2002 NMEDIT(1)