fragmentos de código de dos archivos de código fuente C:puntero después de la llamada a la función
Ac
Channel *testChannelGet()
{
Channel *ch = channelGet (parser,parserCh);
return ch;
}
Bc
Channel *channelGet(UINT8 parser, UINT16 parserCh)
{
chnl.player = &solPlayer;
return((Channel *)&chnl);
}
Compilo ambos archivos y crear una estática y una biblioteca compartida . Ahora llamo TestChannelGet desde un programa de ejemplo. Cuando lo conecto contra la biblioteca estática, funciona perfectamente. Pero si lo conecto contra la biblioteca compartida, es SEGFAULTing. La depuración me dice que el puntero devuelto por channelGet está cambiando en el momento en que regresa. GDB salida a continuación.
174 Channel *ch = channelGet (parser,parserCh);
(gdb) s
channelGet (parser=1 '\001', parserCh=1) at B.c:15174
15174 chnl.player = &solPlayer;
(gdb) n
15175 return((Channel *)&chnl);
(gdb) p ((Channel *)&chnl)
$1 = (Channel *) 0x7ffff7fed1a0
(gdb) n
15176 }
(gdb) n
testChannelGet at A.c:175
175 return ch;
(gdb) p ch
$2 = (Channel *) 0xfffffffff7fed1a0
parece que los puntos de valor de dirección a un desplazamiento diferente ahora - 0xfffffffff7fed1a0 vs 0x7ffff7fed1a0. Los últimos bytes en ambas direcciones son iguales.
¿Alguna pista? He intentado la opción -fPIC inútilmente.
¿Qué es 'chnl' y dónde está definido? – Jan
Es una variable global definida en B.c - Channel chnl; e inicializado en otro archivo, chnl = malloc (sizeof (Channel *)); – Vasu
¿Podría ser que cuando llame a la lib dinámica no se realice la inicialización? –