Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подозреваю ошибку в параметрах линкера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Croman13n3c
Стараюсь перенести проект из CoIDE в Eclipse Juno.
Заготовку makefile`а взял из scmrtos. Сами объектники компилируются, но не собираются в окончательный бинарник:

Код
   text       data        bss        dec        hex    filename
      0          0          0          0          0    exe/PIR_NEW.elf


Подозреваю ошибку в параметрах линкера, но вот что именно не так - хз.

Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
IgorKossak
Видимо в настройках CoIDE что-то осталось не перенесённым в новую среду. Какие-нибудь дефайны, например.
Это я так подозреваю, файлы не смотрел.
Croman13n3c
Поизучав map файл стало ясно, что он практически все секции исключил из бинарника

Код
Discarded input sections

.text          0x00000000        0x0 obj/main.o
.data          0x00000000        0x1 obj/main.o
.bss           0x00000000       0x14 obj/main.o
...........


Секция линкер скрипта относящаяся к rom
Код
    .text :
    {
        KEEP(*(.isr_vector .isr_vector.*))
        *(.text .text.* .gnu.linkonce.t.*)           
        *(.glue_7t) *(.glue_7)                        
        *(.rodata .rodata* .gnu.linkonce.r.*)                                  
    } > rom
    
    .ARM.extab :
    {
        *(.ARM.extab* .gnu.linkonce.armextab.*)
    } > rom
    
    __exidx_start = .;
    .ARM.exidx :
    {
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    } > rom
    __exidx_end = .;

    
    .conf : AT (0x28000)
        {
        . = ALIGN (4);
        _conf_begin = .;
        KEEP(*(.conf  .conf*))
        . = ALIGN(4);
        _conf_end = .;
        } >rom


Нажмите для просмотра прикрепленного файла
Сергей Борщ
QUOTE (Croman13n3c @ Dec 13 2012, 07:49) *
Поизучав map файл стало ясно, что он практически все секции исключил из бинарника
Покажите нам этот .map тоже. Можно сделать предположение, что причина в том, что все секции "тянутся" вслед за таблицей векторов, которая обязательно помещается в выходной файл директивой KEEP(*(.isr_vector .isr_vector.*)). А вот если в вашем проекте нет таблицы векторов или эта таблица в исходнике помещается не в секцию .isr_vector или .isr_vector.*
Croman13n3c
Таблица векторов есть и помещается в isr_vector:

Код
__attribute__ ((section(".isr_vector")))
void (* const g_pfnVectors[])(void) =
{    
  /*----------Core Exceptions------------------------------------------------ */
  (void *)&pulStack[STACK_SIZE-1],     /*!< The initial stack pointer         */
  Reset_Handler,             /*!< Reset Handler                               */
  NMI_Handler,               /*!< NMI Handler                                 */
  HardFault_Handler,         /*!< Hard Fault Handler                          */
  MemManage_Handler,         /*!< MPU Fault Handler                           */
  BusFault_Handler,          /*!< Bus Fault Handler                           */
  UsageFault_Handler,        /*!< Usage Fault Handler                         */
  0,0,0,0,                   /*!< Reserved                                    */
  SVC_Handler,               /*!< SVCall Handler                              */
  DebugMon_Handler,          /*!< Debug Monitor Handler                       */
  0,                         /*!< Reserved                                    */
  PendSV_Handler,            /*!< PendSV Handler                              */
  SysTick_Handler,           /*!< SysTick Handler                             */
  
  /*----------External Exceptions---------------------------------------------*/
  WDT_IRQHandler,            /*!<  0: Watchdog Timer                          */
  TIMER0_IRQHandler,         /*!<  1: Timer0                                  */
  TIMER1_IRQHandler,         /*!<  2: Timer1                                  */
  
...............
Сергей Борщ
QUOTE (Croman13n3c @ Dec 13 2012, 11:59) *
Таблица векторов есть и помещается в isr_vector:
Вы хотите потренировать наши способности к телепатии? Покажите .map Если она помещается в нужную секцию - почему ее нет в выходном файле? Возможно вы не подключили файл с этой таблицей к проекту, да и еще сотня причин.
Сергей Борщ
В map нет ни одного упоминания g_pfnVectors. В каком файле находится объявление этого массива? Компилируется ли этот файл? Передается ли его объектник линкеру?
mdmitry
Цитата(Сергей Борщ @ Dec 13 2012, 17:20) *
В map нет ни одного упоминания g_pfnVectors. В каком файле находится объявление этого массива? Компилируется ли этот файл? Передается ли его объектник линкеру?

А не является ли это куском startup-кода от CoIDE, который линкуется им по умолчанию (библиотека) и о котором gcc не знает ничего. (Аналогия с CodeSourcery, версии lite и коммерческая)
klen
похоже на то..... но какбы gcc принципиально никаких предположений не делает - какое ему дело до стартап кода и таблицы векторов - он их и вообще не различает одругого кода - зачем ему оно. это уже ты сам должен скомпилять все что нужно и передать ликуру - это твоя забота чтобы там была таблица векторов и твоя забота чтоб ее линуер использую тови указания в скрипте положил по нужному адресу.

я вот мотрю тоже пока ниче непонятно. если найду косяг отпишусь.

код Reset_Handler в студию
_Артём_
Может добавление такой строки
Код
ENTRY(Reset_Handler)

что-то изменит? Или она в другом файле?
Croman13n3c
Цитата(Сергей Борщ @ Dec 13 2012, 17:20) *
В map нет ни одного упоминания g_pfnVectors. В каком файле находится объявление этого массива? Компилируется ли этот файл? Передается ли его объектник линкеру?

Находится в startup_LPC17xx.c. Не компилировался и не передавался (упс, еще не собиралась lpc17xxlib), но после исправления лучше не стало - линкер сыплет ошибками
Нажмите для просмотра прикрепленного файла

Цитата(mdmitry @ Dec 13 2012, 18:08) *
А не является ли это куском startup-кода от CoIDE, который линкуется им по умолчанию (библиотека) и о котором gcc не знает ничего. (Аналогия с CodeSourcery, версии lite и коммерческая)

Является , после перадачи линкеру объектника - он сыплет ошибками (прикрепил отчет выше)

Цитата(klen @ Dec 13 2012, 21:56) *
похоже на то..... но какбы gcc принципиально никаких предположений не делает - какое ему дело до стартап кода и таблицы векторов - он их и вообще не различает одругого кода - зачем ему оно. это уже ты сам должен скомпилять все что нужно и передать ликуру - это твоя забота чтобы там была таблица векторов и твоя забота чтоб ее линуер использую тови указания в скрипте положил по нужному адресу.

я вот мотрю тоже пока ниче непонятно. если найду косяг отпишусь.

код Reset_Handler в студию


Код
#pragma weak Reset_Handler = Default_Reset_Handler

void Default_Reset_Handler(void)
{
  /* Initialize data and bss */
  unsigned long *pulSrc, *pulDest;

  /* Copy the data segment initializers from flash to SRAM */
  pulSrc = &_sidata;

  for(pulDest = &_sdata; pulDest < &_edata; )
  {
    *(pulDest++) = *(pulSrc++);
  }
  
  /* Zero fill the bss segment.  This is done with inline assembly since this
     will clear the value of pulDest if it is not kept in a register. */
  __asm("  ldr     r0, =_sbss\n"
        "  ldr     r1, =_ebss\n"
        "  mov     r2, #0\n"
        "  .thumb_func\n"
        "zero_loop:\n"
        "    cmp     r0, r1\n"
        "    it      lt\n"
        "    strlt   r2, [r0], #4\n"
        "    blt     zero_loop");


  __asm("  ldr     r0, =_sbss1\n"
          "  ldr     r1, =_ebss1\n"
          "  mov     r2, #0\n"
          "  .thumb_func\n"
          "zero_loop1:\n"
          "    cmp     r0, r1\n"
          "    it      lt\n"
          "    strlt   r2, [r0], #4\n"
          "    blt     zero_loop1");

  /* Setup the microcontroller system. */
  SystemInit();
    
  /* Call the application's entry point.*/
  main();
}


Цитата(_Артём_ @ Dec 13 2012, 23:09) *
Может добавление такой строки
Код
ENTRY(Reset_Handler)

что-то изменит? Или она в другом файле?


Не изменило, в файле startup_LPC17xx.c
Новый map после добавления добавления недостающих файлов:

Нажмите для просмотра прикрепленного файла

После последних исправлений добавил заглушки к newlib - сборка завершена успешно. Надо мне внимательней читать выхлоп средств сборки.
Спасибо за помощь.
Petka
Цитата(Croman13n3c @ Dec 14 2012, 09:24) *
....
Не изменило, в файле startup_LPC17xx.c
...

В моём случае всё стало добавляться линкером в выходной файл после добавления в скрипт линкера строки:
Код
ENTRY(g_pfnVectors);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.