?

Log in

No account? Create an account

Previous Entry | Next Entry

Неделю бился над проблемой. Один из кастомеров захотел использовать плавающую точку. "Легко!", - скажете вы и не угадаете.
Поскольку с CrossStudio поставляется самописная libc, к которой прикрутить файловую систему несколько проблематично, то я, не долго думая, взял ту же версию GCC и собрал её с NewLib'ом, о котором мы знаем всё из исходников. GCC по-умолчанию генерит Soft Float в FPA. NewLib, соответственно, тоже сгенерился в FPA. И до позапрошлой недели никаких проблем не было...
На позапрошлой неделе наши друзья написали письмо, что atof() лажает. Проверили: лажает. Покопали: порядок байт в возвращаемом double наоборот. А, помимо этого, результат даже правильный. Ещё, порывшись по исходникам GCC, сошёлся на мысли, что у одних формат FPA, у других - VFP. Натравил objdump, objdump честно сказал, что мои либы в FPA. "Фигня-война!", - сказали джиповоды-любители и подкорячили хедеры, чтобы получилось VFP. Не с первой попытки получилось, ну да ладно.
"Шиш вам!", - ответил ld из CrossStudio, - "Эта ботва у вас Soft float VFP, а эта - Hard float FPA. Я так не умею, а если и умею, то совесть не позволит." Ну я ещё побился-побился с перерывами на другие работы. От безысходности перечитал документацию, нашёл упоминание о том, что в Rowley и впрямь подкорячили GCC для генерации Soft VFP. Пересобрал ещё пару раз Newlib для уверенности, пересобрал все наши либы с явным указанием Soft VFP ключами компилятора в CrossStudio (ибо явно там не указывается soft мы хотим или hard) - всё заработало. Вернул старые либы на место - работает. Сделал новый релиз либ, а потом получаю репорт, что теперь у других ld ругается на несовместимось. Выяснил, что поторопился. Пока копировал наши либы взад - где-то скопировал те же правильные новые.
Написал письмо в Rowley, спросил чего они такое сделали с компилятором, что я никак не могу угадать в каком формате они ожидают плавающую точку. Прислали патч. Применил - не помогло.
Случайно грохнул Binutils'ы, собранные под Cygwin. Подумал, что фигня - надо бы всё равно обновиться. Вытащил новые Binutils'ы и тут-то я понял как нас жестоко кинули... Эти дятлы поправили GCC на генерёж Soft float VFP по-умолчанию. gcc же они не зовут (умные типа сами), зовут cc1, а потом as. Тот, кто ковырялся со всем этим, уже, наверное, понял к чему это я. А для тех, кто не: GCC генерит Soft VFP, но as делает из них Hard FPA объектники (в соответствии со значением по-умолчанию)!
Итого. Поскольку наши либы нигде не используют плавающую точку, а отладчик в CrossStudio понимает только VFP, то видятся два корявых выхода из ситуации:
  1. Подкорячить Binutils'ы, чтобы в них был проинвертирован флаг VFP. Из плюсов - сейчас уже можно пользоваться отладчиком. Из минусов - внесение вековой путаницы, а потом когда-нибудь наколемся обязательно.

  2. Забить на отладчик, собрать и пользовать Soft FPA, подпихнув правильные GCC+Binutils вместо хлама, поставляемого друзьями-англичанами. Тем более objcopy у них по-любому кривой, а нам он нужен рабочий (издержки embedded систем). Тем временем, можно убедить Rowley сделать следующие вещи:
    • Научить отладчик понимать FPA

    • Исправить Binutils

    • Приделать явную галку в менюшку c указанием типа объектников, причём по-умолчанию оно должно быть FPA (ибо объяснить бразильцам почему надо менять проектник при переходе на следующую версию я не смогу)

Поскольку мы благодарные кастомеры Rowley, то они должны пойти нам на встречу. А то я выпрошу командировку в Англию у начальства :-)
Пойду я теперь за пивом. А потом flex+bison под MinGW собирать буду.

Comments

( 5 comments — Leave a comment )
polgig
Jan. 28th, 2005 06:59 pm (UTC)
(с трудом выбравшись из получасового зависания) Автор, пиши ещё! 8)
dyn_ka
Jan. 28th, 2005 07:03 pm (UTC)
а чего angry, если в коммандировку собрался?:-)
uncle_asa
Jan. 29th, 2005 11:25 am (UTC)
Потому что цель командировки - набить морду :-) К тому же я ещё не собрался.
rblaze
Jan. 30th, 2005 06:28 pm (UTC)
А приделать к as опцию "какой soft float" не проще всего? Или он без исходников?
uncle_asa
Jan. 31st, 2005 05:41 am (UTC)
У as'а есть эта опция. Но проблема в том, что CrossStudio по-умолчанию имеет эту опцию неправильной. Собственно и вопрос: или мне подхачить gcc, чтобы было всё криво; или выпрямиить руки криворуким умникам, лазающим в gcc без надобности.
( 5 comments — Leave a comment )