Сбой двоичного файла при сборке с помощью PPC

Я разрабатываю программу для какой-то платы, использующей архитектуру PowerPC. Я только что внес некоторые изменения в репозиторий, немного отрефакторил, а также переместил и стер классы.

На моей машине разработки (VM linux x64) бинарные файлы создаются нормально и являются исполняемыми. Когда я строю с помощью CorssCompile Toolchain, он работает без ошибок и предупреждений. Но в целевой системе я не могу запустить программу, похоже, она даже не доходит до основной точки входа.

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

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

И просто для «забавы»: почему, во имя бога, он будет собираться и работать на x86, а не на ppc.

Да, я знаю, что этой информации мало, чтобы действительно помочь, но я вроде как прошу указаний. Так как мне все равно придется иметь дело с этими проблемами несколько раз.


person MDeero    schedule 05.07.2016    source источник
comment
Похоже, что набор инструментов PPC, а точнее его компилятор, не знал, как обрабатывать статические переменные, объявленные после использования (в том же классе). В то время как у компилятора x86 не было проблем с разбором такого ввода. (Версии компиляторов различались, версия PPC была v4.0.X, а версия x86 — 5.X.X.)   -  person MDeero    schedule 06.07.2016
comment
Чтобы найти ошибку, которую я сделал: На цели: сбой gdb/приложения, а затем посмотрите на кадры, где-то есть кадр __static_initialization_and_destruction_0, который должен даже указать вам на файл и строку, в которой используется еще необъявленная статическая переменная. Дамп ядра в этой ситуации бесполезен, так как дамп не может получить доступ к переменным ПК. Он вообще не покажет вам никакой информации (так что, может быть, я использовал gdb неправильно (не в полной мере).   -  person MDeero    schedule 06.07.2016


Ответы (1)


Почему, во имя бога, он будет собираться и работать на x86, а не на ppc.

Есть миллион возможных причин, от сломанного кросс-тулчейна до багов в libc и некорректного вызова тулчейна.

я прошу направления

Вы должны начать с компиляции этого источника:

int main() { return 0; }

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

Если все это подтвердится, вы можете запустить свой реальный проект под strace и/или GDB и посмотреть, понимаете ли вы, где происходит сбой. Если вы этого не сделаете, отредактируйте свой вопрос с выходными данными инструментов, и кто-то сможет угадать лучше.

Обновление:

Кажется, цепочка инструментов PPC или, скорее, ее компилятор не знал, как обрабатывать статические переменные, объявленные после использования.

Если бы это было правдой, вы бы получили ошибку компиляции. Вы этого не сделали, так что это ложь.

On Target: «gdb сбой/приложение», а затем посмотрите на кадры, где-то есть кадр «__static_initialization_and_destruction_0», который должен даже указать вам на файл и строку, в которой используется еще не объявленная статическая переменная.

Ваша настоящая проблема, скорее всего, заключается в следующем: порядок построения глобальных (или статических по классу) переменных в разных единицах перевода (т. е. в разных исходных файлах) не определен (и обычно противоположен между x86_64 и ppc). Если у вас есть две такие глобальные переменные в разных файлах (скажем, A и B), и если конструктор Bs зависит от того, что A уже построен, ваша программа будет нормально работать на платформах, где A создается до B, но произойдет сбой на платформах, где B пытаются построить до A.

person Employed Russian    schedule 05.07.2016
comment
Это указывает в правильном направлении, было бы неплохо немного объяснить, как это сделать, в любом случае, реальная проблема описана в комментарии к моему вопросу. - person MDeero; 06.07.2016
comment
@MDeero Я обновил ответ. Re: немного объяснений - вы не предоставили никакой информации, чтобы знать, с чего начать объяснение чего-либо. - person Employed Russian; 06.07.2016
comment
Серьезно, все так, как я описал! Вы не можете поправить меня в чем-то, что я только что увидел, ЕДИНСТВЕННОЕ, что я сделал, чтобы избавиться от ошибки, - это переместить строку объявления статической переменной вверх перед ее использованием (в объявлении другой статической переменной) в ТОТ ЖЕ исходный файл . И ДА, я был точно так же блефовал, как и вы, я ожидал, что это вызовет ошибку компиляции, но этого не произошло. Вместо этого он просто не запускался. (Я мог бы также избавиться от ошибки, обновив компилятор, я думаю, но, поскольку он кросс-компилируется, я не хочу ничего там связывать) - person MDeero; 06.07.2016
comment
@MDeero Вероятно, вы все еще ошибаетесь. Перемещение объявления вверх также изменяет порядок построения по отношению к другим переменным, объявленным в том же файле. В любом случае, ваше объяснение не имеет никакого смысла, и поэтому вряд ли будет правильным. - person Employed Russian; 06.07.2016
comment
cmake версии 3.2.2; GNU Make 3.81; CROSS_COMPILE: powerpc-poky-linux-gnuspe-g++ (GCC) 4.8.1; LOCAL_COMPILE: g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010... если вы хотите проверить это, ошибкой является компилятор цепочки инструментов ppc, который, похоже, не заботится о порядке объявления - person MDeero; 06.07.2016