#include <mach-o/nlist.h>

mach-o/nlist.h

$NetBSD: nlist.h,v 1.5 1994/10/26 00:56:11 cgd Exp $
includes: stdint.h
36 macros · 2 structs · 1 function

structnlist

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.
size 12, align 4
unnamed union at mach-o/nlist.h:77:2n_un
uint32_tn_strxindex into the string table
uint8_tn_typetype flag, see below
uint8_tn_sectsection number or NO_SECT
int16_tn_descsee <mach-o/stab.h>
uint32_tn_valuevalue of this symbol (or stab offset)

structnlist_64

This is the symbol table entry structure for 64-bit architectures.
size 16, align 8
unnamed union at mach-o/nlist.h:93:5n_un
uint32_tn_strxindex into the string table
uint8_tn_typetype flag, see below
uint8_tn_sectsection number or NO_SECT
uint16_tn_descsee <mach-o/stab.h>
uint64_tn_valuevalue of this symbol (or stab offset)

macroN_STAB

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

macroN_PEXT

#define N_PEXT 0x10
private external symbol bit

macroN_TYPE

#define N_TYPE 0x0e
mask for the type bits

macroN_EXT

#define N_EXT 0x01
external symbol bit, set for external symbols

macroN_UNDF

Values for N_TYPE bits of the n_type field.
#define N_UNDF 0x0
undefined, n_sect == NO_SECT

macroN_ABS

#define N_ABS 0x2
absolute, n_sect == NO_SECT

macroN_SECT

#define N_SECT 0xe
defined in section number n_sect

macroN_PBUD

#define N_PBUD 0xc
prebound undefined (defined in a dylib)

macroN_INDR

#define N_INDR 0xa
indirect

macroNO_SECT

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

macroMAX_SECT

#define MAX_SECT 255
1 thru 255 inclusive

macroGET_COMM_ALIGN

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)

macroSET_COMM_ALIGN

#define SET_COMM_ALIGN(n_desc, align) (n_desc) = (((n_desc) & 0xf0ff) | (((align) & 0x0f) << 8))

macroREFERENCE_TYPE

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

macroREFERENCE_FLAG_UNDEFINED_NON_LAZY

types of references
#define REFERENCE_FLAG_UNDEFINED_NON_LAZY 0

macroREFERENCE_FLAG_UNDEFINED_LAZY

#define REFERENCE_FLAG_UNDEFINED_LAZY 1

macroREFERENCE_FLAG_DEFINED

#define REFERENCE_FLAG_DEFINED 2

macroREFERENCE_FLAG_PRIVATE_DEFINED

#define REFERENCE_FLAG_PRIVATE_DEFINED 3

macroREFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY

#define REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 4

macroREFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY

#define REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 5

macroREFERENCED_DYNAMICALLY

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 dynamically bound object (dynamic shared libraries, bundles). With this marking strip knows not to strip these symbols.
#define REFERENCED_DYNAMICALLY 0x0010

macroGET_LIBRARY_ORDINAL

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, LC_LOAD_WEAK_DYLIB, LC_REEXPORT_DYLIB, LC_LOAD_UPWARD_DYLIB, and LC_LAZY_LOAD_DYLIB, etc. 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)

macroSET_LIBRARY_ORDINAL

#define SET_LIBRARY_ORDINAL(n_desc, ordinal) (n_desc) = (((n_desc) & 0x00ff) | (((ordinal) & 0xff) << 8))

macroSELF_LIBRARY_ORDINAL

#define SELF_LIBRARY_ORDINAL 0x0

macroMAX_LIBRARY_ORDINAL

#define MAX_LIBRARY_ORDINAL 0xfd

macroDYNAMIC_LOOKUP_ORDINAL

#define DYNAMIC_LOOKUP_ORDINAL 0xfe

macroEXECUTABLE_ORDINAL

#define EXECUTABLE_ORDINAL 0xff

macroN_NO_DEAD_STRIP

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

macroN_DESC_DISCARDED

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

macroN_WEAK_REF

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

macroN_WEAK_DEF

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

macroN_REF_TO_WEAK

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

macroN_ARM_THUMB_DEF

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)

macroN_SYMBOL_RESOLVER

The N_SYMBOL_RESOLVER bit of the n_desc field indicates that the that the function is actually a resolver function and should be called to get the address of the real function to use. This bit is only available in .o files (MH_OBJECT filetype)
#define N_SYMBOL_RESOLVER 0x0100

macroN_ALT_ENTRY

The N_ALT_ENTRY bit of the n_desc field indicates that the symbol is pinned to the previous content.
#define N_ALT_ENTRY 0x0200

macroN_COLD_FUNC

The N_COLD_FUNC bit of the n_desc field indicates that the symbol is used infrequently and the linker should order it towards the end of the section.
#define N_COLD_FUNC 0x0400

functionnlist

extern int nlist(const char *filename, struct nlist *list)
The function nlist(3) from the C library.