Forum: Compiler & IDEs Linker: vector section vor text section legen


von Dirk (Gast)


Lesenswert?

Hallo Leute,

ich möchte die Linkersektion .vectors vor die .text Sektion "packen". 
Die .text-Sektion soll also direkt hinter der .vectors Sektion beginnen.

Beide Sektionen werden vom Linker aber an Adresse 0x0 gelegt.


Mein Linkerskript link.ld:
1
ENTRY(_start)
2
3
MEMORY
4
{
5
  rom (rx) : ORIGIN = 0x0, LENGTH = 0x1A00
6
  ram (rwx) : ORIGIN = 0x1A00, LENGTH = 0x100000 - 0x1A00
7
}
8
9
SECTIONS
10
{
11
  .vectors :
12
  {
13
    *(.vectors )
14
  } > rom
15
16
  .text :
17
  {
18
    . = ALIGN(0x4);
19
    *(.text .text.*)
20
    _etext = .;
21
  } > rom
22
23
  .data :
24
  {
25
    . = ALIGN(0x4);
26
    *(.rodata .rodata.*)
27
    *(.data .data.*)
28
    _edata = .;
29
  } > rom
30
31
  .bss :
32
  {
33
    . = ALIGN(0x4);
34
    __bss_start = . ;
35
    *(.bss .bss.*)
36
    *(COMMON)
37
    __bss_end = ALIGN (0x4);
38
  } > ram
39
}

Die zu linkende Assemblerdatei gpio.s sieht so aus:
1
    .global _start
2
3
  .section .vectors
4
stack:    .4byte 0x2000
5
reset:    .4byte _start
6
7
  .text
8
.equ    GPIO_IN,  0x100000
9
.equ    GPIO_OUT, 0x100004
10
.equ    GPIO_OE,  0x100008
11
12
_start:
13
      move.l #0x0F, GPIO_OE
14
      move.l #0x0F, GPIO_OUT
15
      nop
16
17
loop:    jmp loop

Ich assembliere und linke folgendermaßen:
1
# m68k-elf-as gpio.s -o gpio.o
2
# m68k-elf-ld gpio.o -nostartfiles -T link.ld -o gpio
Ich verstehe nicht, warum die Sektionen .vectors und .text beide an 
Adresse 0x0 beginnen:
1
# m68k-elf-objdump -h gpio
2
3
gpio:     Dateiformat elf32-m68k
4
5
Sektionen:
6
Idx Name          Größe     VMA       LMA       Datei-Off Ausr.
7
  0 .vectors      00000008  00000000  00000000  00000090  2**0
8
                  CONTENTS, READONLY
9
  1 .text         0000001a  00000000  00000000  00000074  2**2
10
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
11
  2 .data         00000000  0000001c  0000001c  00000090  2**2
12
                  CONTENTS, ALLOC, LOAD, DATA
13
  3 .bss          00000004  00001a00  00001a00  00000090  2**2
14
                  ALLOC

Warum ist .vectors nicht vor .text sondern beide an Adresse 0?

Grüße,
Dirk

von Begeisterter (Gast)


Lesenswert?

Es gibt nur einen Prozessor - wir kennen ihn alle.
Es gibt nur einen Assembler - wir kennen ihn alle.
Es gibt nur einen Compiler - wir kennen ihn alle.
Es gibt nur einen Linker - wir kennen ihn alle.
Es gibt nur eine IDE und die ist natürlich von Microdings.

Daher sind weitere Angaben überflüssig.

von nicht"Gast" (Gast)


Lesenswert?

Moin,

tut mir leid, Beitragen kann ich dazu nichts.

Ich hätte aber mal ne wirklich interessierte Frage. Warum brauchst du 
das? (Ist keine Trollerei oder hinweis auf unnötigkeit. Ich möchte es 
wirklich wissen)

Grüße,

von hp-freund (Gast)


Lesenswert?

Dirk schrieb:
> SECTIONS
> {
>   .vectors :
>   {
>     *(.vectors )
>   } > rom

statt:
*(.vectors )

schreibe:
KEEP(*(.vectors))

http://stackoverflow.com/questions/9827157/what-does-keep-mean-in-a-linker-script#9830185

von Dirk (Gast)


Lesenswert?

Hallo!

nicht"Gast" schrieb:
> Ich hätte aber mal ne wirklich interessierte Frage. Warum brauchst du
> das? (Ist keine Trollerei oder hinweis auf unnötigkeit. Ich möchte es
> wirklich wissen)

Ich baue mir ein FPGA-m68k-System mit TG68 Softcore von OpenCores.org.

Eine erste Version ist hier auf Github: 
https://github.com/dirkmo/m68kfpga

Mit UART, Timer, SPI-Flash, SD-Karte + FatFS. Das ist für ein 
Xilinx-Spartan3-Starterkit-Board gedacht. Meinen Xilinx Programmer 
bekomme ich seit dem letzten Ubuntu-Update nicht mehr zum Laufen.

Da ich eh mit ein paar Sachen unzufrieden war, mache ich einen 
Projektneustart auf einem Altera Board (DE0-CV) und will den Wishbone 
Bus benutzen (hauptsächlich wegen der SD-Ram-Controller von OpenCores, 
die Wishbone benutzen).

Meine Linkerskripte funktionieren zwar, aber ich möchte der "Schönheit" 
wegen die Vektortabelle usw. nicht in der Text-Sektion haben.



hp-freund schrieb:
> Dirk schrieb:
>> SECTIONS
>> {
>>   .vectors :
>>   {
>>     *(.vectors )
>>   } > rom
>
> statt:
> *(.vectors )
>
> schreibe:
> KEEP(*(.vectors))
>
> http://stackoverflow.com/questions/9827157/what-do...

Danke für den Hinweis. KEEP hatte ich auch schon ausprobiert, löst mein 
Problem aber nicht: Die Vektoren werden vom Linker nicht entfernt, 
sondern  die .vector und .text Sektionen bekommen die gleiche Adresse. 
Mit oder ohne KEEP macht da keinen Unterschied.

Hier das Disassembly (mit KEEP):
1
# m68k-elf-objdump -D gpio
2
3
gpio:     Dateiformat elf32-m68k
4
5
6
Disassembly of section .vectors:
7
8
00000000 <stack>:
9
   0:  0000 2000        orib #0,%d0
10
11
00000004 <reset>:
12
   4:  0000 0000        orib #0,%d0
13
14
Disassembly of section .text:
15
16
00000000 <_start>:
17
   0:  23fc 0000 000f   movel #15,100008 <GPIO_OE>
18
   6:  0010 0008 
19
   a:  23fc 0000 000f   movel #15,100004 <GPIO_OUT>
20
  10:  0010 0004 
21
  14:  4e71             nop
22
23
00000016 <loop>:
24
  16:  4efa fffe        jmp %pc@(16 <loop>)
25
26
Disassembly of section .bss:
27
28
00001a00 <__bss_start>:
29
    1a00:  0000 0000        orib #0,%d0

Grüße,
Dirk

von hp-freund (Gast)


Lesenswert?

Na dann:
1
SECTIONS
2
{
3
  .text :
4
  {
5
    KEEP(*(.vectors))
6
    . = ALIGN(0x4);
7
    *(.text .text.*)
8
    _etext = .;
9
  } > rom

Evtl. noch ein ALIGN(0x4) davor, dann können die "vectors" nirgend wo 
anders hin ...

von Dirk (Gast)


Lesenswert?

hp-freund schrieb:
> Na dann:
> SECTIONS
> {
>   .text :
>   {
>     KEEP(*(.vectors))
>     . = ALIGN(0x4);
>     *(.text .text.*)
>     _etext = .;
>   } > rom
>
> Evtl. noch ein ALIGN(0x4) davor, dann können die "vectors" nirgend wo
> anders hin ...

Hallo hp-freund,

ich möchte die Vektoren nicht in der .text Sektion haben. Klar kann ich 
die in die .text Sektion legen, das mache ich auch bisher so und das 
funktioniert auch, aber es ist halt nicht schön.

Ich frage mich halt, warum das so nicht klappt. Mit der .data Sektion 
klappt es ja auch...

Grüße,
Dirk

von hp-freund (Gast)


Lesenswert?

Moin,

Dirk schrieb:
> Ich frage mich halt, warum das so nicht klappt. Mit der .data Sektion
> klappt es ja auch...

dann teile deiner .vectors section noch mit das sie zu Mindest 
allocatable ("a") sein soll. Also:
1
    .global _start
2
3
  .section .vectors
4
stack:    .4byte 0x2000
5
reset:    .4byte _start
6
7
  .text
8
...

wird zu:
1
    .global _start
2
3
  .section .vectors,"a"
4
stack:    .4byte 0x2000
5
reset:    .4byte _start
6
7
  .text
8
...

von hp-freund (Gast)


Lesenswert?

Bin mir jetzt nicht sicher ob zum Aufruf von _start auch noch executable 
("x") gesetzt sein muss. Also wenn es nicht funktioniert setze an Stelle 
von:
1
  .section .vectors,"a"
1
  .section .vectors,"ax"

von Dieter Graef (Gast)


Lesenswert?

Dirk schrieb:
> .vectors :
>   {
>     *(.vectors )
>   } > rom
>
>   .text :
>   {
>     . = ALIGN(0x4);
>     *(.text .text.*)
>     _etext = .;
>   } > rom

probier dann doch mal

   .text :
   {
     *(.vectors )
     . = ALIGN(0x4);
     *(.text .text.*)
     _etext = .;
   } > rom

m.f.G.
Dieter

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Also ich persönlich mag ja die "} > rom" Schreibweise nicht, genau wegen 
sowas ;)

Ich sag dem Linker lieber explizit wo er das hinzupacken hat.
1
SECTIONS
2
{
3
  . = <DEINE_ROM_STARTADRESSE>;
4
  vectors : {
5
    *(.vectors )
6
  }
7
  
8
  . = ALIGN(0x4);
9
  .text : {
10
    *(.text .text.*)
11
    _etext = .;
12
  }
13
14
}

Wenn er jetz imemrnoch Mist baut, kannste ihn Explizit zwingen den text 
an einer anderen Adresse zu platzieren.
Dazu mehr wenn dieser Ansatz in die Hose geht.

edit:
Willste .data wirklich nur im ROM haben ohne es fürs RAM zu linken und 
dann vom ROM ins RAM zu kopieren?

: Bearbeitet durch User
von hp-freund (Gast)


Lesenswert?

Ich habe die Variante mit linux gcc getestet:

gpio.s:
1
...
2
.section .vectors,"ax"
3
...

Damit passt alles.

von Dirk (Gast)


Lesenswert?

Danke für Eure Antworten und deine Mühe hp-freund!

Habe jetzt für ein paar Tage keinen Zugang zu meinem Rechner und kann es 
nicht ausprobieren.
Melde mich dann nochmal, ob es klappt.

Grüße,
Dirk

von Dirk (Gast)


Lesenswert?

Hallo!

hp-freund schrieb:
> Ich habe die Variante mit linux gcc getestet:
>
> gpio.s:...
> .section .vectors,"ax"
> ...
>
> Damit passt alles.

Damit klappt es! Vielen Dank, hp-freund.

Das "x" Flag kann man noch weglassen, mit
1
.section .vectors,"a"
funktioniert es auch.

Aus der Dokumentation über die .section-Flags:
https://sourceware.org/binutils/docs/as/Section.html#Section
1
a  section is allocatable
2
x  section is executable

Grüße,
Dirk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.