An ELF ld bug?
H.J. Lu
hjl@nynexst.com
Wed Apr 19 22:36:00 GMT 1995
>
> > ctype is a bad example. Try other locale catetories.
>
> What is wrong with ctype? It demonstrates exactly the usage I am talking
> about.
Those ctype files will be needed for other reasons. Please try
the enclosed test case.
>
> > > > BTW, why do you want to mark _nl_xxxxx as weak symbols?
> > >
> > > So that if a program calls setlocale, but uses only (e.g.) the ctype data,
> > > then all the built-in "C" locale data for the other categories need not be
> > > linked in, and setlocale in fact will avoid reading the locale data files
> > > at run time for the unused categories. It makes the program smaller (if
> > > statically linked) and faster.
> > >
> >
> > I am not sure if weak symbol is used for that purpose.
>
> I just told you I am using it for that purpose! And it works fine!
>
> > How does a linker know what categories a setlocal () will use?
>
> Of course the linker doesn't know anything about it! If the program uses
> the locale data, it will refer to _nl_current_LC_* which is defined in
> lc-*.o, and those references will be strong refs not weak ones. Those
> references cause the necessary files to be linked in, regardless of setlocale.
>
> This is why nl_langinfo.c goes to special pains to produce a strong
> reference to each _nl_current_LC_* symbol, because the run-time argument to
> nl_langinfo determines which categories are involved, so all the data is
> potentially needed.
>
As of gas-950417, the ld bug was still not fixed. BTW, I couldn't find
the ChangeLog entry for that fix.
--
H.J. Lu
NYNEX Science and Technology, Inc. hjl@nynexst.com
------
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: Makefile bar.c foo.c main.c x.c
# Wrapped by hjl@jalod on Thu Apr 20 01:28:58 1995
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(281 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
XSRCS= foo.c x.c bar.c
XOBJS=$(SRCS:.c=.o)
XAR=ar
XRANLIB =ranlib
X
X.c.o:
X $(CC) $(CFLAGS) -c $<
X
Xall: f1 f2
X
Xf1: libfoo.a
X $(CC) -o $@ main.c -L. -lfoo
X
Xf2: libfoo.a
X $(CC) -o $@ main.c x.o -L. -lfoo
X
Xlibfoo.a:$(OBJS)
X $(AR) ucvr $@ $(OBJS)
X $(RANLIB) $@
X
Xclean:
X -rm -f *.o *.a f1 f2
END_OF_FILE
if test 281 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'bar.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'bar.c'\"
else
echo shar: Extracting \"'bar.c'\" \(68 characters\)
sed "s/^X//" >'bar.c' <<'END_OF_FILE'
X#include <stdio.h>
X
Xextern int x;
X
Xbar ()
X{
X printf ("%d\n", x);
X}
END_OF_FILE
if test 68 -ne `wc -c <'bar.c'`; then
echo shar: \"'bar.c'\" unpacked with wrong size!
fi
# end of 'bar.c'
fi
if test -f 'foo.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'foo.c'\"
else
echo shar: Extracting \"'foo.c'\" \(85 characters\)
sed "s/^X//" >'foo.c' <<'END_OF_FILE'
X#include <stdio.h>
X
X#pragma weak x
X
Xextern int x;
X
Xfoo ()
X{
X printf ("%d\n", x);
X}
END_OF_FILE
if test 85 -ne `wc -c <'foo.c'`; then
echo shar: \"'foo.c'\" unpacked with wrong size!
fi
# end of 'foo.c'
fi
if test -f 'main.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'main.c'\"
else
echo shar: Extracting \"'main.c'\" \(32 characters\)
sed "s/^X//" >'main.c' <<'END_OF_FILE'
Xmain ()
X{
X foo ();
X bar ();
X}
END_OF_FILE
if test 32 -ne `wc -c <'main.c'`; then
echo shar: \"'main.c'\" unpacked with wrong size!
fi
# end of 'main.c'
fi
if test -f 'x.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'x.c'\"
else
echo shar: Extracting \"'x.c'\" \(12 characters\)
sed "s/^X//" >'x.c' <<'END_OF_FILE'
Xint x = 20;
END_OF_FILE
if test 12 -ne `wc -c <'x.c'`; then
echo shar: \"'x.c'\" unpacked with wrong size!
fi
# end of 'x.c'
fi
echo shar: End of shell archive.
exit 0
More information about the Gas2
mailing list