[Top][All Lists]

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

Re: as/ld silently creates programs with undefined references/symbols

From: Nick Clifton
Subject: Re: as/ld silently creates programs with undefined references/symbols
Date: Thu, 01 Jul 2004 18:30:13 +0100
User-agent: Mozilla Thunderbird 0.7 (X11/20040615)

Hi Russell,

ld version:

  GNU ld version 2.14 20030612

Just to note, version 2.15 is now out, although this version also has this bug.

  arm-linux-as -o t.o t.s
  arm-linux-ld -o t t.o --no-undefined

Object/Source file (t.s) content:

        .globl  _start
        add     r0, r0, #UNDEFINED_SYMBOL
        mov     pc, lr

Observed behaviour:

  arm-linux-as silently builds the object file.

This is the bug. There is no reloc to fixup the add instruction so the assembler should never have accepted the unresolved symbol. Please could you try the attached patch (made against the 2.14 sources) and let me know how it behaves for you. If it works I will update the mainline sources and you can publish the patch on the ARM Linux web site.


2004-07-01  Nick Clifton  <address@hidden>

        * config/tc-arm.c (md_apply_fix3:BFD_RELOC_ARM_IMMEDIATE): Do not
        allow values which have come from undefined symbols.
        Always consider this fixup to have been processed as a reloc
        cannot be generated for it.

Index: gas/config/tc-arm.c
RCS file: /work/repositories/sourceware/src/gas/config/tc-arm.c,v
retrieving revision
diff -c -3 -p -r1.140.2.1 tc-arm.c
*** gas/config/tc-arm.c 13 Jun 2003 16:34:31 -0000
--- gas/config/tc-arm.c 1 Jul 2004 17:22:43 -0000
*************** md_apply_fix3 (fixP, valP, seg)
*** 10693,10698 ****
--- 10693,10712 ----
    switch (fixP->fx_r_type)
+       /* We claim that this fixup has been processed here,
+        even if in fact we generate an error because we do
+        not have a reloc for it, so tc_gen_reloc will reject it.  */
+       fixP->fx_done = 1;
+       if (fixP->fx_addsy
+         && ! S_IS_DEFINED (fixP->fx_addsy))
+       {
+         as_bad_where (fixP->fx_file, fixP->fx_line,
+                       _("undefined symbol %s used as an immediate value"),
+                       S_GET_NAME (fixP->fx_addsy));
+         break;
+       }
        newimm = validate_immediate (value);
        temp = md_chars_to_number (buf, INSN_SIZE);
*************** md_apply_fix3 (fixP, valP, seg)
*** 10709,10715 ****
        newimm |= (temp & 0xfffff000);
        md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
-       fixP->fx_done = 1;
--- 10723,10728 ----

reply via email to

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