Le 22 sept. 07 à 00:58, David DeHaven a écrit :


Encountered a similar error trying to install glib2 on a system running Leopard (9A527): ld: bc out of range (571728 max is +/-64K) from _g_atomic_int_exchange_and_add in .libs/gatomic.o to _g_atomic_int_exchange_and_add$stub in .libs/ libglib-2.0.0.1400.0.dylib in _g_atomic_int_exchange_and_add from .libs/gatomic.o

There's a bc instruction (or variant thereof, probably the "bne-") that's trying to jump further than 64K bytes from the PC, that's causing the linker error. This would have affected PowerPC builds only.

I poked around a short while and couldn't figure out what's causing the error. It could be a bug in the Leopard preview build of ld64...

I did notice the other functions in gatomic.c didn't have that problem, but they all have a sync instruction before the label, so I dropped a nop in front of the label in g_atomic_int_exchange_and_add (and then later g_atomic_int_add):
 __asm__ __volatile__ ("nop\n"
                        ".Lieaa%=:       lwarx   %0,0,%3\n"

Which compiles to:
        .align 2
        .p2align 4,,15
        .globl _g_atomic_int_exchange_and_add
_g_atomic_int_exchange_and_add:
        nop
.Lieaa17:       lwarx   r2,0,r3
        add     r0,r2,r4
        stwcx.  r0,0,r3
        bne-    .Lieaa17
        mr r3,r2
        blr

And things are building fine now, though wholly untested.

Note the only difference in the assembly output is the nop between the global and the local label (and the tab before the .Lieaa17 label, which doesn't make any difference):
_g_atomic_int_exchange_and_add:
        .Lieaa17:       lwarx   r2,0,r3

Otherwise they're the same. This really looks to me like a bug in ld64.

Here's a patch:
--- old/glib-2.14.0/glib/gatomic.c      2007-09-21 15:32:52.000000000 -0700
+++ new/glib-2.14.0/glib/gatomic.c      2007-09-21 15:32:33.000000000 -0700
@@ -276,7 +276,8 @@ g_atomic_int_exchange_and_add (volatile
                               gint           val)
 {
   gint result, temp;
-  __asm__ __volatile__ (".Lieaa%=:       lwarx   %0,0,%3\n"
+  __asm__ __volatile__ ("nop\n"
+                       ".Lieaa%=:       lwarx   %0,0,%3\n"
                        "         add     %1,%0,%4\n"
                        "         stwcx.  %1,0,%3\n"
                        "         bne-    .Lieaa%="
@@ -292,7 +293,8 @@ g_atomic_int_add (volatile gint *atomic,
                  gint           val)
 {
   gint result, temp;
-  __asm__ __volatile__ (".Lia%=:       lwarx   %0,0,%3\n"
+  __asm__ __volatile__ ("nop\n"
+                       ".Lia%=:       lwarx   %0,0,%3\n"
                        "         add     %1,%0,%4\n"
                        "         stwcx.  %1,0,%3\n"
                        "         bne-    .Lia%="


I think you should rather report this upstream.

--
Anthony Ramine, the infamous MacPorts Trac slave.
[EMAIL PROTECTED]


_______________________________________________
macports-users mailing list
macports-users@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo/macports-users

Reply via email to