[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- ld.so ldd - elf DT_FILTER,
Miroslaw Dobrzanski-Neumann <=