LINUX.ORG.RU

WiMAX Network Service 1.4


0

0

система openSUSE 11.3, x86_64, версия gcc
gcc version 4.5.0 20100604 [gcc-4_5-branch revision 160292] (SUSE Linux)

компилю сабж

в итоге wimaxd падает с SIGSEGV

после дебага выяснилось, что дело в неправильном вычислении смещения поля структуры List - pLock

struct List {
struct ListItem *pHead;
UINT32 dwLength;
wmx_critical_section pLock;
//struct ReadWriteLock *pLock;
};

а именно, есть функция l5_dispatcher_FindAllocConnectionByTargetID()

ее код

struct L5DispatcherConnection *l5_dispatcher_FindAllocConnectionByTargetID( L5_TARGET_ID nTargetID )
{
struct L5DispatcherConnection *resItem = NULL;
struct ListItem *tempItem = NULL;
UINT32 i = 0;
UINT32 listLen = 0;

TRACE(TR_MOD_L5_DISPATCHER, TR_SEV_DEBUG, («Enter into l5_dispatcher_FindAllocConnectionByTargetID function») );

wmx_enter_critical_section(AllocList.pLock);
...

после дизассемблирования имеем

Dump of assembler code for function l5_dispatcher_FindAllocConnectionByTargetID:
0x000000000045d3c0 <+0>:   push r12
0x000000000045d3c2 <+2>:   mov r9d,0x1f5
0x000000000045d3c8 <+8>:   mov r8d,0x4a8140
0x000000000045d3ce <+14>:   mov ecx,0x4a7c7c
0x000000000045d3d3 <+19>:   mov edx,0x40
0x000000000045d3d8 <+24>:   mov esi,0x200
0x000000000045d3dd <+29>:   push rbp
0x000000000045d3de <+30>:   mov r12d,edi
0x000000000045d3e1 <+33>:   xor edi,edi
0x000000000045d3e3 <+35>:   push rbx
0x000000000045d3e4 <+36>:   call 0x463320 <TraceAgent_SetMessageProperties>
0x000000000045d3e9 <+41>:   xor eax,eax
0x000000000045d3eb <+43>:   mov edi,0x4a7e50
0x000000000045d3f0 <+48>:   call 0x4633c0 <TraceAgent_PrintTrace>
0x000000000045d3f5 <+53>:   mov rdi,QWORD PTR [rip+0x278b30] # 0x6d5f2c <AllocList+12>
0x000000000045d3fc <+60>:   call 0x485670 <wmx_enter_critical_section>

как видно, смещение правильное - AllocList+12
(AllocList - глобальный объект структуры List)

в то же время в функции инициализации объекта List - List_Init, смещение 16, а не 12

void List_Init(struct List *pList, BOOL threadSafe)
{
if (!pList)
return;

pList->pHead = NULL;
pList->dwLength = 0;

if (TRUE == threadSafe) {
//pList->pLock =(struct ReadWriteLock *)malloc(sizeof(struct ReadWriteLock));
//RWL_Create(pList->pLock);
pList->pLock = malloc(sizeof(wmx_critical_section));
//wmx_startCriticalSection(pList->pLock);
wmx_init_critical_section(&(pList->pLock));
} else {
pList->pLock = NULL;
}
}

дизассемблируем

Dump of assembler code for function List_Init:
0x0000000000466a40 <+0>:   test rdi,rdi
0x0000000000466a43 <+3>:   push rbx
0x0000000000466a44 <+4>:   mov rbx,rdi
0x0000000000466a47 <+7>:   je 0x466a64 <List_Init+36>
0x0000000000466a49 <+9>:   cmp esi,0x1
0x0000000000466a4c <+12>:   mov QWORD PTR [rdi],0x0
0x0000000000466a53 <+19>:   mov DWORD PTR [rdi+0x8],0x0
0x0000000000466a5a <+26>:   je 0x466a70 <List_Init+48>
0x0000000000466a5c <+28>:   mov QWORD PTR [rdi+0x10],0x0
0x0000000000466a64 <+36>:   pop rbx
0x0000000000466a65 <+37>:   ret
0x0000000000466a66 <+38>:   nop WORD PTR cs:[rax+rax*1+0x0]
0x0000000000466a70 <+48>:   mov edi,0x8
0x0000000000466a75 <+53>:   call 0x4227e0 <malloc@plt>
0x0000000000466a7a <+58>:   lea rdi,[rbx+0x10]
0x0000000000466a7e <+62>:   mov QWORD PTR [rbx+0x10],rax

в чем может быть причина и как это победить?


1.4 ужасен. С бубном огромного диаметра заставил его работать. С нетерпением жду 2.6.35, дабы заюзать полностью сорцовую версию 1.5

madgnu ★★★★★ ()
Ответ на: комментарий от megabaks

ничего специального через переменные окружения CFLAGS и т. д. не устанавливал

а так...
-O2, -g, -Wall + дефайны/инклуды

rei3er ()

>смещение 16, а не 12

А разве база в первом и втором случаях не могут указывать в разное место? Выравнивание не могло на это повлиять?

anon_666 ()
Ответ на: комментарий от anon_666

в том то и дело, что хидер с описанием структуры один и тот же, поэтому смещение должно быть одинаково в обоих случаях (может быть как 16 (из-за выравнивания), так и 12)

rei3er ()
Ответ на: комментарий от madgnu

бубен какого плана?

в общем я добавил «выравнивающие» 4 байта в List, вроде не падает, но таки демон wimaxd не запускается

# ./wimaxd
Enter Command:
q - Quit AppSrv
t - Trace ReInit (ReLoads Registry Values)
u - uplink(Apdo uplink event
h - Help


Initializing...

Initialization failed!

в логе

22:49:16 @Notice @-525031680 @ALL @new tarce ================================================ [Trace_Init] @TraceAgent.c (404) @wimaxd
22:49:16 @Notice @-525031680 @ALL @new trace wimaxd Trace file opened at 22:49:16 [Trace_Init] @TraceAgent.c (408) @wimaxd
22:49:16 @Notice @-525031680 @ALL @new tarce ================================================ [Trace_Init] @TraceAgent.c (410) @wimaxd
22:49:16 @Notice @-525031680 @L5_DISPATCHER @L5_DISPATCHER_Initialize Succeed! [L5_DISPATCHER_Initialize] @L5Dispatcher.c (118) @wimaxd
22:49:16 @Notice @-525031680 @KDAPI_ADAPTER @Infrastructure : SOCKETS [L5_SOCKETS_DISPATCHER_Initialize] @L5SocketsDispatcher.c(218) @wimaxd
22:49:16 @Notice @-525031680 @L5_SOCKETS_DISPATCHER@L5_SOCKETS_DISPATCHER_Initialize Succeed. [L5_SOCKETS_DISPATCHER_Initialize] @L5SocketsDispatcher.c(241) @wimaxd
22:49:16 @All @-525031680 @KDAPI_ADAPTER @Target: Driver [KDAPI_ADAPTER_Init] @KDapiAdapter.c (206) @wimaxd
22:49:16 @Alert @-525031680 @KDAPI_ADAPTER @unknown error [ConvertToKDAPI_ADAPTER_RESULT] @KDapiAdapter.c (171) @wimaxd
22:49:16 @All @-525031680 @ACT @Act_InitPipe failed [Act_Initialize] @Act.c (1060) @wimaxd
22:49:16 @All @-525031680 @ACT @Act_Shutdown(IN) [Act_Shutdown] @Act.c (913) @wimaxd

rei3er ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.