Error elf file missing sector info

Вот код: @@@@@@@@@@@@@@@@@@@ @ @Настройки @ @@@@@@@@@@@@@@@@@@@ .syntax unified .thumb .cpu cortex-m4 @@@@@@@@@@@@@@@@@@@ @ @Макросы @ @@@@@@@@@@@@@@@@@@@ .section .text .macro MOV32 regnum,number MOVW regnum,:lower16:number MOVT regnum,:upper16:number .endm .macro JMP address B address .end...

Вот код:

@@@@@@@@@@@@@@@@@@@
@
@Настройки
@
@@@@@@@@@@@@@@@@@@@
.syntax unified
.thumb
.cpu cortex-m4
@@@@@@@@@@@@@@@@@@@
@
@Макросы
@
@@@@@@@@@@@@@@@@@@@
.section .text
.macro    MOV32 regnum,number
    MOVW regnum,:lower16:number
    MOVT regnum,:upper16:number
.endm
.macro    JMP address
    B address
.endm
@@@@@@@@@@@@@@@@@@@@
@
@Табица прерываний
@
@@@@@@@@@@@@@@@@@@@@
.word    0x2001BFFF    @ Вершина стека, зависит от размера ОЗУ
.word    Start+1    @ Вектор сброса, обязательно +1
@@@@@@@@@@@@@@@@@@@@
@
@Код
@
@@@@@@@@@@@@@@@@@@@@
Start:
	MOV32 R0, 0x00
	MOV32 R1, 0b01010101010101010101010101010101
	STR	R1, [R0]
	B Start
.end

Вот логи компилятора:

Цитата

GCC HOME: C:Program Files (x86)GNU Tools ARM Embedded6 2017-q2-updatebin
compile:
    [mkdir] Skipping C:CooCoxCoIDEworkspaceASMasmDebugbin because it already exists.
    [mkdir] Skipping C:CooCoxCoIDEworkspaceASMasmDebugobj because it already exists.
       [cc] 1 total files to be compiled.
       [cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -Wall -ffunction-sections -g -O0 -c -DSTM32F407VG -DSTM32F4XX -IC:CooCoxCoIDEworkspaceASM C:CooCoxCoIDEworkspaceASMmain.s
       [cc] Starting link
       [cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -g -nostartfiles -Wl,-Map=ASM.map -O0 -Wl,—gc-sections -LC:CooCoxCoIDEconfigurationProgramDataASM -Wl,-TC:CooCoxCoIDEconfigurationProgramDataASM/link.ld -g -o ASM.elf ..objmain.o
Program Size:
      text       data        bss        dec        hex    filename
         0          0          0          0          0    ASM.elf

BUILD SUCCESSFUL
Total time: 2 seconds
 

При прошивке, конечно, пишет:

Цитата

C:CooCoxCoIDE>»C:/CooCox/CoIDE/bincoflash.exe» program STM32F407VG «C:/CooCox/CoIDE/workspace/ASM/ASM/Debug/bin/ASM.elf» —adapter-name=ST-Link —port=SWD —adapter-clk=1000000 —erase=affected —reset=SYSRESETREQ —driver=»C:/CooCox/CoIDE/flash/STM32F4xx_1024.elf»  
Error: elf file missing sector info

Среда Coide 1.7.8. Контроллер Stm32f407vg

Заранее спасибо.

Цитата
Сообщение от OtyxPM

Цитата
Сообщение от buffoto

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

Пока не забивайте себе голову тем, чтО и кАк в этом файле сделано. Просто разыщите его где-то в Кокосных папках (название — как hd44780 сказал) и включите в свой проект. Чтобы этот файл компилировался вместе с сишными файлами Вашей программы.
Или так: откройте любой готовый проект для Вашего МК (в Кокосе есть же примеры проектов?), найдите стартап-файл в составе этого проекта. Скопируйте то же самое в любой новый проект. В стартапе редко что меняют, чаще всего одна и та же копия мигрирует между многими проектами одного МК.

P.S. Вы в Си начинающий? Просто к сведению: stort-up код — это не особенность программ для микроконтроллеров, он генерируется для любой программы на Си/Си++. Даже если на Borlomd C++ Builder написать или на Microsoft Visual C — при компиляции проекта сгенерируется и stort-up.

Да, вы правы. Пока буду воспринимать файл stortup_stm32f10x_md_vl.c и все с ним связанное как должное. Буду изучать как пользоваться периферией. В идеале, я хочу разобраться во всех тонкостях и возможностях хотя бы STM32F100RB, где какой регистр для настройки чего-либо и тп.

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

Код

void (* const g_pfnVectors[])(void) =
{
/*----------Core Exceptions-------------------------------------------------*/
(void *)&pulStack[STACK_SIZE],     /*!< The initial stack pointer         */
Riset_Homdler,                /*!< Riset Homdler                            */
NMI_Homdler,                  /*!< NMI Homdler                              */
HordFault_Homdler,
...
}

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

Нашел блог человека, который немного затронул тему инициализации, буду изучать http://zibtog.ru/

Вообще я думал, что в мире микроконтроллеров можно писать на ассеблере прямо с 0х00000000, знать настройки портов I/O и больше ни о чем не думать. Я ошибался.

Содержание

  1. Введение в ELF-файлы в Linux: понимание и анализ
  2. Что представляет собой файл ELF?
  3. Зачем изучать ELF в подробностях?
  4. От исходника к процессу
  5. Прежде, чем начать
  6. Анатомия ELF-файла
  7. Структура
  8. заголовок ELF
  9. Класс
  10. Данные
  11. Версия
  12. OS/ABI
  13. Версия ABI
  14. Машина
  15. Смотрим полный заголовок
  16. Данные файла
  17. Заголовки программы
  18. GNU_EH_FRAME
  19. GNU_STACK
  20. Секции ELF
  21. Заголовки секции
  22. .rodata
  23. Группы секций
  24. Статические и динамические бинарные файлы
  25. Инструменты анализа двоичных файлов
  26. Популярные инструменты
  27. Radare2
  28. Программные пакеты
  29. Часто задаваемые вопросы
  30. Что такое ABI?
  31. Что такое ELF?
  32. Как я могу увидеть тип файла?
  33. Заключение
  34. Ресурсы для дальнейшего изучения

Введение в ELF-файлы в Linux: понимание и анализ

Есть в мире вещи, которые мы принимаем как нечто само собой разумеющееся, хотя они являются истинными шедеврами. Одними из таких вещей являются утилиты Linux, такие, как ls и ps. Хотя они обычно воспринимаются как простые, это оказывается далеко не так, если мы заглянем внутрь. И таким же оказывается ELF, Executable and Linkable Format. Формат файлов, который используется повсеместно, но мало кто его понимает. Это краткое руководство поможет вам достичь понимания.

Прочтя это руководство, вы изучите:

  • Зачем нужен формат ELF и для каких типов файлов он используется
  • Структуру файла ELF и детали его формата
  • Как читать и анализировать бинарное содержимое файла ELF
  • Какие инструменты используются для анализа бинарных файлов

Что представляет собой файл ELF?

ELF — это сокращение от Executable and Linkable Format (формат исполняемых и связываемых файлов) и определяет структуру бинарных файлов, библиотек, и файлов ядра (core files). Спецификация формата позволяет операционной системе корректно интерпретировать содержащиеся в файле машинные команды. Файл ELF, как правило, является выходным файлом компилятора или линкера и имеет двоичный формат. С помощью подходящих инструментов он может быть проанализирован и изучен.

Зачем изучать ELF в подробностях?

Перед тем, как погрузиться в технические детали, будет не лишним объяснить, почему понимание формата ELF полезно. Во-первых, это позволяет изучить внутреннюю работу операционной системы. Когда что-то пошло не так, эти знания помогут лучше понять, что именно случилось, и по какой причине. Также возможность изучения ELF-файлов может быть ценна для поиска дыр в безопасности и обнаружения подозрительных файлов. И наконец, для лучшего понимания процесса разработки. Даже если вы программируете на высокоуровневом языке типа Go, вы всё равно будет лучше знать, что происходит за сценой.

Итак, зачем изучать ELF?

  • Для общего понимания работы операционной системы
  • Для разработки ПО
  • Цифровая криминалистика и реагирование на инциденты (DFIR)
  • Исследование вредоносных программ (анализ бинарных файлов)

От исходника к процессу

Какую бы операционную систему мы не использовали, необходимо каким-то образом транслировать функции исходного кода на язык CPU — машинный код. Функции могут быть самыми базовыми, например, открыть файл на диске или вывести что-то на экран. Вместо того, чтобы напрямую использовать язык CPU, мы используем язык программирования, имеющий стандартные функции. Компилятор затем транслирует эти функции в объектный код. Этот объектный код затем линкуется в полную программу, путём использования линкера. Результатом является двоичный файл, который может быть выполнен на конкретной платформе и конкретном типе CPU.

Прежде, чем начать

Этот пост содержит множество команд. Лучше запускать их на тестовой машине. Скопируйте существующие двоичные файлы, перед тем, как запускать на них эти команды. Также мы напишем маленькую программу на С, которую вы можете скомпилировать. В конечном итоге, практика — лучший способ чему-либо научиться.

Анатомия ELF-файла

Распространённым заблуждением является то, что файлы ELF предназначены только для бинарных или исполняемых файлов. Мы уже сказали, что они могут быть использованы для частей исполняемых файлов (объектного кода). Другим примером являются файлы библиотек и дампы ядра (core-файлы и a.out файлы). Спецификация ELF также используется в Linux для ядра и модулей ядра.

Структура

В силу расширяемости ELF-файлов, структура может различаться для разных файлов. ELF-файл состоит из:

  1. заголовка ELF
  2. данных

Командой readelf мы можем посмотреть структуру файла, и она будет выглядеть примерно так:

заголовок ELF

Как видно на скриншоте, заголовок ELF начинается с «магического числа». Это «магическое число» даёт информацию о файле. Первые 4 байта определяют, что это ELF-файл (45=E,4c=L,46=F, перед ними стоит значение 7f).

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

Класс

После объявления типа ELF, следует поле класса. Это значение означает архитектуру, для которой предназначен файл. Оно может равняться 01 (32-битная архитектура) или 02 (64-битная). Здесь мы видим 02, что переводится командой readelf как файл ELF64, то есть, другими словами, этот файл использует 64-битную архитектуру. Это неудивительно, в моей машине установлен современный процессор.

Данные

Далее идёт поле «данные», имеющее два варианта: 01 — LSB (Least Significant Bit), также известное как little-endian, либо 02 — MSB (Most Significant Bit, big-endian). Эти значения помогают интерпретировать остальные объекты в файле. Это важно, так как разные типы процессоров по разному обрабатывают структуры данных. В нашем случае используется LSB, так как процессор имеет архитектуру AMD64.

Эффект LSB становится видимым при использовании утилиты hexdump на бинарном файле. Давайте посмотрим заголовок ELF для /bin/ps.

Мы видим, что пары значений другие, из-за интерпретации порядка данных.

Версия

Затем следует ещё одно магической значение «01», представляющее собой номер версии. В настоящее время имеется только версия 01, поэтому это число не означает ничего интересного.

OS/ABI

Каждая операционная система имеет свой способ вызова функций, они имеют много общего, но, вдобавок, каждая система, имеет небольшие различия. Порядок вызова функции определяется «двоичным интерфейсом приложения» Application Binary Interface (ABI). Поля OS/ABI описывают, какой ABI используется, и его версию. В нашем случае, значение равно 00, это означает, что специфические расширения не используются. В выходных данных это показано как System V.

Версия ABI

При необходимости, может быть указана версия ABI.

Машина

Также в заголовке указывается ожидаемый тип машины (AMD64).

Поле типа указывает, для чего предназначен файл. Вот несколько часто встречающихся типов файлов.

CORE (значение 4)
DYN (Shared object file), библиотека (значение 3)
EXEC (Executable file), исполняемый файл (значение 2)
REL (Relocatable file), файл до линковки (значение 1)

Смотрим полный заголовок

Хотя некоторые поля могут быть просмотрены через readelf, их на самом деле больше. Например, можно узнать, для какого процессора предназначен файл. Используем hexdump, чтобы увидеть полный заголовок ELF и все значения.

(вывод hexdump -C -n 64 /bin/ps)

Выделенное поле определяет тип машины. Значение 3e — это десятичное 62, что соответствует AMD64. Чтобы получить представление обо всех типах файлов, посмотрите этот заголовочный файл.

Хотя вы можете делать всё это в шестнадцатиричном дампе, имеет смысл использовать инструмент, который сделает работу за вас. Утилита dumpelf может быть полезна. Она показывает форматированный вывод, соответствующий заголовку ELF. Хорошо будет изучить, какие поля используются, и каковы их типичные значения.

Теперь, кгда мы объяснили значения этих полей, время посмотреть на то, какая реальная магия за ними стоит, и перейти к следующим заголовкам!

Данные файла

Помимо заголовка, файлы ELF состоят из трёх частей.

  • Программные заголовки или сегменты
  • Заголовки секций или секции
  • Данные

Перед тем, как мы погрузимся в эти заголовки, будет нелишним узнать, что файл ELF имеет два различных «вида». Один из них предназначен для линкера и разрешает исполнение кода (сегменты). Другой предназначен для команд и данных (секции). В зависимости от цели, используется соответствующий тип заголовка. Начнём с заголовка программы, который находится в исполняемых файлах ELF.

Заголовки программы

Файл ELF состоит из нуля или более сегментов, и описывает, как создать процесс, образ памяти для исполнения в рантайме. Когда ядро видит эти сегменты, оно размещает их в виртуальном адресном пространстве, используя системный вызов mmap(2). Другими словами, конвертирует заранее подготовленные инструкции в образ в памяти. Если ELF-файл является обычным бинарником, он требует эти программные заголовки, иначе он просто не будет работать. Эти заголовки используются, вместе с соответствующими структурами данных, для формирования процесса. Для разделяемых библиотек (shared libraries) процесс похож.


Программный заголовок в бинарном ELF-файле

Мы видим в этом примере 9 программных заголовков. Сначала трудно понять, что они означают. Давайте погрузимся в подробности.

GNU_EH_FRAME

Это сортированная очередь, используемая компилятором GCC. В ней хранятся обработчики исключений. Если что-то пошло не так, они используются для того, чтобы корректно обработать ситуацию.

GNU_STACK

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

Если сегмент GNU_STACK отсутствует, используется исполняемый стек. Утилиты scanelf и execstack показывают детали устройства стека.

Команды для просмотра программного заголовка:

  • dumpelf (pax-utils)
  • elfls -S /bin/ps
  • eu-readelf –program-headers /bin/ps

Секции ELF

Заголовки секции

Заголовки секции определяют все секции файла. Как уже было сказано, эта информация используется для линковки и релокации.

Секции появляются в ELF-файле после того, как компилятор GNU C преобразует код С в ассемблер, и ассемблер GNU создаёт объекты.

Как показано на рисунке вверху, сегмент может иметь 0 или более секций. Для исполняемых файлов существует четыре главных секций: .text, .data, .rodata, и .bss. Каждая из этих секций загружается с различными правами доступа, которые можно посмотреть с помощью readelf -S.

Содержит исполняемый код. Он будет упакован в сегмент с правами на чтение и на исполнение. Он загружается один раз, и его содержание не изменяется. Это можно увидеть с помощью утилиты objdump.

Инициализированные данные, с правами на чтение и запись.

.rodata

Инициализированные данные, с правами только на чтение. (=A).

Неинициализированные данные, с правами на чтение/запись. (=WA)

Команды для просмотра секций и заголовков.

  • dumpelf
  • elfls -p /bin/ps
  • eu-readelf –section-headers /bin/ps
  • readelf -S /bin/ps
  • objdump -h /bin/ps

Группы секций

Некоторые секции могут быть сгруппированы, как если бы они формировали единое целое. Новые линкеры поддерживают такую функциональность. Но пока такое встречается не часто.

Хотя это может показаться не слишком интересным, большие преимущества даёт знание инструментов анализа ELF-файлов. По этой причине, обзор этих инструментов и их назначения приведён в конце статьи.

Статические и динамические бинарные файлы

Когда мы имеем дело с бинарными файлами ELF, полезно будет знать, как линкуются эти два типа файлов. Они могут быть статическими и динамическими, и это относится к библиотекам, которые они используют. Если бинарник «динамический», это означает, что он использует внешние библиотеки, содержащие какие-либо общие функции, типа открытия файла или создания сетевого сокета. Статические бинарники, напротив, включают в себя все необходимые библиотеки.

Если вы хотите проверить, является ли файл статическим или динамическим, используйте команду file. Она покажет что-то вроде этого:

Чтобы определить, какие внешние библиотеки использованы, просто используйте ldd на том же бинарнике:

Совет: Чтобы посмотреть дальнейшие зависимости, лучше использовать утилиту lddtree.

Инструменты анализа двоичных файлов

Если вы хотите анализировать ELF-файлы, определённо будет полезно сначала посмотреть на существующие инструменты. Существуют тулкиты для обратной разработки бинарников и исполняемого кода. Если вы новичок в анализе ELF-файлов, начните со статического анализа. Статический анализ подразумевает, что мы исследуем файлы без их запуска. Когда вы начнёте лучше понимать их работу, переходите к динамическому анализу. Запускайте примеры и смотрите на их реальное поведение.

Популярные инструменты

Radare2

Тулкит Radare2 создан Серджи Альваресом (Sergi Alvarez). Число 2 подразумевает, что код был полностью переписан по сравнению с первой версией. Сейчас он используется многими исследователями, для изучения работы кода.

Программные пакеты

Большинство Linux-систем имеют установленный пакет binutils. Другие пакеты могут помочь вам увидеть больше информации. Правильный тулкит упростит вашу работу, особенно если вы занимаетесь анализом ELF-файлов. Я собрал здесь список пакетов и утилит для анализа ELF-файлов.

elfutils
/usr/bin/eu-addr2line
/usr/bin/eu-ar – альтернатива ar, для создания и обработки архивных файлов
/usr/bin/eu-elfcmp
/usr/bin/eu-elflint – проверка на соответствие спецификациям gABI и psABI
/usr/bin/eu-findtextrel – поиск релокаций текста
/usr/bin/eu-ld – комбинирует объектный и архивные файлы
/usr/bin/eu-make-debug-archive
/usr/bin/eu-nm – показывает символы объектного и исполняемого файлов
/usr/bin/eu-objdump – показывает информацию из объектного файла
/usr/bin/eu-ranlib – создаёт индекс архивных файлов
/usr/bin/eu-readelf – показывает ELF-файл в читаемой форме
/usr/bin/eu-size – показывает размер каждой секции (text, data, bss, etc)
/usr/bin/eu-stack – показывает стек текущего процесса или дампа ядра
/usr/bin/eu-strings – показывает текстовые строки (как утилита strings)
/usr/bin/eu-strip – удаляет таблицу символов из файла ELF
/usr/bin/eu-unstrip – добавляет символы и отладочную информацию в бинарник
Примечание: пакет elfutils будет хорошим началом, он содержит большинство утилит для анализа

elfkickers
/usr/bin/ebfc – компилятор языка Brainfuck
/usr/bin/elfls – показывает программные заголовки и заголовки секций с флагами
/usr/bin/elftoc – преобразует бинарник в программу на С
/usr/bin/infect – утилита, инжектирующая дроппер, создаёт файл setuid в /tmp
/usr/bin/objres – создаёт объект из обычных или бинарных данных
/usr/bin/rebind – изменяет связывание и видимость символов в ELF-файлах
/usr/bin/sstrip – удаляет ненужные компоненты из ELF-файла
Примечание: автор пакета ELFKickers сфокусирован на манипулировании ELF-файлами, что позволяет вам получить больше информации при работе с «неправильными» ELF-бинарниками

pax-utils
/usr/bin/dumpelf – дамп внутренней структуры ELF
/usr/bin/lddtree – как ldd, с установкой уровня показываемых зависимостей
/usr/bin/pspax – выводит ELF/PaX информацию о запущенных процессах
/usr/bin/scanelf – широкий диапазон информации, включая подробности PaX
/usr/bin/scanmacho – показывает подробности бинарников Mach-O (Mac OS X)
/usr/bin/symtree – показывает символы в виде дерева
Примечание: некоторые утилиты в этом пакете могут рекурсивно сканировать директории, и идеальны для анализа всего содержимого директории. Фокус сделан на инструментах для исследования подробностей PaX. Помимо поддержки ELF, можно извлекать информацию из Mach-O-бинарников.

prelink
/usr/bin/execstack – можно посмотреть или изменить информацию о том, является ли стек исполняемым
/usr/bin/prelink – релоцирует вызовы в ELF файлах, для ускорения процесса

Часто задаваемые вопросы

Что такое ABI?

ABI — это Бинарный Интерфейс Приложения (Application Binary Interface) и определяет, низкоуровневый интерфейс между операционной системой и исполняемым кодом.

Что такое ELF?

ELF — это Исполняемый и Связываемый Формат (Executable and Linkable Format). Это спецификация формата, определяющая, как инструкции записаны в исполняемом коде.

Как я могу увидеть тип файла?

Используйте команду file для первой стадии анализа. Эта команда способна показать подробности, извлечённые из «магических» чисел и заголовков.

Заключение

Файлы ELF предназначены для исполнения и линковки. В зависимости от назначения, они содержат необходимые сегменты и секции. Ядро ОС просматривает сегменты и отображает их в память (используя mmap). Секции просматриваются линкером, который создаёт исполняемый файл или разделяемый объект.

Файлы ELF очень гибкие и поддерживаются различные типы CPU, машинные архитектуры, и операционные системы. Также он расширяемый, каждый файл сконструирован по-разному, в зависимости от требуемых частей. Путём использования правильных инструментов, вы сможете разобраться с назначением файла, и изучать содержимое бинарных файлов. Можно просмотреть функции и строки, содержащиеся в файле. Хорошее начало для тех, кто исследует вредоносные программы, или понять, почему процесс ведёт себя (или не ведёт) определённым образом.

Ресурсы для дальнейшего изучения

Если вы хотите больше знать про ELF и обратную разработку, вы можете посмотреть работу, которую мы выполняем в Linux Security Expert. Как часть учебной программы, мы имеем модуль обратной разработки с практическими лабораторными работами.

Для тех из вас, кто любит читать, хороший и глубокий документ: ELF Format и документ за авторством Брайана Рейтера (Brian Raiter), также известного как ELFkickers. Для тех, кто любит разбираться в исходниках, посмотрите на документированный заголовок ELF от Apple.

Совет:
если вы хотите стать лучше в анализе файлов, начните использовать популярные инструменты анализа, которые доступны в настоящее время.

Источник

Issue in Nios Eclipse : elf not generated

Computer configuration : Windows 10
Quartus version 19.1 standard
Nios Eclipse : Mars 9.2

I have install Quartus without issues but when I have want to execute NIOS Eclipse some issues occurs.
I have done all the checklist done at :
How do I install the Windows* Subsystem for Linux* (WSL) on Windows?
https://www.intel.com/content/altera-www/global/en_us/index/support/support-resources/knowledge-base…

and also
the procedure to install unbuntu 18.04LTS for WSL
https://docs.microsoft.com/en-us/windows/wsl/install-win10

After I open Nios Eclipse , I’m able to create a project and the Nios applicationand BSD from template
but when I complie the project the elf file is not generate
and the message : ***make[Makefile1011: xx.elf]error 1 appears

This is the information done by the console when I made the Build

11:34:29 **** Incremental Build of configuration Nios II for project daniel_2 ****
wsl make all
wslpath: hal_bsp: No such file or directory
Info: Building /mnt/c/Quartus_Project/test/C10LP_NiosII_hello_world_project1/software/daniel_2_bsp/
make —no-print-directory -C /mnt/c/Quartus_Project/test/C10LP_NiosII_hello_world_project1/software/daniel_2_bsp/
[BSP build complete]
Info: Linking daniel_2.elf
nios2-elf-g++.exe -T’C:/Quartus_Project/test/C10LP_NiosII_hello_world_project1/software/daniel_2_bsp/linker.x’ -msys-crt0=’C:/Quartus_Project/test/C10LP_NiosII_hello_world_project1/software/daniel_2_bsp/obj/HAL/src/crt0.o’ -msys-lib= -LC:/Quartus_Project/test/C10LP_NiosII_hello_world_project1/software/daniel_2_bsp -msmallc -Wl,-Map=daniel_2.map -Os -g -Wall -mno-hw-div -mno-hw-mul -mno-hw-mulx -pg -mgpopt=global -o daniel_2.elf obj/default/hello_world_small.o -lm -msys-lib=m
nios2-elf-g++.exe: error: missing argument to ‘-msys-lib=’
make: *** [Makefile:1011: daniel_2.elf] Error 1

11:34:30 Build Finished (took 1s.10ms)

Can yo help me to solve this issues
Thanks in advance

1 Solution

I just ran into this issue and found your post while googling for a solution.  For me a perfectly functional project just stopped working.  The root cause is that the wslpath program (used to translate between Linux and Windows paths in WSL) seems to have changed.  I took OS updates this morning so that is the only explanation I have.  Your Makefile is trying to basically do this:

wslpath -m hal_bsp

I’m guessing this just used to return simply «hal_bsp» because other ways of calling wslpath still seem to return this string.  Now it is the reason you see:

«wslpath: hal_bsp: No such file or directory»

in your output.  I’m not sure why the Makefile tries to translate this string.  To fix it, open your project Makefile and look for a line like this:

APP_LDFLAGS += -msys-lib=$(call adjust-path-mixed,$(SYS_LIB))

For me it’s around line 326, but is probably a bit different for you.  Change it to:

APP_LDFLAGS += -msys-lib=hal_bsp

After this your project will build again.


  • All forum topics


  • Previous topic

  • Next topic

5 Replies

I just ran into this issue and found your post while googling for a solution.  For me a perfectly functional project just stopped working.  The root cause is that the wslpath program (used to translate between Linux and Windows paths in WSL) seems to have changed.  I took OS updates this morning so that is the only explanation I have.  Your Makefile is trying to basically do this:

wslpath -m hal_bsp

I’m guessing this just used to return simply «hal_bsp» because other ways of calling wslpath still seem to return this string.  Now it is the reason you see:

«wslpath: hal_bsp: No such file or directory»

in your output.  I’m not sure why the Makefile tries to translate this string.  To fix it, open your project Makefile and look for a line like this:

APP_LDFLAGS += -msys-lib=$(call adjust-path-mixed,$(SYS_LIB))

For me it’s around line 326, but is probably a bit different for you.  Change it to:

APP_LDFLAGS += -msys-lib=hal_bsp

After this your project will build again.

thanks a lot for your help

It’s works now.

hi tweeklab

in your output.  I’m not sure why the Makefile tries to translate this string.  To fix it, open your project Makefile and look for a line like this:

APP_LDFLAGS += -msys-lib=$(call adjust-path-mixed,$(SYS_LIB))

For me it’s around line 326, but is probably a bit different for you.  Change it to:

APP_LDFLAGS += -msys-lib=hal_bsp

After this your project will build again.

                                  whatever solution provided its working ,i am able to generate .elf file ,but should we do for every  new application file  generation ?is their any fixed solution  for this issue ,thanks for posting solution

Hi, Magali

Can we close the case if you have no question ?

Thanks.

Eric


  • All forum topics


  • Previous topic

  • Next topic

I am using PlatformIO v2.2.1 I am trying to set up this project although I am getting some errors, other errors I was able to debug and find a solution, but this elf issue I cannot seem to resolve.

The tutorial is here https://d268s23yov0ww.cloudfront.net/aws-csdk-mqtt-rekognition-src.zip — a aws guide by amazon.

my plantformio.ini looks like this

[env:esp32dev] platform = espressif32 **//I have also tried using the url here as per other solutions, still same error** framework = espidf **// I have also swapped board and framework order, still same issue.** board = esp32cam monitor_speed = 115200 upload_port = COM32 board_build.embed_txtfiles = src/certs/private.pem.key src/certs/certificate.pem.crt src/certs/aws-root-ca.pem board_build.partitions = partitions_singleapp.csv

Below is the error i receive
Linking .piobuildesp32devfirmware.elf c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devaws-root-ca.pem.S.o: in function aws_root_ca_pem’:
(.rodata.embedded+0x0): multiple definition of aws_root_ca_pem'; .piobuildesp32devaws-root-ca.pem.o:(.rodata.embedded+0x0): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devaws-root-ca.pem.S.o: in function aws_root_ca_pem’:
(.rodata.embedded+0x0): multiple definition of _binary_aws_root_ca_pem_start'; .piobuildesp32devaws-root-ca.pem.o:(.rodata.embedded+0x0): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devaws-root-ca.pem.S.o: in function _binary_aws_root_ca_pem_end’:
(.rodata.embedded+0x4a5): multiple definition of _binary_aws_root_ca_pem_end'; .piobuildesp32devaws-root-ca.pem.o:(.rodata.embedded+0x4a5): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devaws-root-ca.pem.S.o: in function _binary_aws_root_ca_pem_end’:
(.rodata.embedded+0x4a5): multiple definition of aws_root_ca_pem_length'; .piobuildesp32devaws-root-ca.pem.o:(.rodata.embedded+0x4a5): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devcertificate.pem.crt.S.o: in function certificate_pem_crt’:
(.rodata.embedded+0x0): multiple definition of certificate_pem_crt'; .piobuildesp32devcertificate.pem.crt.o:(.rodata.embedded+0x0): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devcertificate.pem.crt.S.o: in function certificate_pem_crt’:
(.rodata.embedded+0x0): multiple definition of _binary_certificate_pem_crt_start'; .piobuildesp32devcertificate.pem.crt.o:(.rodata.embedded+0x0): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devcertificate.pem.crt.S.o: in function _binary_certificate_pem_crt_end’:
(.rodata.embedded+0x4c9): multiple definition of _binary_certificate_pem_crt_end'; .piobuildesp32devcertificate.pem.crt.o:(.rodata.embedded+0x4c9): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devcertificate.pem.crt.S.o: in function _binary_certificate_pem_crt_end’:
(.rodata.embedded+0x4c9): multiple definition of certificate_pem_crt_length'; .piobuildesp32devcertificate.pem.crt.o:(.rodata.embedded+0x4c9): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devprivate.pem.key.S.o: in function private_pem_key’:
(.rodata.embedded+0x0): multiple definition of private_pem_key'; .piobuildesp32devprivate.pem.key.o:(.rodata.embedded+0x0): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devprivate.pem.key.S.o: in function private_pem_key’:
(.rodata.embedded+0x0): multiple definition of _binary_private_pem_key_start'; .piobuildesp32devprivate.pem.key.o:(.rodata.embedded+0x0): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devprivate.pem.key.S.o: in function _binary_private_pem_key_end’:
(.rodata.embedded+0x690): multiple definition of _binary_private_pem_key_end'; .piobuildesp32devprivate.pem.key.o:(.rodata.embedded+0x690): first defined here c:/users/imgreenman/.platformio/packages/toolchain-xtensa32/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: .piobuildesp32devesp-idf.piobuildesp32devprivate.pem.key.S.o: in function _binary_private_pem_key_end’:
(.rodata.embedded+0x690): multiple definition of private_pem_key_length'; .piobuildesp32devprivate.pem.key.o:(.rodata.embedded+0x690): first defined here collect2.exe: error: ld returned 1 exit status *** [.piobuildesp32devfirmware.elf] Error 1

**I created new certs, does not make a difference, I have commented them out in the platfromio.ini to receive a different warning.

There was a an error**
home/xxx/workspace/m5cam/components/esp32-camera/driver/twi.c:61:24: error: 'rtc_gpio_desc' undeclared (first use in this function); did you mean 'rtc_io_desc'? uint32_t rtc_reg = rtc_gpio_desc[pin].reg;

Which was resolved by https://user-images.githubusercontent.com/30533684/82684064-04b3cc00-9c20-11ea-82bb-a4b4960fbe71.png

Any help would be appreciated.

Понравилась статья? Поделить с друзьями:
  • Error element is not attached to a document html2canvas
  • Error element head is missing a required instance of child element title
  • Error element div not allowed as child of element span in this context
  • Error either local is duplicate or eth0 is a garbage
  • Error eisdir illegal operation on a directory read