система 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
в чем может быть причина и как это победить?
Похожие темы
- Форум как ловить general protection? (2011)
- Форум Методика поиска аналогичного кода в бинарном файле нового релиза. (2021)
- Форум ptrace (2008)
- Форум x86-64 - размер указателя (2009)
- Форум pointer on the stack (2016)
- Форум Странности с sys_clone в андроиде (2016)
- Статьи Линукс, ассемблер и X11 (2023)
- Форум CPL3, Protected mode need help. (2005)
- Форум CentOS-7 network service (2015)
- Форум BUG: Bad page state in process Compositor pfn:c03e2 (2017)