Почему библиотека, скомпилированная на двух немного разных машинах, ведет себя немного по -другому?

StackOverflow https://stackoverflow.com/questions/1268101

Вопрос

Вот настройка:

У моего коллеги есть машина Fedora x64_86 с Cross Compiler GCC 4.3.3 (от Buildroot). У меня есть машина Ubuntu 9.04 x64_86 с тем же перекрестным компилятором.

Мой коллега построил приложение для библиотеки + тестирования, которое работает на тестовой машине, я собрал ту же библиотеку и TestApp и сбои на той же тестовой машине.

Насколько я могу судить, GCC, построенный против сборщика сборочной компиляции UCLIBC, так что, тот же код, тот же компилятор. Какие виды различий в хост -машине повлияют на Cross Compling?

Любое понимание ценится.

Обновление: чтобы уточнить, компиляторы идентичный. Анкет Исходный код для библиотеки и testapp идентичный. Анкет Единственное отличие состоит в том, что TestApp + LIB были составлены на разных машинах.

Это было полезно?

Решение

Если ваш код вылетает (я предполагаю, что вы получаете Sigsegv), кажется, есть ошибка. Скорее всего, это какое -то неопределенное поведение, например, использование висящего указателя или написание по границе буфера.

Несчастная точка неопределенного поведения заключается в том, что это май Работайте над некоторыми машинами. Я думаю, что вы испытываете такое событие здесь. Попробуйте найти ошибку, и вы узнаете, что произойдет :-)

Другие советы

Каким образом это рухнет? Можете ли вы быть более конкретным, предоставить вывод, коды возврата и т. Д. ... Пробовали ли вы подключить какой -то полезный printf ()?

И я думаю, что нам нужно еще несколько подробностей:

  1. Ссылка TestApp с библиотекой?

  2. Библиотека статична или динамична?

  3. Является ли библиотека в пути поиска библиотеки, или вы добавили его каталог в Ld.so.conf?

  4. Вы следите за любыми процедурами установки для библиотеки и TestApp?

  5. Совместимы ли две библиотеки и testApps битовые? Вы ожидаете, что они будут?

  6. Вы работаете как тот же пользователь, что и ваш коллега, с той же средой и разрешениями?

Очевидно, что -то не идентично.

Попробуйте использовать Objdump и его многочисленные варианты, особенно -d, чтобы определить, что отличается.

Вы не сделали смысл, поэтому я собираюсь догадаться, что Binutils - это разница. Это набор инструментов, используемых в строительстве двоичных файлов. Он включает в себя LD, AS и Objdump.

Кросс-компиляторам нужен свой собственный набор бинутилов для целевой архитектуры. Однако, в отличие от GCC, я не верю, что инструменты Binutils выполняют двойную начальную сборку и проверку шага, поэтому возможно, что некоторая отличие от исходной среды сборки x86_64 превратилась в них.

Я бы снова попытался построить пакеты Binutils для ARM, используя Arm CrossCompiler. Посмотрите, имеет ли это значение.

Это то, что я видел в регулярных установках x86 Gentoo Stage1: после установки и обновления компиляторов Bootstrap, пользователь Gentoo хорошо подходит для восстановления системы опять таки используя обновленные инструменты.

What arch is your target (the test machine)?

Are you using the distribution provided compilers? They usually have a quite large set of patches applied to gcc, for example on gentoo there are about 20 patches, fedora and ubuntu won't be that different. Not all patches are 100% fine, though :-( So the compilers may in reality differ.

You may look for a "vanilla" version of gcc on your distribution, maybe it does the trick.

I knew someone who had a similar experience in college. Basically, in a lab of identical machines, his project worked on his development box, but crashed horribly on the professors box. These were two machines which were the same arch, running the same version of the OS.

It boiled down to an uninitialized pointer somewhere.

He had code which looked like:

if(p == NULL) {
    p = f();
}

Since p was a member of a class which was allocated on the heap, it's value was effectively random and occasionally was in fact NULL, making thing works OK... The problem was that sometimes and on some machines, the memory for p was NULL on program startup, but on the prof's box, it was not. The fix was of course to properly initialize p tp NULL and all was well.

You may be experiencing something like this. Or some type of undefined behavior which is a fancy way of saying "it may or may not work as expected for any or no reason at all"

As a stab in the dark, I'd look for uninitialized variables. Make sure all local and global variables are assigned a value. Double check that constructors have initializers for ALL data members.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top