У меня есть программа, которая корректно работает на моей машине для разработки, но выдает ошибку «Недопустимая инструкция» при тестировании на «чистой машине», где скопированы только необходимые файлы.
Программа состоит из моей общей библиотеки, созданной из источников C ++, и примера программы-оболочки C, которая демонстрирует использование библиотек. На машине для разработки все встроено в Eclipse w / g ++, и Debug и Release работают нормально. Ряд стандартных библиотек связаны между собой.
Чтобы проверить зависимости, которые я мог пропустить, я скопировал файл .c, файл .so моей библиотеки и файл .h библиотеки в новую установку Linux и скомпилировал / связал их с помощью простого скрипта, созданного с помощью той же компиляции выпуска параметры, которые использует Eclipse. Обе машины имеют g ++ 4.3.2.
Когда я запускаю программу на чистой машине, она сразу выходит из печати после печати «Недопустимая инструкция».
Запуск в GDB производит:
(gdb) run
Starting program: /home/sfallows/Source/Apps/MySample/MySample
[Thread debugging using libthread_db enabled]
[New Thread 0xb5c4ca90 (LWP 7063)]
Program received signal SIGILL, Illegal instruction.
[Switching to Thread 0xb5c4ca90 (LWP 7063)]
0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
77 static ios_base::Init __ioinit;
Current language: auto; currently c++
(gdb) bt
#0 0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
#1 0xb7f0cb48 in global constructors keyed to _ZN8NodeLockC2Ev () at ../NodeLock.cpp:194
#2 0xb7f204ad in __do_global_ctors_aux () from /home/sfallows/Source/Apps/MySample/libMyLib.so
#3 0xb7ee5c80 in _init () from /home/sfallows/Source/Apps/MySample/libMyLib.so
#4 0xb7fe1de4 in ?? () from /lib/ld-linux.so.2
#5 0x00000001 in ?? ()
#6 0xbf8e6b74 in ?? ()
#7 0xbf8e6b7c in ?? ()
#8 0x00000007 in ?? ()
#9 0xbf8e6b2c in ?? ()
#10 0x00000001 in ?? ()
#11 0x00000001 in ?? ()
#12 0xb7feeff4 in ?? () from /lib/ld-linux.so.2
#13 0x00000000 in ?? ()
(gdb) Quit
Я не уверен, почему он запускает статические компоновщики в NodeLock.cpp. У меня нет ни статических / глобальных объектов в этом файле, ни статических / глобальных объектов этого класса.
Машина для разработки представляет собой Intel Core2 Quad, а чистая машина - Pentium 4 Dual. Я предполагаю, что по умолчанию в g ++ используется общее подмножество инструкций x86, и разница в процессорах не является моей проблемой.
Любые предложения о том, что еще посмотреть на оценили. Я пытаюсь избежать установки всего исходного кода библиотеки и зависимостей на чистый компьютер.
К ответу rmn и комментарию Джона Бокера: В мире Windows exe и dll работают на множестве процессоров Intel и AMD, поэтому явно существует широко распространенное подмножество инструкций. Я думал, что GCC будет делать то же самое? Думаю, я полностью исследую набор инструкций / варианты архитектуры.