bug-glibc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

ld.so ldd - elf DT_FILTER


From: Miroslaw Dobrzanski-Neumann
Subject: ld.so ldd - elf DT_FILTER
Date: Wed, 5 Jun 2002 09:35:44 +0200
User-agent: Mutt/1.3.16i

Hi,

The processing of filter shared objects (by ldd, ld.so) differs from the Sun
Specification and works not as expected. 

The runtime linker (ld.so) takes all symbols seen in filtee into the global
symbol table. On Sun only the symbols defined by the filter are taken.

The gnu processing of filter shared objects is useless because the do no
filtering at all

The processing code is in elf/dl-deps.c (glibc 2.2.2)


Example:
filter.c
$ cat filter.c
double sin (double x) { return 0.0; }
$ cat filtee.c
double sin (double x) { return x / 2.0; }
double cos (double x) { return x * 2.0; }
$ cat main.c
#include <math.h>
#include <stdio.h>
int main (void)
{
double x = 0.1;
printf ("%lf -> sin = %lf, cos = %lf\n", x, sin(x), cos(x));
return 0;
}

GNU (linux elf, i386):
======================
$ cc -shared -o libfiltee.so -h libfiltee.so filtee.c
$ cc -shared -Wl,-F,libfiltee.so -o libfilter.so -h libfilter.so filter.c
$ cc -o main main.c -Wl,-R. -L. -lfilter -lm
$ ./main
0.100000 -> sin = 0.050000, cos = 0.200000
here cos() is taken from the filtee.c not from the libm as expected because
cos is not in the libfilter.so THIS IS A BUG
$ objdump -p ./main
Dynamic Section:
  NEEDED      libfilter.so
  NEEDED      libm.so.6
  NEEDED      libc.so.6
only libfilter.so referenced (as expected)
$ ldd ./main
        libfiltee.so => ./libfiltee.so (0x40169000)
        libfilter.so => ./libfilter.so (0x40017000)
        libm.so.6 => /lib/libm.so.6 (0x4002c000)
        libc.so.6 => /lib/libc.so.6 (0x4004c000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
libfiltee.so should be shown only when -r option is given
THIS IS A BUG


Sun Reference using Sun tools
=============================
$ cc -G -R. -K pic -o libfiltee.so -h libfiltee.so filtee.c
$ cc -G -R. -K pic -Wl,-F,libfiltee.so -o libfilter.so -h libfilter.so filter.c
$ cc -o main main.c -R. -L. -lfilter -lm
$ ./main
0.100000 -> sin = 0.050000, cos = 0.995004
here cos() is taken from libm not from filtee.c AS EXPECTED !!!
$ dump -Lv ./main
[1]     NEEDED          libfilter.so
[2]     NEEDED          libc.so.1
only libfilter.so referenced (as expected)
$ ldd ./main
        libfilter.so =>  ./libfilter.so
        libc.so.1 =>     /usr/lib/libc.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        libfiltee.so =>  ./libfiltee.so
        /usr/platform/SUNW,Ultra-60/lib/libc_psr.so.1
libfiltee.so is not shown at all AS EXPECTED


Regards
-- 
Miroslaw Dobrzanski-Neumann

MOSAIC SOFTWARE AG
Base Development and Research
Tel +49-2225-882-291
Fax +49-2225-882-201
Office: address@hidden
Home:   address@hidden




reply via email to

[Prev in Thread] Current Thread [Next in Thread]