Take the two simple sources:
t.c:
extern int t;

int f1(void)
{
  return t;
}

int main(void)
{
  return f() + f1();
}



t1.c:
int t;

int f(void)
{
  return t;
}
 
-------------------

When we compile (and link) them, we get:
00000000100004b0 <.f1>:
    100004b0:   e9 22 80 38     ld      r9,-32712(r2)
    100004b4:   e8 69 00 02     lwa     r3,0(r9)
    100004b8:   4e 80 00 20     blr

....
0000000010000520 <.f>:
    10000520:   e9 22 80 40     ld      r9,-32704(r2)
    10000524:   e8 69 00 02     lwa     r3,0(r9)
    10000528:   4e 80 00 20     blr


Notice how the offsets of r2 are different though they reference the
same variable?   This is a problem only for across objects.
If I change main to use the global variable t also, I get:
    100004f0:   e9 22 80 38     ld      r9,-32712(r2)
inside main
so main and f1 have the same TOC entry for the variable t.

GNU ld version 2.17.50 20070213

-- 
           Summary: TOC entries could be merged
           Product: binutils
           Version: 2.18 (HEAD)
            Status: NEW
          Severity: normal
          Priority: P2
         Component: ld
        AssignedTo: unassigned at sources dot redhat dot com
        ReportedBy: pinskia at gcc dot gnu dot org
                CC: bug-binutils at gnu dot org
GCC target triplet: powerpc64-linux-gnu


http://sourceware.org/bugzilla/show_bug.cgi?id=4646

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.


_______________________________________________
bug-binutils mailing list
bug-binutils@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-binutils

Reply via email to