Sida 1 av 1

GCC fråga angående bygga ett API

Postat: 21 oktober 2011, 09:11:02
av Micke_s
Jag ska försöka beskriva vad jag menar och vad jag vill göra.
Går det i gcc att skapa en jump table som pekar på diverse funktioner, jag vill bygga ett API som man kan anropa.
Användningsområdet kan t.ex. vara att man vill göra ett api tillgängligt för en användare utan att den kan se läsa av hur funktionerna fungerar.

Ett exempel är atmel:s flip där man kan använda flash funktioner i bootloadern från mainprogrammet http://www.atmel.com/dyn/resources/prod ... oc7618.pdf ,
fast där är det skrivet i assembler.

Flip är en bootloader med några funktioner ("entry point") man kan anrop från sin applikation , dessa ligger alltid på samma address.

Re: gcc fråga angående bygga ett api

Postat: 21 oktober 2011, 09:28:22
av twse
Varför inte bara exportera symbolerna så kan funktionerna anropas direkt? Om du bygger en .so så kan en binär ladda in den och slå upp symbolerna med dlsym(). Vad är det för typ av binär du ska bygga?

Re: gcc fråga angående bygga ett api

Postat: 21 oktober 2011, 10:17:41
av johano
Kika på bibliotek (libraries).
Här är en tutorial i ämnet efter en enkel googling på "gcc create lib":

http://www.crasseux.com/books/ctutorial ... brary.html

/johan

Re: gcc fråga angående bygga ett api

Postat: 21 oktober 2011, 10:30:28
av sodjan
Aktuell plattform är ju avgörande. Det verkar vara AVR (?).
Och då är väl knappast (?) saker som dynamisk laddning och dlsym() aktuella ?

Svaret på ursprungsfrågan är ja, allt detta fixar länkaren med automatik
och det är mycket standardiserad hantering och inget man behöver "skapa".

Jag utgår från att utv-miljön kring AVR kan hantera separatkompilering och
länkning mot obj eller lib filer.

Re: gcc fråga angående bygga ett api

Postat: 21 oktober 2011, 11:52:13
av Micke_s
Jo, det är avr eller stm32 som gäller.
Problemet jag ser med länka in objektfiler är när man behöver fixa saker i det fasta, då kan addresser flyttas runt och jag vill att api:et är kompatibelt över olika versioner.
Kanske enklast att kasta in en sektion i linker scriptet och ha en jump table i assembler.

Re: gcc fråga angående bygga ett api

Postat: 21 oktober 2011, 12:02:10
av sodjan
Det "fasta" vadå?
Länkningen sker till de aktuella adresserna just i den
obj eller lib som man länkar imot. Ändrar man i obj/lib så
länkar man bara om. Inga adresser är "fasta"...

Beskriv lite tydligare vilket problem du ser.

Re: GCC fråga angående bygga ett API

Postat: 21 oktober 2011, 14:28:23
av Micke_s
Problemen uppstår om jag skulle göra en custom bootloader med vissa extrafunktioner som 3:e part kan använda. Uppdaterar jag bootloadern så vill jag inte behöva att 3:e part behöver uppdatera sin del.

Re: GCC fråga angående bygga ett API

Postat: 21 oktober 2011, 14:45:09
av sodjan
OK.
Då kan du lägga en fast "jump-table" på dokumenterade adresser som
hoppar till de egentliga rutinerna. De fasta adresserna (och startadressen
till tabellen) behöver du inte ändra. Eller i alla fall försöka att inte ändra...

Re: GCC fråga angående bygga ett API

Postat: 21 oktober 2011, 14:51:34
av Micke_s
precis så tänkte jag, bara frågan om det går att göra i rätt så ren gcc c kod eller om lite assembler måste vara inblandad.

Edit: tror jag hittade något intressant http://stackoverflow.com/questions/5619 ... pplication

Re: GCC fråga angående bygga ett API

Postat: 21 oktober 2011, 15:34:56
av sodjan
Det som man måste ha tillgång till oavsett språk är en
mekanism för att ange en specific adress för en rutin.
Det borde finnas några pragma eller likande i C också.

Något i stil med

Kod: Markera allt

int funk1_public (param1 int, param2, int) <adress>
{
  return funk1_internal (param1, param2);
}

sedan någon annanstans i koden :

int funk1_internal (param1 int, param2, int)
{
  ...
  ...
  All kod som behövs för funk1
  return whatever...
}
D.v.s att funk1_public är låst till en specific adress medans
funk1_internal kan ligga var som helst. Det som behövs är
en mekanism för att lägga en funktion på en fast adress.

Re: GCC fråga angående bygga ett API

Postat: 21 oktober 2011, 16:11:50
av Micke_s
jo, det finns det.
__attribute__((section(".blabla"))) kan läggas till en tabell, funktion mm. sedan måste .blabla defineras i linkern.
Länken jag hittade löste det jag försökte hitta.

Re: GCC fråga angående bygga ett API

Postat: 21 oktober 2011, 19:49:37
av Icecap
I "lite större" mikroprocessorer finns det ofta mjukvaru-interrupt, just till dessa funktioner.

Re: GCC fråga angående bygga ett API

Postat: 21 oktober 2011, 20:49:54
av Micke_s
Jo, det stämmer nog. I stm32 finns det user mode och kernel mode (om jag minns rätt) där man har ett interrrupt för detta. Avr 8 bit har ej det