Здравствуйте, Димчанский, Вы писали:
Д>Я убрал все кастинги, компилится с предупреждением: Д>warning: assignment makes pointer from integer without a cast Д>Падает по той же причине.
Такое впечатление что компилер видит shmat как int shmat (...)
А если сделать явную декларацию функции?
extern void *shmat(int shmid, void *shmaddr, int shmflg);
Пытаюсь закомпилить на новой платформе Itanium64 старые C-файлы, которые в каменный век кем-то писались под HP-UNIX на RISC платформе. Все как бы собралось, но проблема в вываливании в core dump в одном месте, где используется shared memory.
typedef struct SHMReg
{
char a[11];
int b;
int c;
} MyReg;
MyReg *Reg;
...
// в одном из мест делается присваивание
// gcc на нем предупреждает:
// warning: cast to pointer from integer of different size
// warning: assignment from incompatible pointer type
Reg = (struct MyReg*)shmat(shmid, NULL, 0); // возвращает 0x57ca000
В Reg заносится странное для меня число-указатель.
И потом в первом же месте, где пытаемся работать с Reg, вываливаемся c core dump:
Program received signal SIGSEGV, Segmentation fault
si_code: 1 — SEGV_MAPERR — Address not mapped to object.
Есть подозрение, что функция shmat как-то не так используется.
Где грабли?
Здравствуйте, Димчанский, Вы писали:
Д>Пытаюсь закомпилить на новой платформе Itanium64 старые C-файлы, которые в каменный век кем-то писались под HP-UNIX на RISC платформе. Все как бы собралось, но проблема в вываливании в core dump в одном месте, где используется shared memory.
Д>[ccode] Д>typedef struct SHMReg Д>{ Д> char a[11]; Д> int b; Д> int c; Д>} MyReg;
Д>MyReg *Reg;
Д>...
Д>И потом в первом же месте, где пытаемся работать с Reg, вываливаемся c core dump: Д>
Program received signal SIGSEGV, Segmentation fault
Д> si_code: 1 — SEGV_MAPERR — Address not mapped to object.
Д>Есть подозрение, что функция shmat как-то не так используется. Д>Где грабли?
Не спец в HP-UNIX и Itanium64, но вызывает подозрение вот это: char a[11];, т.к. вообще-то
Необходимо учитывать, что сегмент разделяемой памяти, пристыковываемый таким способом, может быть в разных процессах пристыкова к разным адресам. Поэтому все указатели в области разделяемой памяти должны быть не абсолютными, а относительными (как правило относительно адреса начала сегмента).
Здравствуйте, Dmi3S, Вы писали:
DS>Не спец в HP-UNIX и Itanium64, но вызывает подозрение вот это: char a[11];, т.к. вообще-то DS>
DS>Необходимо учитывать, что сегмент разделяемой памяти, пристыковываемый таким способом, может быть в разных процессах пристыкова к разным адресам. Поэтому все указатели в области разделяемой памяти должны быть не абсолютными, а относительными (как правило относительно адреса начала сегмента).
DS>Случайно не на обращении ли к "a" вылетает?
m[10] = 0x00;
// вылетает на строке ниже
strcpy(Reg->а, m); // m - строка: char m[11];
Пытался в GDB смотреть:
p Reg->a
говорит:
Error accessing memory address 0x57ca000: Bad address.
Здравствуйте, Димчанский, Вы писали:
Д>Пытаюсь закомпилить на новой платформе Itanium64 старые C-файлы, которые в каменный век кем-то писались под HP-UNIX на RISC платформе. Все как бы собралось, но проблема в вываливании в core dump в одном месте, где используется shared memory.
Д>
Д>typedef struct SHMReg
Д>{
Д> char a[11];
Д> int b;
Д> int c;
Д>} MyReg;
Д>MyReg *Reg;
Д>...
Д>// в одном из мест делается присваивание
Д>// gcc на нем предупреждает:
Д>// warning: cast to pointer from integer of different size
Д>// warning: assignment from incompatible pointer type
Д>Reg = (struct MyReg*)shmat(shmid, NULL, 0); // возвращает 0x57ca000
Д>
Д>В Reg заносится странное для меня число-указатель. Д>И потом в первом же месте, где пытаемся работать с Reg, вываливаемся c core dump: Д>
Program received signal SIGSEGV, Segmentation fault
Д> si_code: 1 — SEGV_MAPERR — Address not mapped to object.
Д>Есть подозрение, что функция shmat как-то не так используется. Д>Где грабли?
Думаю варнинги в помощь. Возможно shmat скомпилирована как 32-bit версия и возвращает некоректное значение.
assign 32-bit hex constant to int or pointer -- invalid address (possible dereference errors)
Здравствуйте, Andriy Melnyk, Вы писали:
AM>Думаю варнинги в помощь. Возможно shmat скомпилирована как 32-bit версия и возвращает некоректное значение.
AM>assign 32-bit hex constant to int or pointer -- invalid address (possible dereference errors)
AM>Porting source code to HP-UX
Но это системная функция, на сколько я понимаю. man shmat
Компилил все с указанием -mlp64 ключа.
Здравствуйте, Димчанский, Вы писали:
Д>Но это системная функция, на сколько я понимаю. Д>man shmat Д>Компилил все с указанием -mlp64 ключа.
Системная функция тоже может быть 32 или 64 бита. Нужно проверить это.
Д>// gcc на нем предупреждает: Д>// warning: cast to pointer from integer of different size Д>// warning: assignment from incompatible pointer type
Здесь есть проблема еще на этапе компиляции. Очень похоже, что в shmat declaration возвращается 32 битовое значение. Проверте shm.h на возможные 64 bits defines.
Здравствуйте, Andriy Melnyk, Вы писали:
AM>Здесь есть проблема еще на этапе компиляции. Очень похоже, что в shmat declaration возвращается 32 битовое значение. Проверте shm.h на возможные 64 bits defines.
Как-то особых дефайнов для 32-х и 64-х бит не нашел.
/usr/include/sys/shm.h:
/* @(#) shm.h $Date: 2004/08/05 11:42:17 $Revision: i380/3 PATCH_11.23 (PHKL_31500) */
/* (C) Copyright 2004 Hewlett-Packard Development Company, L.P. */
/*
* BEGIN_DESC
*
* File:
* @(#) common/sys/shm.h $Revision: $
*
* Purpose:
* IPC Shared Memory Facility.
*
* Classification: Release to Release Consistency Req:
* <<please select one of the following:>>
* kernel subsystem private none
* kernel private none
* kernel 3rd party private limited source
* public binary & source
*
* BE header: yes
*
* Shipped: yes
* /usr/include/sys/shm.h
* /usr/conf/sys/shm.h
*
* <<please delete the following note if this is a "public" header>>
* NOTE:
* This header file contains information specific to the internals
* of the HP-UX implementation. The contents of this header file
* are subject to change without notice. Such changes may affect
* source code, object code, or binary compatibility between
* releases of HP-UX. Code which uses the symbols contained within
* this header file is inherently non-portable (even between HP-UX
* implementations).
*
* END_DESC
*/#ifndef _SYS_SHM_INCLUDED
#define _SYS_SHM_INCLUDED
#include <sys/stdsyms.h>
#ifdef _INCLUDE_XOPEN_SOURCE
# include <machine/sys/param_shm.h>
# include <sys/types.h>
# include <sys/ipc.h>
/* The define for SHMLBA moved to machine/sys/param_shm.h. See comment there */
/* The return value on failure of the shmat(2) system call */# define SHM_FAILED (void *)-1L
/*
** Shared Memory Operation Flags.
*/# define SHM_RDONLY 010000 /* attach read-only (else read-write) */# define SHM_RND 020000 /* round attach address to SHMLBA */
/*
** Types.
** Re-name old and keep both for backward compatibilty
*/# ifndef _SHMATT_T
# define _SHMATT_T
typedef unsigned short int __shmatt16_t;
typedef unsigned int shmatt_t;
# endif/* _SHMATT_T */
/*
** Structure Definitions.
*/
/*
** There is a shared mem ID data structure for each segment in the system.
**
** Note: Do not change the order of the fields or the size of the
** structure. Otherwise, object code compatibility will be broken.
**/struct shmid_ds {
struct ipc_perm shm_perm; /* operation permission struct */#if defined(_KERNEL) || defined(__LP64__) || (_XOPEN_SOURCE - 0L >= 500)
size_t shm_segsz; /* size of segment in bytes */#else/* ! _KERNEL && !__LP64__ && !XPG5+ */int shm_segsz; /* size of segment in bytes */# endif
#ifdef _HPUX_SOURCE
struct vas *shm_vas; /* virtual address space this entry */#else
struct __vas *shm_vas; /* virtual address space this entry */#endif
#ifdef _CLASSIC_ID_TYPES
unsigned short shm_filler_lpid;
unsigned short shm_lpid; /* pid of last shmop */unsigned short shm_filler_cpid;
unsigned short shm_cpid; /* pid of creator */#else
pid_t shm_lpid; /* pid of last shmop */
pid_t shm_cpid; /* pid of creator */#endif/*
* Re-name old and keep both for backward compatibilty
*/
__shmatt16_t __shm16_nattch; /* current # attached (accurate) */
__shmatt16_t __shm16_cnattch;/* in memory # attached (inaccurate) */
time_t shm_atime; /* last shmat time */
time_t shm_dtime; /* last shmdt time */
time_t shm_ctime; /* last change time */
shmatt_t shm_nattch; /* NEW current # attached (accurate) */
shmatt_t shm_cnattch; /* NEW in memory # attached (inaccurate) */char shm_pad[16]; /* room for future expansion */
};
# define _SHMID_DS_T
/* Function prototypes */# ifndef _KERNEL
# ifdef __cplusplus
extern"C" {
# endif/* __cplusplus */# if defined(__ia64) && !defined(_LIBC)
/* pragmas needed to support -B protected */# pragma extern shmat, shmctl, shmdt, shmget
# endif/* __ia64 && ! _LIBC */# ifdef _PROTOTYPES
extern void *shmat(int, const void *, int);
extern int shmctl(int, int, struct shmid_ds *);
extern int shmdt(const void *);
# if defined(_XPG2) || defined(_XPG3)
extern int shmget(key_t, int, int);
# else/* not (_XPG2 || _XPG3) */extern int shmget(key_t, size_t, int);
#endif/* not (_XPG2 || _XPG3) */# else/* not _PROTOTYPES */# ifdef _CLASSIC_XOPEN_TYPES
extern char *shmat();
# else
extern void *shmat();
# endif
extern int shmctl();
extern int shmdt();
extern int shmget();
# endif/* not _PROTOTYPES */# ifdef __cplusplus
}
# endif/* __cplusplus */# endif/* not _KERNEL */#endif/* _INCLUDE_XOPEN_SOURCE */#ifdef _INCLUDE_HPUX_SOURCE
/*
** Permission Definitions.
** Implementation Constants.
*/# define SHM_R 0400 /* read permission */# define SHM_W 0200 /* write permission */
/*
** ipc_perm Mode Definitions.
** Only allowed to use bits 033000; others used in ipc.h
*/# define SHM_CLEAR 01000 /* clear segment on next attach */# define SHM_DEST 02000 /* destroy segment when # attached = 0 */# define SHM_NOSWAP 010000 /* region for shared memory is memory locked */
/* (or should be when the region is allocated) */
/*
** Structure Definitions.
*/
/*
** Struct oshmid_ds is the obsolete version of struct shmid_ds.
** Object code compatibility is supported for old a.out files
** that were compiled with this version. However, old .o files
** should be recompiled with the new struct shmid_ds if they are
** to be linked with the new libc.a.
*/struct oshmid_ds {
struct oipc_perm shm_perm; /* operation permission struct */unsigned long shm_segsz; /* size of segment in bytes */struct vas *shm_vas; /* virtual address space this entry */unsigned short int shm_lpid; /* pid of last shmop */unsigned short int shm_cpid; /* pid of creator */unsigned short int shm_nattch; /* current # attached (accurate) */unsigned short int shm_cnattch; /* in memory # attached (inaccurate) */
time_t shm_atime; /* last shmat time */
time_t shm_dtime; /* last shmdt time */
time_t shm_ctime; /* last change time */#ifdef __hp9000s300
char shm_pad[60]; /* for object code compability */#endif/* __hp9000s300 */#if defined(__hp9000s800) || defined(__ia64)
char shm_pad[148];/* for object code compability */#endif/* __hp9000s800 || __ia64 && ! _KERNEL && ! _LIBC */
};
# define _OSHMID_DS_T
struct shminfo {
long shmmax; /* max shared memory segment size */long shmmin; /* min shared memory segment size */int shmmni; /* # of shared memory identifiers */int shmseg; /* max attached shared memory segments per process */
};
# define SHM_LOCK 3 /* Lock segment in core */# define SHM_UNLOCK 4 /* Unlock segment */#endif/* _INCLUDE_HPUX_SOURCE */#endif/* _SYS_SHM_INCLUDED */
Здравствуйте, Димчанский, Вы писали:
Д>Здравствуйте, Andriy Melnyk, Вы писали:
AM>>Здесь есть проблема еще на этапе компиляции. Очень похоже, что в shmat declaration возвращается 32 битовое значение. Проверте shm.h на возможные 64 bits defines.
Д>Как-то особых дефайнов для 32-х и 64-х бит не нашел. Д>/usr/include/sys/shm.h:
Д>Reg = (struct MyReg*)shmat(shmid, NULL, 0); // возвращает 0x57ca000
Попробуйте убрать struct, вот так
Reg = (MyReg*)shmat(shmid, NULL, 0);
или просто
Reg = shmat(shmid, NULL, 0);
Возможно там неявное преобразование pointer(8)->int(4)->pointer(8) с потерей значения.
Здравствуйте, Andriy Melnyk, Вы писали:
AM>Такое впечатление что компилер видит shmat как int shmat (...)
Ну все похоже на то.
AM>А если сделать явную декларацию функции? AM>
AM>extern void *shmat(int shmid, void *shmaddr, int shmflg);
AM>
Yeah! Помогло.
Но блин, как бы найти где она может перебиваться?
А то может с другими похожими системными функциями подобная беда. Потом былезет где-нибудь боком.
Здравствуйте, Димчанский, Вы писали:
Д>Здравствуйте, Andriy Melnyk, Вы писали:
AM>>Такое впечатление что компилер видит shmat как int shmat (...)
Д>Ну все похоже на то.
AM>>А если сделать явную декларацию функции? AM>>
AM>>extern void *shmat(int shmid, void *shmaddr, int shmflg);
AM>>
Д>Yeah! Помогло. Д>Но блин, как бы найти где она может перебиваться? Д>А то может с другими похожими системными функциями подобная беда. Потом былезет где-нибудь боком.
Внимательно изучать ВСЕ варнинги и компилить с -Wall
В даном случае должен быть варнинг что функция shmat undeclared, если компилятор не видел ее (нет хидера, скрыта за дефайном, тп) или перекрыта кем-то — тогда искать поиском и исправлять
Здравствуйте, Andriy Melnyk, Вы писали:
AM>Внимательно изучать ВСЕ варнинги и компилить с -Wall AM>В даном случае должен быть варнинг что функция shmat undeclared, если компилятор не видел ее (нет хидера, скрыта за дефайном, тп) или перекрыта кем-то — тогда искать поиском и исправлять
В рот мне ноги!
Посмотрел на инклюды в этом файле, а такого-то и нет
#include <sys/shm.h>
Врубил все варнинги, а компилятор и пишет "implicit declaration" в месте использования функции, т.е. сам на ходу сочиняет описание для используемой функции.
Словом обычный инклюд решает проблему.
Здравствуйте, Димчанский, Вы писали:
Д>Врубил все варнинги, а компилятор и пишет "implicit declaration" в месте использования функции, т.е. сам на ходу сочиняет описание для используемой функции.
Компилятор и делает implicit declaration с типом возвращения int по умолчанию