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

gcc asm + ,space проблема

Нашел странный баг...

Резервировал место в асемблрном куске (стартапе) программы - а линкер не увидел... Хотя размер секции определил как ненулевой.

Что я делаю не так? Зеленым помечено то, что решило проблему.

 

photo_2020-09-07_21-18-47.jpg

photo_2020-09-07_20-29-50.jpg

Тулзы - сборка от ARM под windows.

arm-none-eabi-gcc --version
arm-none-eabi-gcc.exe (GNU Arm Embedded Toolchain 9-2020-q2-update) 9.3.1 20200408 (release)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

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

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


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

7 часов назад, GenaSPB сказал:

Нашел странный баг...

Вероятно, в компиляторе включена оптимизация...

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


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

в линкер файле секцию (без полезных) данных выделить ключевым словом KEEP(*(.noinit*)), иначе при оптимизации все "пустые" секции вырезаются.

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


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

Так она не пустая, размер есть...  0x03c0   байт... или keep к увеличению занятых адресов относится?

зы: совет не помог...

image.png.712d584dbf0a9b0be949ea84464ddaf8.png image.thumb.png.5e59dfac468182e47577f3e9eff4af0c.png

 

 

 

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

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


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

Что-то значит вы делаете не так.  Директива KEEP явно обязывает компилятор резервировать секцию в памяти, даже если в проекте ни один объект не ссылается на элементы из этой секции. Именно таким образом выделяются области памяти, которые могут потом хитрым образом использоваться в прошивке.

1) вы уверены, что линкер использует именно тот файл .ld, который вы правите? Проверьте, мб он тянет дефолтный ld из тулчейна.

2) может быть такое, что адрес начала секции .vram явно привязан к ссылке __bss_end__ ? в этом случае также будет наложение.

3) если п.1, п.2 в порядке, имеет смысл выложить сюда ваш ld файл.

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


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

Тоже сталкивался ранее с такой проблемой.  Особенно когда все оптимизации включены (компилятор и линковщик).

 

Вот кусок моего lds-файла:

 

START_ADDR = 0x40000000 ; /* Entry Point */

ROM_SIZE    =  1M ; /* Size of "Read-Only" Data  */
RAM_SIZE    =  2M ; /* Size of Static R/W Data   */
HEAP_SIZE   = 32M ; /* Heap Size                 */
STACK_SIZE  =  4M ; /* Stack Size                */

ROM_BASE    = START_ADDR              ;
RAM_BASE    = ROM_BASE   +  ROM_SIZE  ;
HEAP_BASE   = RAM_BASE   +  RAM_SIZE  ;
STACK_BASE  = HEAP_BASE  +  HEAP_SIZE ;

ENTRY(Vectors)

MEMORY
{
 ROM    (RX) : ORIGIN = ROM_BASE    , LENGTH =    ROM_SIZE
 RAM    (RW) : ORIGIN = RAM_BASE    , LENGTH =    RAM_SIZE
 HEAP   (RW) : ORIGIN = HEAP_BASE   , LENGTH =   HEAP_SIZE
 STACK  (RW) : ORIGIN = STACK_BASE  , LENGTH =  STACK_SIZE
}

SECTIONS
{

.vectors :
{
 KEEP(*(.vectors))
} > ROM

.text     : { *(.text)     } > ROM
.rodata   : { *(.rodata)   } > ROM
.data     : { *(.data)     } > ROM

//........

 

Вот сами объекты, которые надо защитить от вырезания (с метки Vectors ):

 

        .set  MODE_USR, 0x10            
        .set  MODE_FIQ, 0x11
        .set  MODE_IRQ, 0x12
        .set  MODE_SVC, 0x13
        .set  MODE_ABT, 0x17
        .set  MODE_UND, 0x1B
        .set  MODE_SYS, 0x1F            

        .equ  I_F_BIT, 0xC0               

        .set  UND_STACK_SIZE, 0x8
        .set  ABT_STACK_SIZE, 0x8
        .set  FIQ_STACK_SIZE, 0x8
        .set  IRQ_STACK_SIZE, 0x200000
        .set  SVC_STACK_SIZE, 0x8

	.global Vectors
        .global gic_irq_handler

	.section .vectors,"ax"
	.code 32

@ Start point

Vectors:

   ldr pc, ResetAddr    @ Reset                 
   ldr pc, UndefAddr    @ Undefined instruction 
   ldr pc, SWIAddr      @ Software interrupt    
   ldr pc, PAbortAddr   @ Prefetch abort        
   ldr pc, DAbortAddr   @ Data abort            
   ldr pc, ReservedAddr @ Reserved              
   ldr pc, IRQAddr      @ IRQ interrupt         
   ldr pc, FIQAddr      @ FIQ interrupt         

ResetAddr:     .word Reset_Handler
UndefAddr:     .word Undef_Handler
SWIAddr:       .word SWI_Handler
PAbortAddr:    .word PAbort_Handler
DAbortAddr:    .word DAbort_Handler
ReservedAddr:  .word 0
IRQAddr:       .word IRQ_Handler
FIQAddr:       .word FIQ_Handler
  
   .ltorg

   .section .init, "ax"
   .code 32

   .align 5
   
Reset_Handler:

@ Setup a stack for each mode

         LDR   r0, =_stack                     @ Read the stack address
         MSR   cpsr_c, #MODE_UND|I_F_BIT       @ switch to undef  mode
         MOV   sp,r0                           @ write the stack pointer
         SUB   r0, r0, #UND_STACK_SIZE         @ give stack space

@..........

 

Вроде всё на месте и дышит  как надо.  Проверял дизасмом.

 

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

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


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

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

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

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

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

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

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

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

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

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