definice externi konstanty v C

Pavel Troller patrol@sinus.cz
Úterý Prosinec 4 15:02:37 CET 2007


Zdravím,
  myslím, že to C umí... Viz můj následující příklad:
Aby to šlo zkompilovat, napsal jsem:


extern const unsigned char mask;
static char x = 0xaa;

char test (void) {

  x |= mask;

  return x;
}

Zkompiloval:
gcc -O99 -c test.c

Vypsal object:
objdump -d test.o

test.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <test>:
   0:   0f b6 05 00 00 00 00    movzbl 0x0(%rip),%eax        # 7 <test+0x7>
   7:   0a 05 00 00 00 00       or     0x0(%rip),%al        # d <test+0xd>
   d:   88 05 00 00 00 00       mov    %al,0x0(%rip)        # 13 <test+0x13>
  13:   0f be c0                movsbl %al,%eax
  16:   c3                      retq

Podle mého je tam přesně to, co chcete - první instrukce natahne proměnnou,
druhá orne tou konstantou (ty nuly doplní linker aktuální hodnotou), třetí
instrukce to vrátí zpátky...

S pozdravem Pavel Troller


> Spis to nedokazu dostatecne presne vysvetlit...
> 
> Kompilator zkompiluje kod a necha tam nevyplnene odkazy na externi 
> funkce a promenne. Ty pak vyplni linker.
> 
> Protoze potrebuju, aby linker doplnil i konstanty (v obj z asm zdrojaku 
> to je v pohode), musim je nejak nadefinovat v C zdrojaku, aby vedel, pro 
> jakou hodnotu ma v kompilovanem objektu nechat misto, jak ji pouzit...
> Po ruznych zkoumanich se priklanim k nazoru, ze toto v C asi udelat nejde...
> 
> Presto to zkusim jeste jednou vysvetlit:
> reg |= 0x10;
> vygeneruje cosi jako
> in a,(reg)
> or 0x10
> out (reg),a
> 
> Me zajima, jak prekladaci rict, ze hodnota 0x10 je definovana jinde a 
> aby ji vyplnil az linker...
> 
> 
> Hynek Sladky
> 
> 
> Miroslav Sinko wrote:
> > No tak asi nerozumiem... Protirecite si, lebo #define vam nevyhovuje z
> > dovodu, ze to nema spracovavat kompilator, ale az linker a teraz opat
> > pisete o kompilatore..
> > 
> > Napiste prosim, co si predstavujete pod pojmom "externe definovana
> > konstanta". Akoze kde definovana?
> > 
> > Napriek tomu, ze teraz celkom nerozumiem otazke, skusim este 1 tip. V
> > nastaveniach projektu (GUI, makefile... podla prostredia, v ktorom
> > programujete) sa spravidla da zadefinovat subor konstant platnych pre
> > projekt. Ale ono to nie je nic ine od toho, ako keby ste zapisali to
> > #define v headri, ktory je includovany vo vsetkych zdrojakoch projektu.
> > 
> > miro
> > 
> > 
> > --- Hynek Sladky <econf@centrum.cz> wrote:
> > 
> > 
> >>Jak uz jsem psal:
> >>
> >>extern unsigned char konst_maska;
> >>
> >>se pouzije jako odkaz na promennou, nikoli jako vlastni konstanta.
> >>Tj. provede se cosi jako
> >>ld e,(konst_maska)
> >>or e
> >>
> >>misto rovnou pouziti (cehoz bych chtel dosahnout):
> >>or konst_maska
> >>
> >>Otazka tedy zustava: jak rict kompilatoru, ze dany identifikator je 
> >>externe definovana konstanta (nikoli externe definovana konstantni 
> >>promenna)?
> > 
> > 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list