Структура имеет общий размер в общем объекте, чем в двоичном вызове общего объекта - PullRequest
0 голосов
/ 25 мая 2018

Я конвертирую большую (древнюю) программу в новую ОС и драйвер.Программа и драйвер работают на 64-битной ОС.У меня возникли некоторые трудности при попытке открыть драйвер.

После некоторого тестирования я определил, что конвертируемая программа считает, что определенная структура имеет размер 19412 байт, а драйвер полагает, что эта структура имеет размер 19416 байт.Это в свою очередь приводит к перезаписи содержимого указателя, когда драйвер пытается обнулить содержимое структуры, переданной ему, что приводит к остальным моим проблемам.

Я пытаюсь выяснить, почему драйвери программа не согласна с размером структуры.

Makefile драйвера выглядит следующим образом (перепечатан вручную из-за проблем с подключением, так что простите за опечатки):

cc -g  -m32 -c -fPIC -I../inc -D_UNIX -D_LINX -D_EEEI -D_FILE_OFFSET_BITS=64 ../lib/icelib.c
cc -g -pthread -m32 -shared -lm -o ../lib/libice.so icelib.o 
ar -rcs ../lib/libice.a icelib.o

cc -g -m32 -I../inc -D_UNIX -D_LINX -D_EEEI -lm -o ice ice.c ../lib/libice.so

Программа, в которой он работает, немного большесложно.поскольку двоичный файл динамически загружает SO, который, в свою очередь, выполняет вызовы к драйверу libice.so, а So создается с использованием нескольких объектов и файлов .a.Код, который на самом деле выполняет вызов драйвера, содержится в файле PICbrd.o:

g++ -Dpthread -D_REENTRANT -DINC_TYPEDEFS -DLINUX -DICEPIC -D__FILENAME__=\"PIC6brd.cpp\" -c -g -DDEBUG -pg -m32 -Wall -D__linux__ -D__BUILD_VERS__='"3.1"' -D__BUILD_NUMBER__="'3.8"' -D__BUILD_TIME__''""' -D__cplusplus -Dcsp_SHARED -03 c/src/PIC6brd.cpp -o c/obj/PIC6brd.o 

Есть также тонна -I, включенная в выше, что я не включаю только потому, что этоутроить размер команды.Включение включает в себя указание на ту же библиотеку, которая использовалась для сборки icelib.so

Просто для проверки работоспособности я попытался заменить CC на G ++ в скрипте сборки icelib.so.Я получил гораздо больше предупреждений, но это не изменило размер структуры в SO.

Что может привести к тому, что два двоичных файла будут иметь разные размеры структуры?

edit: Структура вВопрос заключается в том, чтобы включить его здесь, и он ссылается на ряд других структур внутри страны.в то время как в основном он содержит int_4 и int_1, он включает в себя несколько чисел с плавающей точкой и удваивает размер которого зависит от архитектуры.Однако я скомпилировал драйвер с помощью 64-битного сценария сборки и проверил размер структуры там, и он значительно больше (я думаю, 19782).Похоже, что проблема с преобразованием 32-разрядных в 64-разрядные приведет к более чем 4-разрядной разнице.Я также выполнил команду 'file' на всех двоичных файлах, которые показались релевантными, и они все сообщают как 32-битные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...