Jump to content United States-English
HP.com Home Products and Services Support and Drivers Solutions How to Buy
» Contact HP
More options
HP.com home
HP-UX Reference > L

ld_pa(1)

PA-RISC Systems Only
HP-UX 11i Version 3: February 2007
» 

Technical documentation

» Feedback
Content starts here

 » Table of Contents

 » Index

NAME

ld_pa: ld — link editor for PA-RISC systems

SYNOPSIS

Common Options

ld [-bdmnqrstvxzEGIOPQTVZ] [-a search] [-c filename] [-dynamic] [-e epsym] [-h symbol]... [-l x | file]... [-l: library] [-noshared] [-o outfile] [-u symbol]... [-y symbol]... [-B bind] [-D offset] [-Fl lib] [-L dir]... [-R offset] [-Pd] [-PD file] [-PF file] [+afs func_sym_x=func_sym_y]... [+allowdups] [+b path_list] [+compat] [+copyobjdebug] [+df file] [+e symbol] [+ee symbol] [+fb] [+fbu] [+filter shared_library_path] [+fini function] [+gst] [+gstsize size] [+h internal_name] [+help] [+init function] [+[no]inputmmap] [+interp file] [+k] [+n] [+[no]mergeseg] [+[no]mmap] [+nocopyobjdebug] [+noobjdebug] [+objdebugonly] [+origin shared_library_path] [+pd size] [+pgm name] [+pi size] [+profilebucketsize size] [+s] [+std] [+tools] [+v[no]shlibunsats] [+vallcompatwarnings] [+v[no]compatwarnings] [+FP flag] [+I symbol] [+O[no]fastaccess] [+O[no]procelim] [+Oreusedir=dir] [+Oselectivepercent n] [+Oselectivesize size] [+OselectiveO3] [+Ostaticprediction]

PA-RISC 32-Bit (SOM) Options

ld [-NS] [-A name] [-C n] [-Fw] [-Fz] [+cdp oldpath:newpath] [+cg pathname] [+dpv] [+ea filename] [+gstbuckets size] [+nosmartbind] [+plabel_cache flag]

PA-RISC 64-Bit (ELF) Options

ld [-w] [-k filename] [-symbolic symbol]... [+alloc_hidden_symbols] [+allowrorelocs] [+[no]allowunsats] [+[no]defaultrpath] [+[no]forceload] [+hideallsymbols] [+ild] [+ildnowarn] [+ildpad percentage] [+ildrelink] [+interposer] [+[no]lazyload] [+linkersyms] [+nobss] [+nodefaultmap] [+noenvvar] [+nodynhash] [+noprocelim_sym symbol]... [+nosectionmerge] [+nosymb symbol]... [+paddata pagesize] [+padtext pagesize] [+pdzero] [+stripunwind] [+vtype type]

Remarks

This manpage describes ld on PA-RISC systems. For ld on Integrity systems, see ld_ia(1).

DESCRIPTION

ld takes one or more object files or libraries as input and combines them to produce a single (usually executable) file. In doing so it resolves references to external symbols, assigns final addresses to procedures and variables, revises code and data to reflect new addresses (a process called "relocation"), and updates symbolic debug information when present in the file. By default, ld produces an executable file that can be run by the HP-UX loader exec() (see exec(2)). Alternatively, the linker can generate a relocatable file that is suitable for further processing by ld (see -r below). It can also generate a shared library (see -b below). The linker marks the output file non-executable if there are any duplicate symbols or any unresolved external references remain. ld may or may not generate an output file (see +k option) if any other errors occur during its operation.

ld recognizes three kinds of input files: object files created by the compilers, assembler, or linker (also known as .o files), shared libraries created by the linker, and archives of object files (called archive libraries).

An archive library contains a table of all the externally-visible symbols from its component object files. (The archiver command ar(1) creates and maintains this index.) ld uses this table to resolve references to external symbols.

ld processes files in the same order as they appear on the command line. It includes code and data from an archive library element if and only if that object module provides a definition for a currently unresolved reference within the user's program or shared library or dependent shared library. It is common practice to list libraries following the names of all simple object files on the command line.

Code and data from shared libraries is never copied into an executable program. The dynamic loader /usr/lib/dld.sl on 32-bit links is invoked at startup time by the startup file crt0.o if a program uses shared libraries. Identical copies of crt0.o can be found in either /usr/ccs/lib/crt0.o or /opt/langtools/lib/crt0.o. For 64-bit mode, the dynamic loader is /usr/lib/pa20_64/dld.sl and is invoked by exec for those programs that use shared libraries. crt0.o is not required in shared bound links. The dynamic loader attaches each required library to the process and resolves all symbolic references between the program and its libraries.

NOTE: For information on linking secure programs with shared libraries, see the Security Restrictions section below.

The text segment of a shared library is shared among all processes that use the library; each process using the library receives its own copy of the data segment. If pxdb -s on has been run on the executable that loads the library, the text segment of a shared library is mapped privately for each process running the executable. ld recursively examines the dependencies of shared libraries used by a program that was created by ld. If ld does not find a supporting shared library at the path recorded in the dependency list of a shared library, and if the dependency is the result of an -l argument used when the shared library was created, ld will search all the directories that it would search for a library that was specified with -l (see -L and LPATH).

Environment Variables

Arguments can be passed to the linker through the LDOPTS environment variable as well as on the command line. The linker gets the value of LDOPTS and places its contents before any arguments on the command line.

The LD_PXDB environment variable defines the full execution path for the debug preprocessor pxdb. The default value is /opt/langtools/bin/pxdb. ld invokes pxdb on its output file if that file is executable and contains debug information. To defer invocation of pxdb until the first debug session, set LD_PXDB to /bin/true.

The LPATH environment variable can be used to specify default directories to search for library files. See the -l option.

Common Options

The common ld options are listed first, followed by the options supported only in a 32-bit linker, and then the options only supported in a 64-bit linker.

-a search

Specify whether shared or archive libraries are searched with the -l option. The value of search should be one of archive, shared, archive_shared, shared_archive, or default. This option can appear more than once, interspersed among -l options, to control the searching for each library. The default is to use the shared version of a library if one is available, or the archive version if not.

If either archive or shared is active, only the specified library type is accepted.

If archive_shared is active, the archive form is preferred, but the shared form is allowed.

If shared_archive is active, the shared form is preferred but the archive form is allowed.

-b

Create a shared library rather than a normal executable file. Object files processed with this option must contain position-independent code (PIC). See the discussion of PIC in cc(1), CC(1) (part of the optional C++ compiler documentation), f77(1), pc(1), as(1), and Linker and Libraries Online User Guide.

-c filename

Read ld options from a file. Each line contains zero or more arguments separated by white space. Each line in the file, including the last line, must end with a newline character. A # character implies that the rest of the line is a comment. To escape a # character, use the sequence ##.

-d

Force definition of "common" storage; that is, assign addresses and sizes, for -r output. This option also strips COMDAT information from the -r output.

-dynamic

This allows the linker to create a program which can use shared libraries. This is the default for 64-bit links unless +compat is used. In 32-bit mode, the linker creates a static executable if there are no shared libraries on the link line.

-e epsym

Set the default entry point address for the output file to be that of the symbol epsym. (This option only applies to executable files.)

-h symbol

Prior to writing the symbol table to the output file, mark this name as "local" so that it is no longer externally visible. This ensures that this particular entry will not clash with a definition in another file during future processing by ld.

More than one symbol can be specified, but -h must precede each one. If used when building a shared library or program, this option prevents the named symbol from being visible to the dynamic loader.

-lx

Search a library libx.a or libx.sl, where x is one or more characters. The current state of the -a option determines whether the archive (.a) or shared (.sl) version of a library is searched. Because a library is searched when its name is encountered, the placement of a -l is significant. By default, 32-bit libraries are located in /usr/lib and /usr/ccs/lib. 64-bit libraries are located in /usr/lib/pa20_64. If the environment variable LPATH is present in the user's environment, it should contain a colon-separated list of directories to search. These directories are searched instead of the default directories, but -L options can still be used. If a program uses shared libraries, the dynamic loader /usr/lib/dld.sl for 32-bit or /usr/lib/pa20_64/dld.sl for 64-bit will attempt to load each library from the same directory in which it was found at link time (see the +s and +b options).

-l: library

Search the library specified. Similar to the -l option except the current state of the -a option is not important. The library name can be any valid filename. (Note that previous releases required that the library name contain the prefix lib and end with a suffix of .a or .sl.)

-m

This option produces a load map on the standard output.

-n

This option is accepted but ignored by the 64-bit ld. Generate an executable output file with file type SHARE_MAGIC. This is the default. This option is incompatible with -N and -q.

-noshared

This option forces the linker to create a fully archive bound program.

-o outfile

Produce an output object file named outfile (a.out if -o outfile is not specified).

-q

This option is ignored for 64-bit links. Generate an executable output file with file type DEMAND_MAGIC. This option is incompatible with -n, -N, and -Q.

-r

Retain relocation information in the output file for subsequent re-linking. The ld command does not report undefined symbols. This option cannot be used when building a shared library ( -b ) or in conjunction with -A or +ild incremental linking options.

-s

Strip the output file of all symbol table, relocation, and debug support information. This might impair or prevent the use of a symbolic debugger or a profiler on the resulting program. This option is incompatible with -r. (The strip(1) command also removes this information.) This option is incompatible with +ild. (The incremental linking requires the parts of the output load module which are stripped out with -s option.)

-t

Print a trace (to standard output) of each input file as ld processes it.

-u symbol

Enter symbol as an undefined symbol in the symbol table. The resulting unresolved reference is useful for linking a program solely from object files in a library. More than one symbol can be specified, but each must be preceded by -u.

-v

Display verbose messages during linking. On 32-bit systems, for each module loaded, the linker indicates which symbol caused that module to be loaded. For 64-bit systems, the linker indicates this information only for modules loaded from archive libraries.

-x

Strip local symbols from the output file. This reduces the size of the output file without impairing the effectiveness of object file utilities. This option is incompatible with the -r option. This option is incompatible with the +ild option. The incremental linking requires the parts of the output load module which are stripped out with the -x option.

NOTE: Use of -x might affect the use of a debugger or profiler.

-y symbol

Indicate each file in which symbol appears. More than one symbol can be specified, but each must be preceded by -y.

-z

Arrange for run-time dereferencing of null pointers to produce a SIGSEGV signal. (This is the complement of the -Z option.)

-B bind

Select run-time binding behavior of a program using shared libraries or the binding preference in building a shared library. The most common values for bind are:

direct

Create a direct link between symbol references and shared libraries by recording the name of the resolved shared library during symbol resolution. This information is used during runtime to quickly resolve symbols without searching through all currently loaded libraries.

-B direct implicitly turns on symbolic binding (see -B symbolic) and disables dependent shared library processing.

Direct binding can be disabled during runtime by setting the LD_NODIRECTBIND environment variable.

deferred

Bind addresses on first reference rather than at program start-up time. This is the default.

group

Mark the shared library so that it behaves as if loaded with RTLD_GROUP flag to dlopen(). This does not affect the dependent shared libraries.

NOTE: The -B group binding mode is currently supported only for 64-bit applications.

immediate

Bind addresses of all symbols immediately upon loading the library. Commonly followed by -B nonfatal to allow procedure calls that cannot be resolved at program start-up to be resolved on first reference.

Since -B nonfatal suppresses messages about unresolved symbols, also specify -B verbose to display those messages.

See the example below.

lazydirect

Only record direct bind information to shared libraries marked for lazy loading. See +[no]lazyload.

nodelete

Mark the shared library so that an explicit unload using dlclose() or shl_load() returns success silently without detaching the shared library from the process. Subsequently, the shared library handle is valid only for shl_findsym(). It stays invalid for dlsym(), dlclose(), and shl_unload() until the next explicit load using shl_load() or dlopen().

nodirect

Disallow direct binding. Only a "direct hint" is recoreded for references to libraries marked for lazy loading. This is the default behaivor.

nonfatal

If also using -B immediate, for code symbols that could not be bound at program startup, defer binding them until they are referenced. See description of -B immediate above.

Since -B nonfatal suppresses messages about unresolved symbols, also specify -B verbose to display those messages.

restricted

Causes the search for a symbol definition to be restricted to those symbols that were visible when the library was loaded.

symbolic

Used only when building a shared library (with the -b option), this option causes all unresolved symbols inside a library to be resolved internally if possible. By default, unresolved symbols are resolved to the most visible definition in the library or outside the library.

NOTE: Do not use this option while building aC++ shared libraries on Integrity systems. Use the aC++ option -B protected_def.

verbose

Display verbose messages when binding symbols. This is the default except when -B nonfatal is specified. In that case, -B verbose must be explicitly specified to get verbose messages.

See the +help option or the HP-UX Linker and Libraries User's Guide manual for more information on the uses of binding modes.

-D offset

Set the origin (in hexadecimal) for the data segment.

When used with the +ild option, if you change the offset after the initial incremental link, the linker performs an initial incremental link automatically.

-E

Mark all symbols defined by a program for export to shared libraries. In a 32-bit link or +compat mode 64-bit link, ld marks only those symbols that are actually referenced by a shared library seen at link time. In a 64-bit +std link, all symbols are exported by default, so -E is not necessary to make symbols visible. However, it has an additional side effect of identifying all exported symbols as necessary, so that they will not be removed when using dead code elimination (+Oprocelim).

-Fl lib

Force load all member objects of the archive library lib. If you do not use -Fl, the linker only loads the needed archive members from lib. This option is useful for creating a shared library from an archive library (if the member objects are position-independent code), or when you need to load archive member that define symbols needed by shared libraries.

You can specify more than one library on the command line with multiple option-library pairs; that is, each library you specify must be preceded by the -Fl option.

-G

Strip all unloadable data from the output file. This option is typically used to strip debug information.

-I

Instrument the code to collect profile information upon execution. The profile data gathered during program execution can be used in conjunction with the -P option. 32-bit programs linked with this option should use the startup file /opt/langtools/lib/icrt0.o. This option should not be used with the -P, -A, -O, +ild, or +O options.

-L dir

Search for libx.a or libx.sl in dir before looking in default locations. More than one directory can be specified, but each must be preceded by -L. The -L option is effective only if it precedes the -l option on the command line.

-O

Turn on linker optimizations. Currently the optimizations include the elimination of unnecessary ADDIL instructions from the code in the executable file (32-bit only), and the removal of dead procedures.

-O is passed to the linker by the compilers when the +O4 compiler option is selected.

This option is incompatible with the +ild option.

For more details on linker optimizations refer to the +help option or the HP-UX Linker and Libraries User's Guide manual.

-P

Examine the data file produced by an instrumented program (see the -I option) to perform profile based optimizations on the code. This option should not be used with the -A or +ild options.

-Q

Ignored for 64-bit links. Generate an executable output file with file type EXEC_MAGIC or SHARE_MAGIC, depending on whether -N or -n is specified. This is the default. This option is incompatible with -q.

-R offset

Set the origin (in hexadecimal) for the text (i.e., code) segment.

When used with the +ild option, if you change the offset after the initial incremental link, the linker performs an initial incremental link automatically.

-T

In 32-bit mode, save the load data and relocation information in temporary files instead of in memory during linking. This option reduces the virtual memory requirements of the linker. If the TMPDIR environment variable is set, the temporary files are created in the specified directory, rather than in /var/tmp.

In 64-bit mode, this option is equivalent to the +nommap option.

-V

Output a message giving information about the version of ld being used.

-Z

Allow run-time dereferencing of null pointers. See the discussions of -Z and pointers in cc(1). (This is the complement of the -z option.)

-Pd

Reorder debuggable functions. Ordinarily -P does not reorder functions from .o files with debugging information, because reordering renders them non-debuggable. This option overrides this and reorders the functions. Reordering is based on link order file produced from flow.data by default. If you specify the -PF option, the linker uses the specified link order file, instead of flow.data, for reordering. This option is incompatible with +ild.

-PD filename

Save link order file generated by fdp during linking with -P option into user-specified file. This option is incompatible with the +ild option.

-PF filename

Indicate to the linker to use the specified file for the linker file instead of generating it using /usr/ccs/bin/fdp. This option is incompatible with the +ild option.

+afs func_sym_x=func_sym_y ...

Instruct the linker to replace the function symbol with an alternate function symbol in shared library and executable file links.

The +afs option supports function symbol aliasing. Often user programs have functions that exactly match the functionality of optimized library functions with a different name. These user-defined functions are usually called frequently in the program. With the +afs option, you can make significant gains in performance by replacing all references to a user-defined function with references to a tuned library function during link time, thus optimizing these functions with just a relink.

Both functions must define the same number and type of parameters, and return a value of the same type. If they do not match, the results are unpredictable, and the linker does not generate a warning message.

Example:

$ ld ... +afs func_sym1=func_sym2 ...

In the example, the linker replaces all references to the function symbol func_sym1 with references to func_sym2. The func_sym2 symbol should be an normal unaliased symbol. It cannot appear on the left-hand side of "=" on another +afs option.

You can specify more than one function symbol alias on the command line with multiple option-symbol pairs, that is, each symbol pair you specify must be preceded by the +afs option.

+allowdups

Allows multiple symbol definitions. By default, multiple symbol definitions that occur between relocatable objects will result in a fatal error condition. This option suppresses the error condition and allows the first symbol definition to be taken.

+b path_list

Specify a colon-separated list of directories (embedded path) to be searched at program run-time to locate shared libraries needed by the executable output file that were specified with either the -l or -l: option.

An argument consisting of a single colon (:) indicates that ld should build the list using all the directories specified by the -L option and the LPATH environment variable (see the +s option).

For 32-bit links, if multiple +b options appear on the link line, the FIRST one specified is recorded. Also, a double colon (::) is interpreted as location in which libraries are found at link time.

For 64-bit links, the LAST of multiple +b options is recorded in the output file. A double colon (::) does not have special meaning (i.e., treated as NULL entry).

+compat

This option is ignored for 32-bit links. This option turns on compatibility mode in the linker — 64-bit links mimic behavior of 32-bit links).

+copyobjdebug

Copy objdebug space.

+df file

Used together with the -P option, this option specifies that file should be used as the profile database file. The default value is flow.data. See the discussion of the FLOW_DATA environment variable for more information. This option is incompatible with the +ild option.

+e symbol

When building a shared library or program, mark the symbol for export to the dynamic loader. Only symbols explicitly marked are exported. When building a shared library, calls to symbols that are not exported are resolved internally.

+ee symbol

This option is similar to the +e option in that it exports a symbol. However, unlike the +e option, +ee does not alter the visibility of any other symbol in the file. In a 32-bit link or +compat mode 64-bit link, it has the effect of exporting the specified symbol without hiding any of the symbols exported by default. In a 64 +std link, all symbols are exported by default, so +ee is not necessary to make a symbol visible. However, it has the additional side effect of identifying the symbol as necessary, so that it will not be removed when using dead code elimination (+Oprocelim). Of course, +ee still retains its export behavior if an option such as +hideallsymbols is also given.

+fb

Instructs the linker to run the fastbind tool on the executable it has produced. The executable should be linked with shared libraries. For more details refer to fastbind(1), the +help option, or the HP-UX Linker and Libraries User's Guide manual. This option is incompatible with the +ild option.

+fbu

Pass the -u option to the fastbind tool. For more details refer to fastbind(1), the +help option, or the HP-UX Linker and Libraries User's Guide manual. This option is incompatible with the +ild option.

+filter shared_library_path

Enables the shared library filter mechanism, which allows you divide a large library into a "filter" and several "implementation" libraries for more efficient organization of shared libraries. shared_library_path specifies the location of the filter library. See the HP-UX Linker and Libraries User's Guide for more information.

+fini function_name

Specify the terminator (finalizer) functions to be invoked in forward order, the order the functions appear left to right on the command line. The terminator functions are called in reverse of the depth-first order of initializers.

Use this option while building a shared library, an incomplete executable, or fully bound executable. Functions specified with this option should take no arguments and return nothing (void functions). Terminators are invoked only if main() calls exit(). They are not called if main() calls return().

Do not use +fini with the -r option. (The linker ignores the +fini option.)

You can specify more than one terminator function on the command line with multiple option-symbol pairs, that is, each function you specify must be preceded by the +fini option.

For more details on the terminator function, use the +help option or see the HP-UX Linker and Libraries User's Guide.

+gst

Enable the global symbol table hash mechanism, used to look up values of symbol import/export entries. The +gst and related options provide performance enhancements through use of global symbol table which improves searching for exported symbols. See dld.sl(5) and the HP-UX Linker and Libraries Online User Guide for more information.

+gstsize size

Request a particular hash array size using the global symbol table hash mechanism. The default value is 1103. The value can be overridden at runtime by setting the _HP_DLDOPTS environment variable to the value -symtab_size prime number. You can set the value using chatr +gstsize size file.

+h internal_name

When building a shared library, record internal_name as the name of the library. When the library is used to link another executable file (program or shared library), this internal_name is recorded in the library list of the resulting output file instead of the file system pathname of the input shared library.

That is, if +h is not used, the shared library does not have an internal name and when an executable is built with the shared library, the linker records the library name that it looks at.

If internal_name is a fully-qualified pathname, it is recorded as is in the library list of any executable file it is subsequently linked against. internal_name is a relative pathname or no directory component was specified, internal_name is appended to the file system directory component of the input shared library in the library list of any executable file it is subsequently linked against.

If more than one +h option is seen on the link line, the first one is used and a warning message is emitted.

+help

Starts the help window utility HP-UX Linker and Libraries Online User Guide which comes with some HP compilers. (You must be running the X window system and your DISPLAY environment variable must be set to the name of your workstation or X terminal.) For more information, refer to the HP-UX Linker and Libraries User's Guide manual. See manuals(5) for ordering information.

+init function_name

Specify the initializer functions to be invoked in reverse order, the order the functions appear right to left on the command line. Initializers are called in depth-first order. For example, when a shared library is loaded, the initializers in all its dependent libraries are called first.

Use this option while building a shared library, an incomplete executable, or fully bound executable. Functions specified with this option should take no arguments and return nothing (void functions). Terminators are invoked only if main() calls exit(). They are not called if main() calls return().

Do not use +init with the -r option. (The linker ignores the +init option.)

You can specify more than one initializer function on the command line with multiple option-symbol pairs, that is, each function you specify must be preceded by the +init option.

For more details on the initializer function, use the +help option or see the HP-UX Linker and Libraries User's Guide.

+[no]inputmmap

+inputmap enables the feature to use mmap for reading the contents of shared libraries during linking. This is the default behavior. Linking is usually much faster when input shared libraries are mmapped, as compared to buffered reading from disk.

+noinputmmap disables the mmap feature and tells the linker not to mmap text segments of input shared libraries. The linker uses buffered disk i/o (fread) to access information from the text segments of input shared libraries.

NOTE: Use +noinputmmap only in cases where the link fails because of mmap failures due to lack of memory, as it can significantly increase the link time due to disk I/O.

+interp file

Change the dld path to use the argument as the "interpreter" program instead of the dld.sl.

+k

Direct the linker to only create an executable if there were no errors encountered during the link. If there were errors found (system errors or unresolved references), the output file will be removed.

+mergeseg

Enables shared library segment merging feature. See description of shared library segment merging in the HP-UX Linker and Libraries User's Guide. This enables all the data segments of the shared libraries loaded at program startup to be merged. This increases run-time performance by allowing the kernel to use larger size page table entries.

+mmap

Enables the feature to use mmap for writing the output data. This is the default behavior. Linker enabled with mmap is much faster.

+n

Causes the linker to load all object modules before searching any archive or shared libraries. Then it searches the archive and shared libraries specified on the command line in left to right order. Repeats the left to right search of the libraries on the command line until there are no more unsatisfied symbols, or the last search added no new definitions. This option is useful if two libraries are specified that have symbol dependencies on each other.

+nocopyobjdebug

Do not copy objdebug space. Use this option (with -r object files on the link line) to suppress the default behavior of copying LINKMAP space to the executable file.

+noobjdebug

Override the +objdebug compiler option, and copy all debug information to the executable file.

When used with -g, +objdebug leaves debug information in the object files instead of copying it to the executable file at link time, resulting in shorter link times and smaller executables. The compile-time default, +noobjdebug, copies the debug information to the executable file.

When you specify -g when compiling, the compiler places symbolic debugging information into the object files. By default, the linker calls pxdb which compacts this debug information and copies it to the executable file. When +objdebug was used at compile time, the linker leaves the debug information in the object files. To debug the executable file, the HP WDB debugger must have access to the object files. If you move the object files, use HP WDB's objdir command to tell it where the object files are. The +objdebug option reduces link time and the size of the executable file by avoiding this copying of debug information.

The compile-time default is +noobjdebug. If the linker detects any object files that were compiled with +objdebug, it leaves the debug information in those files. Any object files not compiled with +objdebug have their debug information copied into the executable file. You can leave debug information in some object files and not in others.

When archive members are not compiled with +objdebug (and they contain debug information, that is, they were compiled with -g), the debug information from the archive members is copied into the a.out by default. The linker does not copy debug information from shared libraries into the a.out, regardless of whether they are compiled with +objdebug or +noobjdebug.

Use the +noobjdebug option when linking to explicitly tell the linker to copy all debug information to the executable file, even from files compiled with +objdebug.

+nomergeseg

Disables the shared library segment merging feature. This is the default.

+nommap

Disables the mmap feature and uses the normal buffering method to write into the output file. NOTE: Do not use +nommap unless in cases like the system has very low memory and the linker fails because of this.

+objdebugonly

Ignore debug information from non-objdebug objects or archives and proceed in +objdebug mode. This option can be passed from the C or C++ compiler command line as -Wl,+objdebugonly. If you are debugging only files compiled with the +objdebug option, +objdebugonly can improve link time by instructing the linker to bypass the processing of debug information from files compiled with +noobjdebug. With the +objdebugonly option, the linker suppresses the call to pxdb.

+origin shared_library_name -lx

(Use only before the -l option or the name of a shared library.) Cause the linker to add $ORIGIN before the shared library name in the shared library list. At runtime, the dynamic loader determine the current directory of the parent module (shared library or executable) and replaces $ORIGIN for that directory name.

Example:

$ ld -dynamic main.o +origin libx.sl -L /usr/lib/ -lc

While the +origin option is available, the recommended way to specify $ORIGIN is in the embedded path with the +b option, for example,

$ ld -dynamic main.o -L /usr/lib/ -lc +B $ORIGIN

For more details on $ORIGIN, use the +help option or see the HP-UX Linker and Libraries User's Guide.

+pd size

Request a particular virtual memory page size that should be used for data. Sizes of 4K, 16K, 64K, 256K, 1M, 4M, 16M, 64M, 256M, D, and L are supported. A size of D allows the kernel to choose what page size should be used. A size of L will result in using the largest page size available. The actual page size may vary if the requested size cannot be fulfilled.

+pgm name

Used together with the -P option, this option specifies that name should be used as the look-up name in the profile database file. The default is the basename of the output file (specified by the -o option.)

This option is incompatible with the +ild option.

+pi size

Request a particular virtual memory page size that should be used for instructions. See the +pd option for additional information.

+profilebucketsize size

Controls the size of profiling counters. The acceptable value for this variable is 16 or 32. A warning is issued if the value specified is other than 16 or 32. The default value of the counter is 16, which is used if a valid value is not specified. Value at linktime can be overridden by using PROFILE_BUCKET_SIZE environment variable. See the description in gprof(1) for more details.

+s

Indicates that at run-time, the shared library loader can use the environment variable SHLIB_PATH and LD_LIBRARY_PATH (64-bit only) to locate shared libraries needed by the executable output file that were specified with either the -l or -l: option. The environment variables should be set to a colon-separated list of directories. If both +s and +b are used, their relative order on the command line indicates which path list will be searched first (see the +b option).

+std

This option is ignored for 32-bit links. Turns on standard mode, which is the default in 64-bit mode. Options turned on with this option are: -dynamic. Options turned off or ignored when this option is specified are: +compat,+noenvvar,-noshared.

+vallcompatwarnings

This option is accepted but ignored by the 64-bit ld. Show more detail for any warnings about compatibility issues. By default, only a terse message is printed. See the WARNINGS section below for further details.

+v[no]compatwarnings

This option is accepted but ignored by the 64-bit ld. Enable [disable] printing warnings about compatibility issues between systems. This includes any functionality which may change in future releases. The default is +vcompatwarnings. See the WARNINGS section below for further details.

+v[no]shlibunsats

Enable [disable] printing a list of unsatisfied symbols used by shared libraries. The default is +vnoshlibunsats. Some unsatisfied symbols reported by the linker are not required at run time because the modules which reference the symbols are not used.

+FP flag

Specify how the environment for floating-point operations should be initialized at program start-up. By default, modes are specified by the IEEE floating-point standard: all traps disabled, gradual underflow, and rounding to nearest. The +FP option supports the following modes (upper case flag enables; lower case flag disables):

V (v)

Trap on invalid floating-point operations

Z (z)

Trap on divide by zero

O (o)

Trap on floating-point overflow

U (u)

Trap on floating-point underflow

I (i)

Trap on floating-point operations that produce inexact results.

D (d)

Enable sudden underflow (flush to zero) of denormalized values.

RU

Enable rounding upward (toward +Infinity).

RD

Enable rounding downward (toward -Infinity).

RZ

Enable rounding toward zero (truncate, chop).

RN

Enable rounding to nearest (the default).

NOTE: Enabling sudden underflow is an undefined operation on PA-RISC 1.0-based systems, but it is defined on all subsequent versions of PA-RISC. Selecting this flag enables sudden underflow only if it is available on the processor being used at run-time.

More than one mode can be specified with a comma separated list. For example:

+FP D,O,V,RZ

specifies sudden underflow, trapping on overflow and invalid, and rounding toward zero. The commas and the space between +FP and the modes may be omitted. Thus, +FPDOVRZ is equivalent to +FP D,O,V,RZ.

To dynamically change these settings at run-time, see fesettrapenable(3M), fesetflushtozero(3M), and fesetround(3M).

+I symbol

Specify the name of the initializer function when building a shared library. A shared library may have multiple initializers specified. Initializers are executed in the order that they are specified. You can specify more than one initializer, but each must be preceded by +I. For more details on the initializer function, refer to the +help option or the HP-UX Linker and Libraries User's Guide manual.

+O[no]fastaccess

Enable [disable] fast access to global data. The linker rearranges the data to further reduce the number of ADDIL instructions in the executable.

This optimization may reveal some subtle programming errors related to assumptions about data layout. This optimization can occur at optimization levels 2, 3 and 4. The default is +Onofastaccess at optimization levels 2 and 3, and +Ofastaccess at optimization level 4.

Using the +Ofastaccess option in the presence of debug information generates a warning message and can cause corruption of the debug information. Avoid using +Ofastaccess with the -g option.

This option is accepted but ignored by the 64-bit ld.

+O[no]procelim

Enable [disable] the elimination of procedures and data that are not referenced by the application. The default is +Onoprocelim.

Procedure and data elimination can occur at any optimization level, i ncluding level 0. The elimination occurs on a per section basis; the section is removed only if all procedures/data in the section are unreferenced. For more details refer to the +help option or the HP-UX Linker and Libraries User's Guide manual. This option is incompatible with the +ild option.

Note that compilers may set +Oprocelim for higher optimization levels; refer to compiler documentation for detail.

+Oreusedir=dir

Specify the name of the directory to use as the reuse repository for the object code reuse feature. This directory holds the compiled object files for reuse. dir can be an absolute or relative path to directory where you invoked the linker. The +Oreusedir option shortens link time by not recompiling intermediate object code to object code when using +O4 or profile-based optimization.

+Oselectivepercent n

Instructs the interprocedural optimizer driver to pass the first n percent of the object files to the high level optimizer for interprocedural optimizations such as inlining.

+Oselectivesize size

Instructs the interprocedural optimizer driver to pass the first k routines to the high level optimizer for interprocedural optimization where the size of k routines are approaching but less than size.

+OselectiveO3

Instructs the interprocedural optimizer driver to compile the routines not included in the +O4 list to be compiled at +O3.

+Ostaticprediction

Meaningful only on PA-RISC 2.0 architecture, this option sets the branch prediction bit in the output executable file's auxiliary header.

PA-RISC 32-Bit Options

-A name

This option specifies incremental loading. Linking is arranged so that the resulting object can be read into an already executing program. The argument name specifies a file whose symbol table provides the basis for defining additional symbols. Only newly linked material is entered into the text and data portions of a.out, but the new symbol table reflects all symbols defined before and after the incremental load. Also, the -R option can be used in conjunction with -A, which allows the newly linked segment to commence at the corresponding address. The default starting address is the old value of _end. The -A option is incompatible with -r and -b. Also note that a program that dynamically loads code with ld -A cannot use shared libraries. See the +help option or the HP-UX Linker and Libraries User's Guide manual for a description of this option.

-C n

Set the maximum parameter-checking level to n. The default maximum is 3. See the language manuals for the meanings of the parameter-checking level.

-Fw

Don't emit unwind tables. Do not use this option if your compiler or tools require unwind tables.

-Fz

Disable the linker feature that translates some calls to $$dyncall_external to calls to $$dyncall.

-N

Generate an executable output file with file type EXEC_MAGIC. This option is incompatible with -n and -q. This option causes the data to be placed immediately following the text, and makes the text writable. Files of this type cannot be shared.

-S

Generate an Initial Program Loader (IPL) auxiliary header for the output file, instead of the default HP-UX auxiliary header.

+cdp oldpath:newpath

Replace the recorded path for a shared library in the a.out. In 32-bit mode, ld records the absolute path names of any shared libraries searched at link time in the a.out file. When the program begins execution, the dynamic loader attaches any shared libraries that were searched at link time. Although you can use the +b and/or +s linker options to direct the dynamic loader to directories to search for the shared libraries, the dynamic loader, as a last resort, searches for the shared libraries in its absolute, recorded path in the a.out. You can specify more than one shared library oldpath:newpath, but each must be preceded by the +cdp option.

+cg pathname

Specify the use of pathname as the code generator for compiling ISOMs to SOMs. See the discussion of profile based optimization in the HP-UX Linker and Libraries Online User's Guide for more information.

+dpv

Display verbose messages regarding procedures which have been removed due to dead procedure elimination. The symbol name, input object file, and the size (in bytes) of the deleted procedure are displayed. The total size (in bytes) of the deleted procedures is also displayed.

+ea filename

Exports all the symbols in the file filename.

+gstbuckets size

Request a particular number of buckets per entry using the global symbol table hash mechanism. The default value is 3. The value can be overridden at runtime by setting the _HP_DLDOPTS environment variable to the value -symtab_buckets number. You can set the value using chatr +gstbuckets size file.

+nosmartbind

Disable SmartBind when binding a shared library. With this option enabled, the linker places all symbols in the link into a single SmartBind module instead of placing each .o file in its own module.

+plabel_cache

Enable the plabel caching mechanism. Use this option with the +gst option.

This option is only effective with C++. In C++ applications, the dynamic loader needs to repetitively access PLABEL information (import stub). In order to make this access faster, the dynamic loader uses the global symbol table structure to also contain PLABEL entries. This behavior is enabled when the PLABEL_CACHE flag is set in the dl_header structure (enabled ld +plabel_cache enable a.out or chatr +plabel_cache enable a.out).

PA-RISC 64-Bit Options

-k filename

Specify a mapfile that describes the output file memory map.

The user specified mapfile specifications are permitted with the +ild option. But you should not modify the mapfile after the initial incremental link. If the mapfile is modified after the initial link, an initial incremental link is performed automatically.

Please refer to HP-UX Linker and Libraries User's Guide guide for more information. Also see +nodefaultmap.

-symbolic symbol

When building a shared library, causes the linker to resolve all references to the specified symbol to the symbol defined in the library. This option is similar to -B symbolic, but operates on a per symbol basis.

You can specify more than one symbol on the command line with multiple option-symbol pairs, that is, each symbol you specify must be preceded by the -symbolic option.

symbol can also be a regular expression that matches multiple symbol names. Regular expressions are described in regexp(5).

-w

Suppress all warnings.

+alloc_hidden_commons

Force storage allocation for hidden "common" symbols in -r output. This is similar to the -d option, which allocates storage for all "common" symbols. If +alloc_hidden_commons is specified in combination with the -d option, -d will take precedence.

+allowrorelocs

(Kernel virtual environment support only.) Allow generation of dynamic relocations in read-only sections such as .text and .rodata. Normally the linker emits an error message when a dynamic relocation is required in read-only sections. See Kernel Virtual Environment Support for more information.

+[no]allowunsats

+allowunsats Does not flag errors if the resulting output file has unsatisfied symbols. This is the default for relocatable links and shared library builds. +noallowunsats Flags an error if the resulting output file has unsatisfied symbols. This is the default for program files.

+[no]defaultrpath

+defaultrpath is the default. Include any paths that are specified with -L in the embedded path, unless you specify the +b option. If you use +b, only the path list specified by +b is in the embedded path.

The +nodefaultrpath option removes all library paths that were specified with the -L option from the embedded path. The linker searches the library paths specified by the -L option at link time. At run time, the only library paths searched are those specified by the environment variables LD_LIBRARY_PATH and SHLIB_PATH, library paths specified by the +b linker option, and finally the default library paths.

+[no]forceload

+forceload loads all object files from archive libraries. +noforceload is the default — loads only the required object files from archive libraries. The mode that is selected, either explicitly or by default, remains on until it is changed.

+hideallsymbols

This option is used to prevent all the symbols from being exported unless explicitly exported with the +e.

+ild

Specify incremental linking.

If the output file does not exist, or if it was created without the +ild option, the linker performs an initial incremental link. The output file produced is suitable for subsequent incremental links. The incremental link option is valid for both executable and shared library links.

NOTE: The HP WDB symbolic debugger only supports debugging of incrementally linked load modules that you create with the +objdebug compiler option enabled. (The HP DDE debugger does not support the +ild option.)

To debug incrementally linked binaries, they should be compiled and linked with both +ild and +objdbg.

If you specify one of the following incompatible ld option with +ild, the linker emits a warning message and ignores the +ild option.

  • The -r option: create a relocatable object file.

  • Strip options: -s and -x strip the output file. (The incremental linking requires the parts of the output load module which are stripped out with these options.)

  • Optimization options: -I, -O, -P, -PD, -PF, +df file, +fb, +fbu, +fbs, +pgm name, and +Oprocelim.

The following options are compatible with the +ild option with limitations:

  • -D offset, -R offset

    Set the origin for the data and text segments. If you change the offset after the initial incremental link, the linker performs an initial incremental link automatically.

  • -k mapfile

    provide a non-default mapfile. The user specified mapfile specifications are permitted with the +ild option. But you should not modify the mapfile after the initial incremental link. If the mapfile is modified after the initial link, an initial incremental link is performed automatically.

+ildnowarn

Suppress incremental-linking related warnings. By default, the linker issues all incremental-linking related warnings. This option is ignored if used without +ild or +ildrelink.

+ildpad percentage

Control the amount of padding percentage the incremental linker allocates, relative to sizes of object file structures being padded. By default the linker allocates 25% of padding space. This option is ignored if used without +ild or +ildrelink.

+ildrelink

Perform an initial incremental link, regardless of the output load module.

In certain situations (for example, internal padding space is exhausted) the incremental linker is forced to perform an initial incremental link. The +ildrelink option allows you to avoid such unexpected initial incremental links by periodically rebuilding the output file.

+interposer

Used only when building a shared library. This creates a shared library that can be used for interposition. When resolving references for an application with direct binding information (see -B direct), the dynamic loader searches interposer libraries first. If the symbol cannot be resolved to any interposing libraries, the direct binding information is used.

+[no]lazyload

Enable [disable] lazy loading of shared libraries. Loading of shared libraries specified as +lazyload is deferred until a reference is made to it during execution.

Dependent libraries of +lazyload shared libraries will not be processed during link time, unless they are explicitly specified on the link line.

Lazy loading can be disable during runtime by setting the LD_NOLAZYLOAD environment variable.

+linkersyms

(Kernel virtual environment support only.) Create linker-generated symbols even if building a shared library. The kernel with virtual environment support is built with the -b option which by default does not create linker-generated symbols in shared libraries. See Kernel Virtual Environment Support for more information.

+nobss

Pads the data segment with zeros, so that the data segment can be mapped with a single call to mmap at runtime. Normally, data segments require one mmap call for file-backed storage and a second mmap call for blank static storage (bss). Use of this option increases your output file size.

+nodefaultmap

This option tells the linker not to use the default memory map. The user needs to supply a mapfile through the -k linker option.

+nodynhash

Disables the default linker behavior of the +gst option to create the .dynhash section for executables or shared libraries. Use this option to eliminate generation of pre-computed hash table information for a library or an executable that is rarely used with the global symbol table lookup scheme or for which the overhead of storing pre-computed hash values is too high. This option has no effect when used with the -r option.

+noenvvar

Instructs the dynamic loader to not look at the LD_LIBRARY_PATH , SHLIB_PATH and $ORIGIN environment variables at runtime. This is turned on if ld +compat is specified. (The dynamic loader, however, uses the LD_PRELOAD environment variable with the +noenvvar option.) This is turned off by default or if ld +std is specified. See +compat or +std. Generally, this option is used for secure programs (e.g. setuid).

+noprocelim_sym symbol [+noprocelim_sym symbol]...

Do not remove symbol when using dead code elimination (+Oprocelim). This option can be used for hidden symbols as well as exported symbols.

You can specify more than one symbol on the command line with multiple option-symbol pairs, that is, each symbol you specify must be preceded by the +noprocelim_sym option.

+nosectionmerge

Used with the -r option to allow procedures to be positioned independently. The default is to merge all procedures into a single section.

+nosymb symbol

When building a shared library with -B symbolic, causes the linker to exclude the specified symbol from -B symbolic symbol resolution.

You can specify more than one symbol on the command line with multiple option-symbol pairs, that is, each symbol you specify must be preceded by the +nosymb option.

symbol can also be a regular expression that matches multiple symbol names. Regular expressions are described in regexp(5).

+paddata pagesize

Pads the data segment to a multiple of pagesize with zeros. This can improve page allocation, thus reduce TLB misses.

+padtext pagesize

Pads the text segment to a multiple of pagesize with zeros. This can improve page allocation, thus reduce TLB misses.

+pdzero

Generates a zero page of 4K bytes at the beginning of the data segment. It also sets the default starting address of the data segment to 0x8000000000000000. This option improves performance by reducing TLB misses by allowing the kernel to allocate bigger data pages.

+stripunwind

Do not output the unwind table. This creates smaller executable sizes. Use this option if you do not need the unwind table for debugging or C++ exception handling.

+tools

Request that the application be linked for profiling with CXperf.

+vtype type

Produces verbose output about the link operation. type can have the following values:

files

Dump info about each object file loaded.

heap

Dump info about the size of the heap used by a link.

libraries

Dump info about libraries searched.

procelim

Dump info about sections that have been rejected by the +Oprocelim option

sections

Dump info about each input section added to the output file.

symbols

Dump info about global symbols referenced/defined from/in the input files.

all

Dumps all of the above info. Same as -v.

Defaults

Unless otherwise directed, ld names its output a.out. The -o option overrides this. Executable output files are of type SHARE_MAGIC. The default state of -a is to search shared libraries if available, archive libraries otherwise. The default bind behavior is deferred.

The default value of the -Z/-z option is -Z.

For 64-bit mode, +std is on by default.

Incremental linking with ld (64-bit Mode ONLY)

In the edit-compile-link-debug development cycle, link time is a significant component. The incremental linker (available through the +ild and +ildrelink options) can reduce the link time by taking advantage of the fact that you can reuse most of the previous version of the program and that the unchanged object files do not need to be processed. The incremental linker allows you to insert object code into an output file (executable or shared library) that you created earlier, without relinking the unmodified object files. The time required to relink after the initial incremental link depends on the number of modules you modify.

The linker performs the following different modes of linking:

  • normal link: the default operation mode in which the linker links all modules.

  • initial incremental link: the mode entered when you request an incremental link, but the output module created by the incremental linker does not exist, or it exists but the incremental linker is unable to perform an incremental update.

  • incremental link: the mode entered when you request an incremental link, an output module created by the incremental linker exists, and the incremental linker does not require an initial incremental link.

Incremental links are usually much faster than regular links. On the initial link, the incremental linker requires about the same amount of time that a normal link process requires, but subsequent incremental links can be much faster than a normal link. A change in one object file in a moderate size link (tens of files, several megabytes total) normally is about 10 times faster than a regular ld link. The incremental linker perform as many incremental links as allocated padding space and other constrains permit. The cost of the reduced link time is an increase in the size of the executable or shared library.

The incremental linker allocates padding space for all components of the output file. Padding makes modules larger than those modules linked by ld. As object files increase in size during successive incremental links, the incremental linker can exhaust the available padding. If this occurs, it displays a warning message and does a complete initial incremental link of the module. When an object file changes, the incremental linker not only replaces the content of that file in the executable or shared library being linked, but also adjusts references to all symbols defined in the object file and referenced by other objects. This is done by looking at relocation records saved in the incrementally linked executable or shared library.

On the initial incremental link, the linker processes the input object files and libraries in the same way as the normal link. In addition to the normal linking process, the incremental linker saves information about object files, global symbols, and relocations, and pads sections in the output file for expansion. On subsequent incremental links, the linker uses timestamps and file sizes to determine which object files have changed, and updates those modules.

Under certain conditions, the incremental linker cannot perform incremental links. When this occurs, the incremental linker automatically performs an initial incremental link to restore the process. In the following situations, the linker automatically performs an initial incremental link of the output file:

  • Changed linker command line, where the linker command line does not match the command line stored in the output file. (With the exceptions of the verbose and tracing options)

  • Any of the padding spaces have been exhausted.

  • Modules have been modified by the ld -s or ld -x options or tools (for example, strip(1)). The incremental linking requires the parts of the output load module which are stripped out with these options.

  • Incompatible incremental linker version, when you run a new version of the incremental linker on an executable created by an older version.

  • New working directory, where the incremental linker performs an initial incremental link if current directory changes.

  • Archive or shared libraries are added/removed to/from the linker command line.

  • Objects are added/removed to/from the linker command line.

See the Online Linker and Libraries User's Guide (ld +help) for more information.

Archive Library Processing

The incremental linker searches an archive library if there are unsatisfied symbols. It extracts all archive members satisfying unsats and processes them as new object files. If an archive library is modified, the linker replaces the modified archive library.

An object file extracted from an archive library in the previous link remains in the output load module even if all references to symbols defined in the object file have been removed. The linker removes these object files when it performs the next initial incremental link.

Shared Library Processing

In an initial incremental link, the linker scans shared library symbol tables and resolves unsats the same way it would in a regular link. In incremental links, the linker does not process shared libraries and their symbol tables at all and does not report shared library unsats. The dynamic loader detects them at run time. If any of the shared libraries on the command line was modified, the linker reverts to an initial incremental link.

Performance

Performance of the incremental linker may suffer greatly if you change a high percentage of object files.

The incremental linker may not link small programs much faster, and the relative increase in size of the executable is greater than that for larger programs.

Generally, the linker needs to scan through all shared libraries on a link line in order to determine all the unsats, even in incremental links. This process may slow down incremental links. The incremental linker does not scan shared libraries and leaves detection of shared library unsats to the dynamic loader.

Do not use the incremental linker to create final production modules. Because it reserves additional padding space, modules created by the incremental linker are considerably larger than those created in regular links.

Notes

The HP WDB symbolic debugger only supports debugging of incrementally linked load modules that you create with the +objdebug compiler option enabled. (The HP DDE debugger does not support the +ild option.

Any program that modifies an executable (for example, strip(1)), may affect the ability of ld to perform an incremental link. When this happens, the incremental linker issues a message and performs an initial incremental link.

Third-party tools that work on object files may have unexpected results on modules produced by the incremental linker.

Kernel Virtual Environment Support

For virtual environment support for the kernel, build your kernel with the following linker options (instead of the -noshared option):

  • $ ld ... -B symbolic -b +hideallsymbols +allowrorelocs +linkersyms ...

By using these options, you create the kernel as a self-contained shared library with no exported symbols (with the -B symbolic, -b, and +hideallsymbols options). Because the kernel contains references to linker-generated symbols such as _etext, _end, and _edata, the +linkersyms option instructs the linker to create these symbols (which it does not do for shared libraries by default). The kernel contains direct calls and relocations in read-only data space. Normally these are applied at link time and are fixed up to link-time virtual addresses. In the case of relocatable kernels, the linker needs to create dynamic relocations to fix up these references at run-time. The +allowrorelocs option instructs the linker to allow dynamic relocations in read-only sections (Normally the linker issues an error message).

Security Restrictions

On a system that supports fine-grained privileges, if a process gains any privileges from the binary's extended attributes, dynamic path lookup is disabled. Similarly, on a system that supports compartments, if a process changes compartment due to the binary's extended attributes, the dynamic path lookup is disabled. See setflexsec(1M) on how to set extended attributes on a binary. See privileges(5) and compartments(5) for more information about privileges and compartments.

Linking Secure Programs

Secure programs are programs that are commonly run by privileged users, such as root, or programs that run with elevated privileges due to setuid or setgid protection. Special precautions should be taken when linking secure programs that use shared libraries. The default linker behavior may be sufficient for 32-bit applications, but not for 64-bit applications.

Secure 64-bit programs should be linked with the option +noenvvar to disable the use of SHLIB_PATH and LD_LIBRARY_PATH for locating shared library dependencies. Secure 64-bit programs should also link with +nodefaultrpath to prevent the automatic construction of an embedded search path based on search directories specified with -L options. Most directories searched at link time don't need to be searched at run time, and if these directories are specified as relative paths, they expose the program to the same security risks as the use of SHLIB_PATH and LD_LIBRARY_PATH.

Normal programs that depend on libraries that only exist in a directory specified in SHLIB_PATH or LD_LIBRARY_PATH (64-bit mode only) must be linked with +s to enable searching SHLIB_PATH and LD_LIBRARY_PATH. Programs that depend on SHLIB_PATH or LD_LIBRARY_PATH cannot be protected as setuid or setgid programs.

dld uses the dynamic path lookup (with SHLIB_PATH and LD_LIBRARY_PATH) only if the following conditions are satisfied:

getuid() == geteuid() && getgid() == getegid()

That is, if the uid or gid does not match its effective counterpart, dld does not check the directories specified in SHLIB_PATH and LD_LIBRARY_PATH, which causes the runtime error "library not found".

EXTERNAL INFLUENCES

Environment Variables

The following environment variables affect the execution of ld:

BROWSER

Specifies the path name of the HTML browser to display the HP-UX Linker and Libraries Online User's Guide when you use the +help option.

ENABLE_PBO_FORK

By default, when an instrumented executable (see the -I option) writes the profile data, it creates a separate process which runs in the background; and the main process exits. If this environment variable is set to "OFF", then a separate process is not created but the same process writes out the profile data. This is useful if you get ETXTBSY errors when removing or modifying the executable after it has been executed. This environment variable is valid for 32-bit executables only. For instrumented shared libraries, profile data is always written by the same process.

FDP_FORK

Serves the same purpose as ENABLE_PBO_FORK but for 64-bit executables.

FLOW_DATA

An instrumented executable (see the -I option) writes out the profile data to a database file named flow.data in the current directory. The name and location of this file can be specified by setting FLOW_DATA to the desired path name. The profile data is stored in the database file under a look-up name that is the same as the basename of the executable file specified at run-time. A single flow.data file can hold profile data

LDOPTS

Arguments can be passed to the linker through the LDOPTS environment variable as well as on the command line. The linker gets the value of LDOPTS and places its contents before any arguments on the command line.

LPATH

Specifies default directories to search for library files. See the -l option.

LD_LIBRARY_PATH, SHLIB_PATH, and LD_PRELOAD

Specifies, at runtime, directories to search for library files. See the +s option, dld.sl(5), and the +help option for the Online HP-UX Linker and Libraries User's Guide manual for more information.

LD_PROFILE

Specifies, at runtime, the path of the shared library to be profiled (See HP-UX Linker and Libraries Online User's Guide for details.)

LD_GPROF_LIB_NAME

Specifies at runtime, the path of the profiler used to profile shared libraries. The default value is /usr/lib/libgprof32.sl for 32bit applications and /usr/lib/pa20_64/libgprof.sl for 64bit applications.

TMPDIR

Specifies a directory for temporary files.

The following internationalization variables affect the execution of ld:

LANG

Determines the locale category for native language, local customs and coded character set in the absence of LC_ALL and other LC_* environment variables. If LANG is not specified or is set to the empty string, a default of C (see lang(5)) is used instead of LANG.

LC_ALL

Determines the values for all locale categories and has precedence over LANG and other LC_* environment variables.

LC_MESSAGES

Determines the locale that should be used to affect the format and contents of diagnostic messages written to standard error.

LC_NUMERIC

Determines the locale category for numeric formatting.

LC_CTYPE

Determines the locale category for character handling functions.

NLSPATH

Determines the location of message catalogs for the processing of LC_MESSAGES.

If any internationalization variable contains an invalid setting, ld behaves as if all internationalization variables are set to C. See environ(5).

RETURN VALUES

ld returns the following values:

0

Successful completion. The link is successful.

n!=0

Failure. An error has occurred.

EXAMPLES

Link part of a C program for later processing by ld. (Note the .o suffix for the output object file; this is an HP-UX convention for indicating a linkable object file):

ld -r file1.o file2.o -o prog.o

On 32-bit, link a simple FORTRAN program for use with the dde symbolic debugger (see dde(1)). Output file name is a.out since there is no -o option in the command line.

ld /usr/ccs/lib/crt0.o ftn.o -lcl -lisamstub \ -lc /opt/langtools/lib/end.o

To do this on 64-bit:

ld ftn.o -lcl -lisamstub \ -lc /opt/langtools/lib/pa20_64/end.o

On 64-bit, link a shared bound program in standard mode. Note that crt0.o is not specified because for shared links, it is no longer necessary.

ld himom.o +std -lc

On 64-bit, link a compatibility mode program. crt0.o is included because this is an archive link.

ld /opt/langtools/lib/pa20_64/crt0.o himom.o +compat -a archive -lc

Create a shared library:

ld -b -o libfunc.sl func1.o func2.o func3.o

Create a shared library with an internal name:

ld -b -o libfoo1.1 foo1.o foo2.o +h libfoo1.1 ln -s libfoo1.1 libfoo1.sl cc -g mytest.c -L . -lfoo1 chatr a.out ... shared library list: dynamic ./libfoo1.1

If you do not use +h, the shared library does not have an internal name. The linker does not check whether .sl is a symbolic link. It records the library name that it looks at, if it does not have the internal name.

chatr a.out ... shared library list: dynamic ./libfoo1.sl

On 32-bit, link a program with libfunc.sl but use the archive version of the C library. Specify the immediate binding mode together with the nonfatal modifier and allow verbose diagnostics to be displayed:

ld /usr/ccs/lib/crt0.o -B immediate -B nonfatal -B verbose \ program.o -L . -lfunc -a archive -lc

To do this on 64-bit:

ld -B immediate -B nonfatal -B verbose \ program.o -L . -lfunc -a archive -lc

On 32-bit, link a Pascal program:

ld /usr/ccs/lib/crt0.o main.o -lcl -lm -lc

Note that in the above examples, /usr/ccs/lib/crt0.o can be replaced by /opt/langtools/lib/crt0.o.

WARNINGS

ld recognizes several names as having special meanings. The symbol _end is reserved by the linker to refer to the first address beyond the end of the program's address space. Similarly, the symbol _edata refers to the first address beyond the initialized data, and the symbol _etext refers to the first address beyond the program text. The symbols end, edata, and etext are also defined by the linker, but only if the program contains a reference to these symbols and does not define them (see end(3C) for details). On 32-bit, the symbol __tdsize is the total thread local storage size required by the program or shared library.

On 64-bit, the linker defines a few more symbols. The symbol __TLS_SIZE is the total thread local storage size. The symbol _FPU_STATUS is the initial status of the FPU status register. The symbol __SYSTEM_ID is the largest architecture revision level used by any compilation unit.

The linker treats a user definition of any of the symbols listed here as an error.

Through its options, the link editor gives users great flexibility. However, those who invoke the linker directly must assume some added responsibilities. Input options should ensure the following properties for programs:

  • When the link editor is called through cc(1), a start-up routine is linked with the user's program. This routine calls exit(2) after execution of the main program. If users call ld directly, they must ensure that the program always calls exit() rather than falling through the end of the entry routine.

  • When linking for use with the symbolic debugger dde, the user must ensure that the program contains a routine called main. Also, the user must link in the file /opt/langtools/lib/end.o on 32-bit and /opt/langtools/lib/pa20_64/end.o on 64-bit as the last file named on the command line.

There is no guarantee that the linker will pick up files from archive libraries and include them in the final program in the same relative order that they occur within the library.

The linker emits warnings wherever it detects any compatibility issues. Among other things, these issues include architectural ones, as well as functionality that may change over time. Some of these include:

  • Linking a PA 2.0 object file, which will not run on a PA 1.x system.

  • Incremental loading with the -A option.

  • Procedure call parameter and return type checking, including the -C option.

  • Symbols with the same name but different types, such as CODE and DATA.

  • Checking of unsatisfied symbols by the linker, which sometimes skips certain object files from an archived library. This warning is only given if the -v option is also provided.

  • Versioning of objects within a shared library.

These messages can be turned off with the +vnocompatwarnings option.

As noted in the Options section, certain options no longer exist in a 64-bit linker. They are:

  • -q

  • -A

  • -C

  • -E

  • -Q

  • -S

  • -X

  • +dpv

AUTHOR

ld was developed by AT&T, the University of California, Berkeley, and HP.

FILES

/usr/lib/lib*

32-bit system archive and shared libraries

/usr/lib/pa20_64/lib*

64-bit system archive and shared libraries

/usr/ccs/lib*

32-bit development archive and shared libraries

/opt/langtools/lib/pa20_64

64-bit development object files, archive and shared libraries

a.out

output file

/usr/lib/dld.sl

32-bit dynamic loader

/usr/lib/pa20_64/dld.sl

64-bit dynamic loader

/opt/langtools/lib/end.o

for use with the 32-bit dde debugger

/opt/langtools/lib/pa20_64/end.o

for use with the 64-bit dde debugger

/usr/ccs/lib/crt0.o

32-bit run-time startup file

/opt/langtools/lib/crt0.o

Identical to /usr/ccs/lib/crt0.o

/opt/langtools/lib/pa20_64/crt0.o

64-bit run-time startup file

/usr/ccs/lib/dyncall.o

32-bit only. Used with -A option links

/opt/langtools/lib/mcrt0.o

32-bit run-time startup with profiling (see prof(1))

/usr/lib/milli.a

32-bit millicode library automatically searched by ld

/usr/lib/pa20_64/milli.a

64-bit millicode library automatically searched by ld

/opt/langtools/lib/gcrt0.o

run-time start-up with profiling (see gprof(1))

/opt/langtools/lib/icrt0.o

32-bit run-time start-up with profiling (see discussion of profile based optimization above.)

/usr/lib/nls/$LANG/ld.cat

message catalog

/var/tmp/ld*

temporary files

flow.data

file containing profile data generated by running an instrumented executable

/usr/ccs/bin/fdp

program for creating the procedure link order from a profile database file created by an instrumented executable; forked by the -P option

/opt/langtools/lbin/ucomp

PA-RISC code generator

SEE ALSO

Profiling and Debugging Tools

adb(1)

absolute debugger

gprof(1)

display call graph profile data

prof(1)

display profile data

dde(1)

C, C++, FORTRAN, and Pascal symbolic debugger

System Tools

aCC(1)

invoke the HP-UX aC++ compiler

ar(1)

create archived libraries

CC(1)

invoke the HP-UX C++ compiler

cc(1)

invoke the HP-UX C compiler

chatr(1)

change program's internal attributes

exec(2)

execute a file

f77(1)

invoke the HP-UX FORTRAN 77 compiler

f90(1)

invoke the HP-UX Fortran 90 compiler

fastbind(1)

invoke the fastbind tool

nm(1)

print name list of object file

pc(1)

invoke the HP-UX Pascal compiler

strip(1)

strip symbol and line number information from an object file

Miscellaneous

setflexsec(1M)

crt0(3)

execution startup routine

end(3C)

symbol of the last locations in program

a.out(4)

assembler, compiler, and linker output

ar(4)

archive format

compartments(5)

dld.sl(5)

dynamic loader

privileges(5)

Texts and Tutorials

HP-UX Linker and Libraries Online User Guide

(See the +help option)

HP-UX Linker and Libraries User's Guide

(See manuals(5) for ordering information)

STANDARDS CONFORMANCE

ld: SVID2, SVID3, XPG2, XPG4

Printable version
Privacy statement Using this site means you accept its terms Feedback to webmaster
© 1983-2007 Hewlett-Packard Development Company, L.P.