возвращаемое значение указателя меняется после вызова функции

Фрагменты кода из двух исходных файлов на языке Си:

A.c

Channel *testChannelGet()
{
    Channel *ch = channelGet (parser,parserCh);
    return ch;
}

B.c

Channel *channelGet(UINT8 parser, UINT16 parserCh)
{
    chnl.player = &solPlayer;
    return((Channel *)&chnl);
}

Я компилирую оба файла и создаю статическую и разделяемую библиотеки. Теперь я вызываю testChannelGet из программы-образца. Когда я связываю его со статической библиотекой, он работает отлично. Но если я связываю его с разделяемой библиотекой, то происходит SEGFAULTing. Отладка говорит мне, что указатель, возвращаемый из channelGet, меняется в момент возврата. Ниже приведен вывод GDB.

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

Похоже, что значение адреса теперь указывает на другое смещение - 0xfffffffff7fed1a0 против 0x7ffffff7fed1a0 . Последние байты в обоих адресах одинаковые.

Есть какие-нибудь подсказки? Я пробовал опцию -fPIC, но безрезультатно.

5
задан Vasu 18 December 2011 в 16:33
поделиться