PVS(1) User Commands PVS(1)

NAME


pvs - display the internal version information of dynamic objects

SYNOPSIS


pvs [-Cdlnorsv] [-I index-expr] [-N name] file...


DESCRIPTION


The pvs utility displays any internal version information contained
within an ELF file. Commonly, these files are dynamic executables and
shared objects, and possibly relocatable objects. This version
information can fall into one of two categories:

o version definitions

o version dependencies


Version definitions describe the interfaces that are made available by an
ELF file. Each version definition is associated to a set of global
symbols provided by the file. Version definitions can be assigned to a
file during its creation by the link-editor using the -M option and the
associated mapfile directives. See the Linker and Libraries Guide for
more details.


Version dependencies describe the binding requirements of dynamic objects
on the version definitions of any shared object dependencies. When a
dynamic object is built with a shared object, the link-editor records
information within the dynamic object indicating that the shared object
is a dependency. This dependency must be satisfied at runtime. If the
shared object also contains version definitions, then those version
definitions that satisfy the global symbol requirements of the dynamic
object are also recorded in the dynamic object being created. At process
initialization, the runtime linker uses any version dependencies as a
means of validating the interface requirements of the dynamic objects
used to construct the process.

OPTIONS


The following options are supported. If neither the -d or -r options are
specified, both are enabled.

-C
Demangles symbol names.


-d
Prints version definition information.


-I index-expr
Qualifies the versions to examine with a specific
version index or index range. For example, the version
with index 3 in an object can be displayed using:

example% pvs -I 3 filename


An index-expr can be a single non-negative integer
value that specifies a specific version, as shown in
the previous example. Alternatively, an index-expr can
consist of two such values separated by a colon (:),
indicating a range of versions. The following example
displays the versions 3, 4, and 5 in a file:

example% pvs -I 3:5 filename


When specifying an index range, the second value can be
omitted to indicate the final item in the file. For
example, the following statement lists all versions
from the tenth to the end:

example% pvs -I 10: filename


See Matching Options for additional information about
the matching options (-I, -N).


-l
Prints any symbols that have been reduced from global
to local binding due to versioning. By convention,
these symbol entries are located in the .symtab
section, and fall between the FILE symbol representing
the output file, and the FILE symbol representing the
first input file used to generate the output file.
These reduced symbol entries are assigned the
fabricated version definition _LOCAL_. No reduced
symbols will be printed if the file has been stripped
(see strip(1)), or if the symbol entry convention
cannot be determined.

Use of the -l option implicitly enables the -s option


-n
Normalizes version definition information. By default,
all version definitions within the object are
displayed. However, version definitions can inherit
other version definitions. Under normalization, only
the head of each inheritance list is displayed.


-N name
When used with the -d option, -N prints only the
information for the given version definition name and
any of its inherited version definitions.

When used with the -r option, -N prints only the
information for the given dependency file name. It is
possible to qualify a specific version from the
dependency file by including the version in parenthesis
following the file name:

example% pvs -N 'dependency (version)' filename


See Matching Options for additional information about
the matching options (-I, -N).


-o
Creates one-line version definition output. By default,
file, version definitions, and any symbol output is
indented to ease human inspection. This option prefixes
each output line with the file and version definition
name and can be more useful for analysis with automated
tools.


-r
Prints version dependency (requirements) information.


-s
Prints the symbols associated with each version
definition. Any data symbols from versions defined by
the object are accompanied with the size, in bytes, of
the data item.


-v
Verbose output. Indicates any weak version definitions,
and any version definition inheritance. When used with
the -N and -d options, the inheritance of the base
version definition is also shown. When used with the -s
option, the version symbol definition is also shown.


OPERANDS


The following operands are supported.

file
The ELF file about which internal version information is
displayed.


USAGE


Matching Options


The -I and -N options are collectively referred to as the matching
options. These options are used to narrow the range of versions to
examine, by index or by name.


Any number and type of matching option can be mixed in a given invocation
of pvs. In this case, pvs displays the superset of all versions matched
by any of the matching options used. This feature allows for the
selection of complex groupings of items using the most convenient form
for specifying each item.

EXAMPLES


Example 1: Displaying version definitions




The following example displays the version definitions of libelf.so.1:


% pvs -d /lib/libelf.so.1
libelf.so.1;
SUNW_1.1


Example 2: Creating a one-liner display




A normalized, one-liner display, suitable for creating a mapfile version
control directive, can be created using the -n and -o options:


% pvs -don /lib/libelf.so.1
/lib/libelf.so.1 - SUNW_1.1;


Example 3: Displaying version requirements




The following example displays the version requirements of ldd and pvs:


% pvs -r /usr/bin/ldd /usr/bin/pvs
/usr/bin/ldd:
libelf.so.1 (SUNW_1.1);
libc.so.1 (SUNW_1.1);
/usr/bin/pvs:
libelf.so.1 (SUNW_1.1);
libc.so.1 (SUNW_1.1);


Example 4: Determining a dependency symbol version




The following example displays the shared object from which the ldd
command expects to find the printf function at runtime, as well as the
version it belongs to:


% pvs -ors /usr/bin/ldd | grep ' printf'
/usr/bin/ldd - libc.so.1 (SYSVABI_1.3): printf;


Example 5: Determine all dependency symbols from a specific version




The -N option can be used to obtain a list of all the symbols from a
dependency that belong to a specific version. To determine the symbols
that ldd will find from version SYSVABI_1.3 of libc.so.1:


% pvs -s -N 'libc.so.1 (SYSVABI_1.3)' /usr/bin/ldd

libc.so.1 (SYSVABI_1.3):
_exit;
strstr;
printf;
__fpstart;
strncmp;
lseek;
strcmp;
getopt;
execl;
close;
fflush;
wait;
strerror;
putenv;
sprintf;
getenv;
open;
perror;
fork;
strlen;
geteuid;
access;
setlocale;
atexit;
fprintf;
exit;
read;
malloc;


Note that the specific list of symbols used by ldd may change between
Solaris releases.


Example 6: Display base defined version by index




By convention, the base global version defined by an object has the name
of the object. For example, the base version of pvs is named 'pvs'. The
base version of any object is always version index 1. Therefore, the -I
option can be used to display the base version of any object without
having to specify its name:


% pvs -v -I 1 /usr/bin/pvs
pvs [BASE];


EXIT STATUS


If the requested version information is not found, a non-zero value is
returned. Otherwise, a 0 value is returned.


Version information is determined not found when any of the following is
true:

o the -d option is specified and no version definitions are
found.

o the -r option is specified and no version requirements are
found.

o neither the -d nor -r option is specified and no version
definitions or version requirements are found.

SEE ALSO


elfdump(1), ld(1), ldd(1), strip(1), elf(3ELF), attributes(7)


Linker and Libraries Guide

December 19, 2018 PVS(1)