This is the mail archive of the gas2@sourceware.cygnus.com mailing list for the gas2 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

.gas.warning sections


I have been looking at getting warnings from gnu ld when
used on mips-dec-netbsd platform (this is "plain" ELF on
little-endian mips).  This deals with both GCC, the assembler
and the linker, so forgive me if this message is rather long-winded.

So from looking in the GNU libc it looks like this should be
done like in this simple example:

#define link_warning(symbol, msg)                       \
  static const char __evoke_link_warning_##symbol[]     \
    __attribute__ ((section (".gnu.warning." #symbol))) = msg;

link_warning(null1, "This program uses null1(), which is pointless.\n");
int null1(void) {}

At first, this doesn't get through gcc, I just get
"section attributes are not supported for this target".  From
looking at c-common.c this is because ASM_OUTPUT_SECTION_NAME,
which should mean that the target platform doesn't support
arbitrarily named sections.

Now in config/mips the only file defining ASM_OUTPUT_SECTION_NAME
is elf64.h, which has this code in it:

/* A C statement to output something to the assembler file to switch to section
   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
   define this macro in such cases.  */

#define ASM_OUTPUT_SECTION_NAME(F, DECL, NAME) \
do {                                                            \
  extern FILE *asm_out_text_file;                               \
  if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)              \
    fprintf (asm_out_text_file, "\t.section %s,\"ax\",@progbits\n", (NAME)); \
  else if ((DECL) && TREE_READONLY (DECL))                      \
    fprintf (F, "\t.section %s,\"a\",@progbits\n", (NAME));     \
  else                                                          \
    fprintf (F, "\t.section %s,\"aw\",@progbits\n", (NAME));    \
} while (0)

This is probably really an assembler question:  Is all this stuff really
necessary, and what does the extra @progbits mean?  Stuffing this
code into netbsd.h as well seemed to work ok, but then I looked a bit
further, and while svr4.h has a somewhat simple version of this,
h8300/h8300.h has something more like what I had imagined:
#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME) \
  fprintf (FILE, "\t.section %s\n", NAME)

Stuffing this code into netbsd.h instead seemed to work just as well.
I would welcome enlightenment on this issue. (Maybe it should
be common code in config/mips/something.h?)

Another (maybe somewhat irrelevant) inquiry:  With any of the
two variants above gcc accepts my test file and gas produces an
object file with the required section.  When linking a 'main'-type
file which uses the symbol in question (null1 for my example)
I also get my warning:
tm.o: In function `main':
tm.c(.text+0x28): This program uses null1(), which is pointless.

However, if I change my test file to have *only* the warning section
for null1 (not the function definition itself), I get the following
behaviour:

gcc: Internal compiler error: program ld got fatal signal 6

This is if the program doesn't reference null1() at all.
If I do reference null1() it works right:

tm.o: In function `main':
tm.c(.text+0x28): This program uses null1(), which is pointless.
tm.c(.text+0x28): undefined reference to `null1'

This seems to be a (probably obscure) bug in ld, but hopefully it
shouldn't give me any "real" problems, right?

Yours,
  - Arne H. Juul