Символ не найден __udivsi3

Я скомпилировал одно из приложений Contiki (power-cons.c: оценивает энергопотребление Mote TelosB) как исполняемый файл Contiki (power-cons.ce). Затем исполняемый файл Contiki загружается на платформу Sky через последовательный порт и сохраняется в файловой системе. Затем исполняемый файл загружается с помощью команды оболочки "exec".

Но при запуске команды exec отображается следующая ошибка ...

Символ не найден __udivsi3

Как я могу разрешить этот символ?


person siju koshy    schedule 09.03.2015    source источник
comment
Почему вы используете динамическое связывание?   -  person CL.    schedule 09.03.2015
comment
Совершенно аналогичная проблема с этим. Проверьте, помогает ли там ответ.   -  person finmor    schedule 09.03.2015
comment
@CL, когда я динамически связываю (загрузчик elf) модуль .ce без использования команды exec, отображается тот же символ ошибки, который не найден   -  person siju koshy    schedule 10.04.2015


Ответы (2)


Проблема в том, что все функции, используемые вашим .ce, уже должны быть на вашем Sky node (я назову его base-system). Все символы, предоставляемые вашей базовой системой, можно просмотреть, запустив nm base-system.sky. Символы, необходимые вашему .ce, отмечены знаком U при работе nm power-cons.ce. Для решения вашей проблемы у вас есть следующие возможности:

  • Не используйте __udivsi3 это ваш .ce. Он использовался для разделения двух unsigned int (manual). Например, вы можете использовать signed int.
  • Используйте __udivsi3 в своей базовой системе.
  • Добавьте
    void__udivsi3(void); void (*additional_symbol1)(void) = &void__udivsi3;
    в один из ваших файлов. Однако это будет стоить вам два байта.
  • Используйте решение, представленное в этом ответ, предложенный @finmor
  • Скажите компоновщику, чтобы он включил функцию в вашу базовую систему. Это немного сложно, так как не удалось найти удобный способ сделать это. Я провел несколько экспериментов, и это не так просто, как я надеялся.
  • Вы можете добавить __udivsi3 в свой .ce. Я не уверен насчет лучшего или самого простого способа сделать это. Вероятно, вы хотите извлечь .o, содержащий __udivsi3, из .a. Это требует некоторого поиска. Для __udivsi3 это идет с gcc (а не с libc). Затем вы можете объединить его со своим power-cons.ce, используя ld -r (отправная точка). Есть и другие способы решить эту проблему, но мне нужно провести небольшое исследование, так как в настоящее время я не активно работаю над этой темой.
person Morty    schedule 09.03.2015
comment
Добавлен LDFLAGS + = - Wl, - undefined = __ udivsi3 в makefile.msp430. Но это не работает - person siju koshy; 11.03.2015
comment
void__udivsi3 (недействительно); void (* additional_symbol1) (void) = & void__udivsi3; Это тоже не работает - person siju koshy; 16.03.2015
comment
@sijukoshy Я действительно это проверял. Вы должны добавить это в свою базовую систему, а не в модуль. - person Morty; 17.03.2015
comment
когда я использую nm base system.sky, я мог видеть 0000c914 T __udivsi3 и запускать nm power-cons.ce в списке U __udivsi3. Тот же символ ошибки не найден: __udivsi3 все еще существует. - person siju koshy; 08.04.2015
comment
Отображается ли он в вашем файле symbols.c, который создается во время сборки вашей базовой системы? - person Morty; 09.04.2015
comment
symbols.c не содержит символа __udivsi3 - person siju koshy; 10.04.2015

Вероятно, вам нужно связать с libm.

Попробуйте добавить -lm в командную строку компоновщика. Также убедитесь, что libm доступен для вашей цели.

person Community    schedule 09.03.2015
comment
Я уже добавил TARGET_LIBFILES + = -lm в makefile..но отображается та же ошибка - person siju koshy; 09.03.2015