Jump to content

    

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

Recommended Posts

GenaSPB

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

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

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

 

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.

 

Edited by GenaSPB

Share this post


Link to post
Share on other sites

Aaron

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

Share this post


Link to post
Share on other sites

GenaSPB

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

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

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

 

 

 

Edited by GenaSPB

Share this post


Link to post
Share on other sites

Aaron

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

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

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

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

Share this post


Link to post
Share on other sites

__inline__

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

 

Вот кусок моего 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

@..........

 

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

 

Edited by __inline__

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.