LINUX.ORG.RU

Проблемы с запуском 32-битного демона на 64-битной машине

 ,


0

1

Итак, сменил я на работе мандриву (32-бита) на арч (64-бита) и оказалось, что я не могу запустить демон, мониторящий состояние телескопа.

Данные передаются мультикастом в виде структуры длиной 1380 байт. Там используются всякие int'ы, поэтому я сделал вначале так:

#define int __int32_t
#define uint __uint32_t
Скомпилировал - но не тут-то было: размер структуры все равно больше: 1456 байт, а не 1380. Еще в структуре есть такие типы, как double (но он вроде бы не зависит от архитектуры), char (вроде, тоже не зависит), вложенные структуры, объединение из четырех uchar'ов и одного ulong'а (оно понятно - сейчас исправлю, но уж очень разница большая - что-то еще виновато), unsigned long (сейчас буду подправлять).

В чем может быть проблема? Может, выравнивание как-то не так выполняется?

☆☆☆☆☆

#define int __int32_t

Да ты просто кладезь быдлокода )

Виновато ли выравнивание - можно проверить с помощью __attribute__((packed)). Скорее всего, виновато.

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

Да ты просто кладезь быдлокода )

А как я тебе однозначно дам определение знакового 32-битного целого, чтобы оно и на 32-битной, и на 64-битной машине одинаково выглядело?

Виновато ли выравнивание - можно проверить с помощью __attribute__((packed)). Скорее всего, виновато.

Сейчас проверю.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

И действительно: теперь эта шняга 1394 байт занимает. Но все равно откуда-то берутся лишние 14 байт...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Так и давай, по стандарту: int32_t. Переопределять ключевые слова - это же финиш. У тебя все стандартные функции, которые с интом работают, уже имеют право слететь.

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

Вложенные структуры тоже надо паковать, отдельно.

unsigned ★★★★
()

Доупаковывался: теперь размер структуры 1378 байт... Куда-то 2 байта «потерялось».

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

ты stdint.h подключил? У меня что-то в последнее время чтение Development адово поднимает самооценку.

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

Вот же черт! Все уже сделано до нас! ☺ (никогда им не пользовался)

Подключил, закомментировал свои define'ы - все равно куда-то 2 байта «потерялись»...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Значит, паддинг уже был на 32 битах где-то. Тебя ждёт увлекательная жизнь человека, не продумавшего сетевой протокол ;)

Ну или просто пересборка телескопа с теми же хаками.

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

Тебя ждёт увлекательная жизнь человека, не продумавшего сетевой протокол

а вообще всегда стоит бить по рукам людям, которые POD-структуры (де)сериализируют (для передачи по сети) через memcopy? Или так таки иногда можно?

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

А в 32-битной версии данные в структуре выравнивались?

Нет.

И еще вот: http://www.rsdn.ru/forum/cpp/3368697.flat.aspx может поможет чем-то.

Ой, спасибо!!!

[code] #pragma pack(4) [/code] решило проблемы

Eddy_Em ☆☆☆☆☆
() автор топика
#define int __int32_t
#define uint __uint32_t

Могучий и ужасный Си.

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

По стандарту C - надо бить. Если хорошо понимают, что такое выравнивание полей структур, и умеют им управлять - то как бы и можно. Может, выйдет чуть быстрее. Но это всё равно привязка к платформе и лишняя морока, накой оно надо?

По вышепривёденной ссылке товарищ таки перешёл на работу с отдельными полями. А ТС по привычке предпочёл взять оттуда костылик для себя )

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

Алгоритм передачи мультикастов писал не я. И писался он 100500 лет назад. На него завязано такое количество сервисов, что нужно сказать так: серверная часть не обсуждается.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

думаетца - паковку структуры надо + выравнивать добавлением пустых полей - до той структуры - которая правильная

и вообще - поля для внешнего формата лучше читать побайтно

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

Велосипед, как я уже выше говорил, не мой. Понятное дело, что стоило бы такую штуку делать с унификацией типов и выравниванием по 8 байт (например).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

тогда правь струкуту - путем добавления пустых полей - чтоб она стала аналогичной старой

ae1234 ★★
()

найди где-нибудь побайтное описание протокола, и сделай всё с начала по человечески. иначе всё равно не заработает, инфа 146%.

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

Исходники есть. Проблема в подгонке.

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