To profile shared libraries, you must set the environment variable SHLIB_FLOW_DATA to the file that receives profile data. Unlike FLOW_DATA, SHLIB_FLOW_DATA has no default output file. If SHLIB_FLOW_DATA is not set, profile data is not collected. This allows you to activate or suspend the profiling of instrumented shared libraries.

Note that you can set SHLIB_FLOW_DATA to flow.data which is the same file as the default setting for FLOW_DATA. But, again, profile data can be collected from shared libraries only if you explicitly set SHLIB_FLOW_DATA to some output file. The following is an example for instrumenting, profiling, and optimizing a shared library:

$

cc +z +I -c -O libcode.c

//Create I-SOM files.

$

ld -b -I libcode.o -o mylib.inst.sl //Create instrumented sl.

$

cc main.c mylib.inst.sl

//Create executable a.out file.

$

export SHLIB_FLOW_DATA=./flow.data

//Specify output file for profile data

$

a.out < input_file

//Run instrumented executable with

 

 

representative input data.

$

ld -b -P +pgm mylib.inst.sl \

//Perform PBO.

 

libcode.o -o mylib.sl

 

Note that the name used in the database is the output pathname specified when the instrumented library is linked (mylib.inst.sl in the example above), regardless of how the library might be moved or renamed after it is created.

Using PBO with ld -r

Beginning with the HP-UX 10.0 release, you can take greater advantage of PBO on merged object files created with the -rlinker option.

Briefly, ld -rcombines multiple .o files into a single .o file. It is often used in large product builds to combine objects into more manageable units. It is also often used in combination with the linker -hoption to hide symbols that may conflict with other subsystems in a large application. (See Hiding Symbols with -hfor more information on ld -h.)

In HP-UX 10.0, the subspaces in the merged .o file produced by ld -rare relocatable which allows for greater optimization. The following is an example of using PBO with ld -r:

$

cc +I -c file1.c file2.c

//Create individual I-SOM files

$

ld -r -I -o reloc.o file1.o file2.o

//Build relocatable, merged file

$

cc +I -o a.out reloc.o

//Create instrumented executable file.

$

a.out < input_file

//Run instrumented executable

 

 

with representative input data.

$

ld -r -P +pgm a.out -o reloc.o \

 

 

file1.o file2.o

//Rebuild relocatable file for PBO.

$

cc +P -o a.out reloc.o

//Perform PBO on the final executable

 

 

file.

Notice, in the example above, that the +pgm option was necessary because the output file name differs from the instrumented program file name.

NOTE: If you are using -rand C++ templates, check "Known Limitations" in the HP C++ Release Notes for possible limitations.

Linker Optimizations 213