2012-06-02 4 views
3

Я пытаюсь создать программу, которая связывается с 32-битной встроенной системой, которая работает на компьютере x86_64 на базе Linux (хост). В главной программе у меня есть структура, содержащая несколько указателей, которые отражают идентичную структуру встроенной системы.Является ли флаг -mx32 GCC (правильно)?

Проблема в том, что на хосте указатели изначально 64-битные, поэтому смещение элементов структуры не такое же, как во встроенной системе. Таким образом, при копировании структуры (как memcpy) содержимое заканчивается не в том месте в копии хоста.

struct { 
    float a; 
    float b; 
    float *p; 
    float *q; 
} mailbox; 
// sizeof(mailbox) is 4*4=16 on the embedded, but 2*4+2*8=24 on the host 

К счастью, я узнал, что here НКУ имеет возможность -mx32 для создания 32-разрядных указателей на x86_64 машинах. Но, при попытке использовать это, я получаю сообщение об ошибке поговорку:

$ gcc -mx32 test.c -o test.e 
cc1: error: unrecognized command line option "-mx32" 

Это для GCC версии 4.4.3 и 4.7.0 20120120 (экспериментальный).

Почему эта опция не работает? Есть ли способ обойти это?

EDIT: В отношении v4.4.7 manual не было опции -mx32, и это верно до v4.6.3. OTOH, v4.7.0 показывает эту опцию, поэтому может быть, что версия Jan-20, которую я использую, не является последней!

+1

Если вы общаетесь с разностной системой, использование указателя с указателями кажется неправильным, поскольку указатели будут действительны только на одной стороне линии связи, даже если бы это был тот случай, когда указатели имели одинаковый размер в обоих системы. Возможно, вы могли бы описать свою проблему с «большой картинкой»? –

+0

@CharlesBailey - Я не использую указатели на стороне хоста для ссылки на любые данные. Мне просто нужны адреса ссылочных объектов во встроенной системе. Я использую (значение) эти адреса для определенной цели в размере хоста. – ysap

+0

@CharlesBailey - BTW, если хост закончится на встроенном хост-процессоре (который он будет в моем случае), как процессор ARM с внешним математическим ускорителем, где оба они имеют одинаковое пространство памяти, тогда использование адресов может быть действующий с обеих сторон. – ysap

ответ

6

Не делайте этого. Во-первых, x32 - это отдельная архитектура. Это не просто компилятор. Для выполнения этой работы вам понадобится x32-версия каждой библиотеки, с которой вы ссылаетесь. Linux-дистрибутивы пока не выпускают версии x32, поэтому это означает, что вы будете либо статически ставить ссылку, либо перемещать собственную среду библиотеки.

В более широком смысле: это просто просит неприятностей. Если ваша структура содержит указатели, они должны быть указателями. Если он содержит «32-разрядные адреса», они должны быть 32-битным целым типом.

+0

Спасибо, Энди. Как упоминалось ранее, я менял членов на целые типы. Однако я не согласен с тем, что это «задание проблем», если поведение системы четко определено, и если кто-то знает, что он делает. На самом деле это не вопрос жизни и смерти в нашей конкретной ситуации, но было бы удобно, если бы он работал.Хост-приложение действительно предназначено для запуска в встроенной системе ARM. Однако на данный момент у меня нет такой системы, поэтому я разрабатываю это небольшое приложение на ПК на базе Linux. Тогда его легко перестроить для ARM. – ysap

+0

Хост-приложение действительно мало и за исключением времени выполнения, и newlib не нуждается в каких-либо дополнительных библиотеках (например, libm или около того). Здесь вы говорите, что опция -mx32, хотя и документирована, на самом деле не реализована в GCC, и это может рассматриваться как ошибка, не так ли? Или это проблема, характерная для Linux? – ysap

+0

«-mx32 option» говорит, чтобы сгенерировать код для целевой машины «x32». Это ** разные ** ABI. Это прекрасно работает, AFAIK. Однако у вас нет такой машины. В дистрибутиве linux работает x86_64. –

Смежные вопросы