2012-03-25 4 views
0

У меня есть программа, которая выполняет некоторую сеть ввода-вывода, который собирает 32-битный двоичный просто отличнопортирование сетевой код на 64 бита

Однако, когда я установил -m64 опцию во время компиляции я получаю следующее сообщение об ошибке, а зашифрованное

In file included from /usr/include/sys/stream.h:22, 
      from /usr/include/netinet/in.h:62, 
      from /usr/include/sys/socket.h:221, 
      from operation_networkio.cc:15: 
/usr/include/sys/vnode.h:241: error: overflow in array dimension 
/usr/include/sys/vnode.h:241: error: size of array `pad' is too large 

оскорбления линии в моем исходном коде operation_networkio.cc, которые запускающие эту ошибку в моей программе, кажется,

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 

может кто-то просветить меня, что я делать неправильно и как вылечить это? Я использую GCC на Solaris sparc

ответ

1

В итоге оказалось, что в компиляции включена опция -mfaster-structs.

По какой-то причине удаление этой опции устраняет эту проблему сборки. что приводит к сбою 64-битной сборки, хотя работает 32-разрядная сборка. Если кто-то может это объяснить, я бы определенно хотел знать, почему

0

Это действительно странно.

http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/sys/vnode.h#286

Это не должно быть возможно, что эти структуры данных растут за 64 байт. Или, возможно, вы включили некоторые файлы, которые переопределяют эти структуры данных. Чтобы убедиться, в чем причина, вы должны посмотреть на предварительно обработанный вывод компилятора C.

g++ -E operation_networkio.cc -I... -D... -o preprocessed.cc 

После выполнения этой команды вы должны взглянуть на файл preprocessed.cc. Найдите vn_vfslocks_entry и посмотрите, соответствует ли код этого определения.