переносить 32-битное приложение linux на 64-битное? - PullRequest
7 голосов
/ 24 августа 2010

Я собираюсь портировать очень крупномасштабное приложение на 64 Бита, я заметил, что в Интернете есть несколько статей, в которых показаны многие подводные камни этого портирования, я хотел бы знать, есть ли какой-нибудь инструмент, который может помочь в портировании на64 бит, то есть поиск мест в коде, которые необходимо изменить .... может быть, gcc с включенными предупреждениями ... это достаточно хорошо?Есть ли что-нибудь лучше?

РЕДАКТИРОВАТЬ: Ребята, я ищу инструмент, если какой-либо может быть полным для компилятора, я знаю, что GCC может помочь, но я сомневаюсь, что он найдет все непереносимые проблемы, которые
будет обнаружен во время выполнения .... может быть инструмент статического анализа кода, который подчеркивает перенос на 64 бита?

спасибо

Ответы [ 5 ]

4 голосов
/ 24 августа 2010

Хороший инструмент называется grep ;-), сделайте

grep -nH -e '\<int\>\|\<short\>\|\<long\>' *

и замените все основные типы этих целочисленных типов на правильные:

  • индексы массивадолжно быть size_t
  • приведение указателей должно быть uintptr_t
  • различия указателей должны быть prtdiff_t
  • типов с предположением, что ширина N должна составлять uintN_t

и так далее, наверное, я забыл некоторые. Тогда gcc со всеми предупреждениями покажет вам.Вы также можете использовать clang в качестве компилятора, это дает еще больше диагностики.

4 голосов
/ 24 августа 2010

Здесь Руководство. Еще один

Размер некоторых типов данных различается в 32-разрядных и 64-разрядных ОС, поэтому проверьте место, где код принимает размер типов данных.Например, если вы приводили указатель на int, это не сработает в 64-битной версии.Это должно решить большинство проблем.

Если ваше приложение использует сторонние библиотеки, убедитесь, что они работают и в 64-битной версии.

1 голос
/ 24 августа 2010

Как насчет компиляции проекта в 64-битной ОС?Компилятор gcc выглядит так:)

1 голос
/ 24 августа 2010

Во-первых, с чего бы «портировать»?

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

0 голосов
/ 23 января 2017

Вот ссылка на веб-страницу Oracle, на которой рассказывается о проблемах, которые часто возникают при переносе 32-битного приложения на 64-битную:

http://www.oracle.com/technetwork/server-storage/solaris/ilp32tolp64issues-137107.html

В одном разделе рассказывается, как использовать lint для обнаружения некоторых распространенных ошибок. Вот копия этого раздела:

Используйте утилиту lint для обнаружения проблем с 64-битной длиной и типами указателей Используйте lint для проверки кода, написанного как для 32-битной, так и для 64-битной среды компиляции. Укажите параметр -errchk=longptr64 для генерации предупреждений LP64. Также используйте флаг -errchk=longptr64, который проверяет переносимость в среде, для которой размер длинных целых и указателей равен 64 битам, а размер простых целых чисел равен 32 битам. Флаг -errchk=longptr64 проверяет присвоения выражений указателей и длинных целочисленных выражений простым целым числам, даже если используются явные приведения.

Используйте параметр -errchk=longptr64,signext, чтобы найти код, в котором обычные правила сохранения значений ISO C позволяют расширять знак целочисленного значения со знаком в выражении целочисленного типа без знака. Используйте параметр -m64 lint, если вы хотите проверить код, который вы собираетесь запускать в 64-битной среде Solaris SPARC или x86.

Когда lint генерирует предупреждения, он печатает номер строки нарушающего кода, сообщение, описывающее проблему, а также указатель или нет. Предупреждающее сообщение также указывает размеры вовлеченных типов данных. Когда вы знаете, что указатель задействован, и знаете размер типов данных, вы можете найти конкретные 64-битные проблемы и избежать существующих проблем между 32-битными и меньшими типами.

Вы можете отключить предупреждение для данной строки кода, разместив комментарий в форме «NOTE (LINTED ())» в предыдущей строке. Это полезно, когда вы хотите, чтобы lint игнорировал определенные строки кода, такие как приведение и присваивание. Будьте предельно осторожны, когда используете комментарий «NOTE (LINTED ())», поскольку он может маскировать реальные проблемы. Когда вы используете NOTE, также включайте #include. Обратитесь к странице справки lint для получения дополнительной информации.

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