libgloss/warning.h: adjust link_warning construct to modern gcc, gas and ld
Jeff Johnston
jjohnstn@redhat.com
Tue Jan 18 19:28:00 GMT 2005
Patch checked in. Thanks again.
-- Jeff J.
Hans-Peter Nilsson wrote:
> I noticed I didn't get the expected warnings at link time. I
> looked at warning.h, and noticed that __SYMBOL_PREFIX wasn't
> used. I fixed that.
>
> After that, I got a warning, but without the specified message:
> /home/hp/cvs_areas/combined/cris-obj/cris-unknown-elf/./newlib/libc.a(makebuf.o):
> In function `__smakebuf':^M
> /home/hp/cvs_areas/combined/combined/newlib/libc/stdio/makebuf.c:96: warning: ^M
>
> (empty line above; empty message)
> So I looked at the assembly code that GCC as of CVS "Fri Jan 14
> 01:28:39 UTC 2005" generates. I noticed that the static const
> char[] isn't emitted at all! Well, that's a valid optimization,
> since to GCC it's apparently unused! I fixed that by adding the
> "used" attribute to the char[].
>
> After that, I got assembler messages:
> isatty.s: Assembler messages:
> isatty.s:12: Warning: ignoring changed section type for .gnu.warning._isatty
> isatty.s:12: Warning: ignoring changed section attributes for .gnu.warning._isatty
>
> I looked at warning.h again and noticed the
> make_section_unallocated hack; emitting a ".section
> .gnu.warning.symname" before the char symname[]. That is,
> mentioning the section name once before first use, without
> attributes and allocation letters, apparently in an attempt to
> cause later specifications; specifically allocation
> specification, to be ignored. A brief look at ld history shows
> that this was necessary a long long time ago, but now the linker
> arranges to throw away .gnu.warning.* sections. (The
> make_section_unallocated hack is benevolent, but nevertheless
> it's a redundant hack and the assembler messages may confuse
> users.)
>
> I suggest just removing the make_section_unallocated hack, as
> per the following patch, which actually works. (I also
> inspected the binary of a program where a linker message had
> been emitted to make sure there was no such string. The local
> symbol is there, but not the string contents.)
>
> 2005-01-16 Hans-Peter Nilsson <hp@axis.com>
>
> * libnosys/warning.h (link_warning) [HAVE_GNU_LD and HAVE_ELF]:
> Prefix symbol in section name with __SYMBOL_PREFIX. Do not use
> __make_section_unallocated. Mark magic variable as used.
>
> Index: warning.h
> ===================================================================
> RCS file: /cvs/src/src/libgloss/libnosys/warning.h,v
> retrieving revision 1.3
> diff -c -p -r1.3 warning.h
> *** warning.h 15 Jan 2005 00:17:51 -0000 1.3
> --- warning.h 16 Jan 2005 18:46:17 -0000
> ***************
> *** 17,25 ****
>
> # ifdef HAVE_SECTION_ATTRIBUTES
> # define link_warning(symbol, msg) \
> - __make_section_unallocated (".gnu.warning." #symbol) \
> static const char __evoke_link_warning_##symbol[] \
> ! __attribute__ ((section (".gnu.warning." #symbol))) = msg;
> # else
> # define link_warning(symbol, msg)
> # endif
> --- 17,25 ----
>
> # ifdef HAVE_SECTION_ATTRIBUTES
> # define link_warning(symbol, msg) \
> static const char __evoke_link_warning_##symbol[] \
> ! __attribute__ ((section (".gnu.warning." __SYMBOL_PREFIX #symbol), \
> ! __used__)) = msg;
> # else
> # define link_warning(symbol, msg)
> # endif
>
> brgds, H-P
More information about the Newlib
mailing list