Jump to content

    

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

Стараюсь перенести проект из CoIDE в Eclipse Juno.

Заготовку makefile`а взял из scmrtos. Сами объектники компилируются, но не собираются в окончательный бинарник:

 

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

 

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

 

makefile.txt

LPC1756.ld.txt

Share this post


Link to post
Share on other sites

Видимо в настройках CoIDE что-то осталось не перенесённым в новую среду. Какие-нибудь дефайны, например.

Это я так подозреваю, файлы не смотрел.

Share this post


Link to post
Share on other sites

Поизучав 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

 

PIR_NEW.map.txt

Edited by Croman13n3c

Share this post


Link to post
Share on other sites
Поизучав map файл стало ясно, что он практически все секции исключил из бинарника
Покажите нам этот .map тоже. Можно сделать предположение, что причина в том, что все секции "тянутся" вслед за таблицей векторов, которая обязательно помещается в выходной файл директивой KEEP(*(.isr_vector .isr_vector.*)). А вот если в вашем проекте нет таблицы векторов или эта таблица в исходнике помещается не в секцию .isr_vector или .isr_vector.*

 

Share this post


Link to post
Share on other sites

Таблица векторов есть и помещается в 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                                  */
  
...............

Share this post


Link to post
Share on other sites
Таблица векторов есть и помещается в isr_vector:
Вы хотите потренировать наши способности к телепатии? Покажите .map Если она помещается в нужную секцию - почему ее нет в выходном файле? Возможно вы не подключили файл с этой таблицей к проекту, да и еще сотня причин.

Share this post


Link to post
Share on other sites

В map нет ни одного упоминания g_pfnVectors. В каком файле находится объявление этого массива? Компилируется ли этот файл? Передается ли его объектник линкеру?

Share this post


Link to post
Share on other sites
В map нет ни одного упоминания g_pfnVectors. В каком файле находится объявление этого массива? Компилируется ли этот файл? Передается ли его объектник линкеру?

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

Share this post


Link to post
Share on other sites

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

 

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

 

код Reset_Handler в студию

Share this post


Link to post
Share on other sites
В map нет ни одного упоминания g_pfnVectors. В каком файле находится объявление этого массива? Компилируется ли этот файл? Передается ли его объектник линкеру?

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

linker.txt

 

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

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

 

похоже на то..... но какбы 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();
}

 

Может добавление такой строки

ENTRY(Reset_Handler)

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

 

Не изменило, в файле startup_LPC17xx.c

Новый map после добавления добавления недостающих файлов:

 

PIR_NEW.map.txt

 

После последних исправлений добавил заглушки к newlib - сборка завершена успешно. Надо мне внимательней читать выхлоп средств сборки.

Спасибо за помощь.

Edited by Croman13n3c

Share this post


Link to post
Share on other sites
....

Не изменило, в файле startup_LPC17xx.c

...

В моём случае всё стало добавляться линкером в выходной файл после добавления в скрипт линкера строки:

ENTRY(g_pfnVectors);

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this