Dpkg

 view release on metacpan or  search on metacpan

t/Dpkg_Shlibs.t  view on Meta::CPAN

    my $name = shift;

    my $obj = Dpkg::Shlibs::Objdump::Object->new();
    open my $objdump, '<', "$datadir/objdump.$name"
        or die "$datadir/objdump.$name: $!";
    $obj->parse_objdump_output($objdump);
    close $objdump;
    return $obj;
}

my @librarypaths;

{
    # XXX: Keep as long as we support the deprecated LD_LIBRARY_PATH.
    local $ENV{LD_LIBRARY_PATH} = '/test-env';

    Dpkg::Shlibs::add_library_dir('/test-a');
    @librarypaths = Dpkg::Shlibs::get_library_paths();
    is($librarypaths[0], '/test-a', 'add_library_dir() does not get lost');

    Dpkg::Shlibs::add_library_dir('/test-b');
    @librarypaths = Dpkg::Shlibs::get_library_paths();
    is_deeply([ @librarypaths[0, 1] ] , [ '/test-a', '/test-b' ],
              'add_library_dir() prepends');
}

Dpkg::Shlibs::blank_library_paths();

# We want relative paths inside the ld.so.conf fragments to work, and $srcdir
# is usually a relative path, so let us temporarily switch directory.
# XXX: An alternative would be to make parse_ldso_conf relative path aware.
my $cwd = getcwd();
test_chdir_srcdir();
Dpkg::Shlibs::parse_ldso_conf('t/Dpkg_Shlibs/ld.so.conf');
chdir($cwd);

@librarypaths = Dpkg::Shlibs::get_library_paths();
is_deeply(\@librarypaths, [ qw(
        /nonexistent32
        /nonexistent/lib64
        /usr/local/lib
        /nonexistent/lib128
    ) ],
    'parsed library paths');


## Test Dpkg::Shlibs::Objdump module.

my $obj;

$obj = load_objdump_obj('dbd-pg');
ok(! $obj->is_public_library(), 'Pg.so is not a public library');
ok(! $obj->is_executable(), 'Pg.so is not an executable');

$obj = load_objdump_obj('ls');
ok(! $obj->is_public_library(), 'ls is not a public library');
ok($obj->is_executable(), 'ls is an executable');

my $sym = $obj->get_symbol('optarg@GLIBC_2.0');
ok($sym, 'optarg@GLIBC_2.0 exists');
ok(! $sym->{defined}, 'R_*_COPY relocations are taken into account');

# Non-regression test for #506139.
$obj = load_objdump_obj('space');
$sym = $obj->get_symbol('singlespace');
ok($sym, 'version less symbol separated by a single space are correctly parsed');

$obj = load_objdump_obj('libc6-2.6');
ok($obj->is_public_library(), 'libc6 is a public library');
ok($obj->is_executable(), 'libc6 is an executable');

is($obj->{SONAME}, 'libc.so.6', 'SONAME');
is($obj->{HASH}, '0x13d99c', 'HASH');
is($obj->{GNU_HASH}, '0x194', 'GNU_HASH');
is($obj->{format}, 'elf32-i386', 'format');
is_deeply($obj->{flags},
    {
        DYNAMIC => 1,
        HAS_SYMS => 1,
        D_PAGED => 1,
    },
    'flags',
);
is_deeply($obj->{NEEDED}, [ 'ld-linux.so.2' ], 'NEEDED');
is_deeply([ $obj->get_needed_libraries ], [ 'ld-linux.so.2' ], 'NEEDED');

$sym = $obj->get_symbol('_sys_nerr@GLIBC_2.3');
is_deeply($sym,
    {
        name => '_sys_nerr',
        version => 'GLIBC_2.3',
        soname => 'libc.so.6',
        objid => 'libc.so.6',
        section => '.rodata',
        dynamic => 1,
        debug => '',
        type => 'O',
        weak => '',
        local => '',
        global => 1,
        visibility => '',
        hidden => 1,
        defined => 1,
    },
    'Symbol');
$sym = $obj->get_symbol('_IO_stdin_used');
is_deeply($sym,
    {
        name => '_IO_stdin_used',
        version => '',
        soname => 'libc.so.6',
        objid => 'libc.so.6',
        section => '*UND*',
        dynamic => 1,
        debug => '',
        type => ' ',
        weak => 1,
        local => '',
        global => '',
        visibility => '',
        hidden => '',



( run in 1.238 second using v1.01-cache-2.11-cpan-71847e10f99 )