Перейти к содержанию
    

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

Стараюсь перенести проект из 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Croman13n3c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

код Reset_Handler в студию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

ENTRY(Reset_Handler)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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 - сборка завершена успешно. Надо мне внимательней читать выхлоп средств сборки.

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

Изменено пользователем Croman13n3c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

....

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

...

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

ENTRY(g_pfnVectors);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...