GCC 4.5 vs 4.4 vinculación con dependencias

Observo una diferencia al intentar hacer la misma operación en GCC 4.4 y GCC 4.5. Debido a que el código con el que estoy haciendo esto es exclusivo, no puedo proporcionarlo, pero estoy observando una falla similar con este simple caso de prueba.

Lo que básicamente intento hacer es que una biblioteca compartida (libb) dependa de otra biblioteca compartida (liba). Al cargar libb, supongo que liba también debe cargarse, a pesar de que libb no necesariamente usa los símbolos en liba.

Lo que estoy observando es cuando compilo con GCC 4.4, observo que la liba está cargada, pero si compilo con GCC 4.5, libb no está cargada.

Tengo un pequeño caso de prueba que consta de dos archivos, a.c y b.c. El contenido de los archivos:

//a.c
int a(){ 
    return 0; 
}

//b.c
int b(){
    return 0;
}
//c.c
#include <stdio.h>
int a();
int b();

int main()
{
    printf("%d\n", a()+b());
    return 0;
}
//test.sh    
$CC -o liba.so a.c -shared
$CC -o libb.so b.c -shared -L. -la -Wl,-rpath-link .
$CC c.c -L. -lb -Wl,-rpath-link .
LD_LIBRARY_PATH=. ./a.out

Esta es mi salida con diferentes versiones de GCC

$ CC=gcc-4.4 ./test.sh
1
$ CC=gcc-4.5 ./test.sh
/tmp/cceJhAqy.o: In function `main':
c.c:(.text+0xf): undefined reference to `a'
collect2: ld returned 1 exit status
./test.sh: line 4: ./a.out: No such file or directory
$ CC=gcc-4.6 ./test.sh
/tmp/ccoovR0x.o: In function `main':
c.c:(.text+0xf): undefined reference to `a'
collect2: ld returned 1 exit status
./test.sh: line 4: ./a.out: No such file or directory
$ 

¿Alguien puede explicar lo que está pasando? Otra información adicional es que ldd en libb.so muestra liba.so en GCC 4.4 pero no en GCC 4.5.

EDITA

Cambié test.sh a lo siguiente:

$CC -shared -o liba.so a.c
$CC -L. -Wl,--no-as-needed -Wl,--copy-dt-needed-entries -la -shared -o libb.so b.c -Wl,-rpath-link . 
$CC -L. c.c -lb -Wl,-rpath-link . 
LD_LIBRARY_PATH=. ./a.out

Esto dio el siguiente resultado con GCC 4.5:

/usr/bin/ld: /tmp/cc5IJ8Ks.o: undefined reference to symbol 'a'
/usr/bin/ld: note: 'a' is defined in DSO ./liba.so so try adding it to the linker command line
./liba.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
./test.sh: line 4: ./a.out: No such file or directory

Respuestas a la pregunta(2)

Su respuesta a la pregunta