Toon posts:

[C++/ELF] klein zetje nodig, waar beginnen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor een project wil ik gebruik maken van code van derden. Die code draait normaal op een embedded powerpc architectuur.

Van de leverancier heb ik een hele trits bestanden gekregen, waaronder een aantal ELF binaries.

Die elf binaries zijn 'relocatable' binaries.

Ik heb veel gelezen over elf, begrijp de file structuur nu, kan het ook inlezen, enz, maar wat ik nog steeds niet zie.. is hoe ik nu dat bestand in de praktijk ga gebruiken.

Voorbeeld.. als ik bv. elfread doe zie ik:
code:
1
 [ 1] .romP1            PROGBITS        00000000 000058 285878 00 WAX  0   0 16


Ik maak daaruit op dat er een stuk executable code inzit. Hoe ga ik nu die code daadwerkelijk uitvoeren?

Ik begrijp dat het een hele basale vraag is, als iemand een site heeft waar een goede tutorial op staat MET PRAKTIJKVOORBEELDEN dan hou ik mij aanbevolen. Alles wat ik er nu over kan vinden is de eeuwige beschrijving van een elf file, wat de structuur ervan is, hoe je het ding kunt uitlezen.. maar gebruiken heb ik nog geen enkel voorbeeld over kunnen vinden..

Voordat we daar discussie over krijgen, dat het een powerpc binary is, is even niet van belang. Dat probleem heb ik al getackled.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:37

Creepy

Tactical Espionage Splatterer

Eeh... .is er een reden waarom je die binary niet direct kan uitvoeren?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik weet vrij weinig van ELF, maar ik zou zeggen: binary inladen, adressen relocaten adhv het ingeladen base adres, en dan een call doen naar de entry point van de binary.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Creepy schreef op zondag 08 februari 2009 @ 14:31:
Eeh... .is er een reden waarom je die binary niet direct kan uitvoeren?
Ja.. het is geen executable, maar een relocatable binary. Rechtstreeks uitvoeren, doet niets, behalve een foutmelding geven :P

@.Oisyn: idd, dat lijkt mij ook, alleen mis ik dus even een zetje om dat te realiseren. Als iemand een werkend voorbeeld heeft, mag 'hello world' zijn..

[ Voor 24% gewijzigd door Verwijderd op 08-02-2009 15:14 ]


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

wat dacht je van de source of all sources eens te bekijken:
http://git.kernel.org/?p=...d62226a6095524ad3;hb=HEAD

De elf-loader in de linux kernel.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Daar ben ik nu mee bezig, maar ik vind het een beetje een advies als 'oh jij wilt wat basiskennis van vliegtuigen, schroef eens een spaceshuttle uit elkaar ;)

Heel even snel doorgenomen, maar dat is een loader voor binary executables.. niet voor een relocatable iets.. of snap ik niet wat er aan de hand is? :P

Ik was in de veronderstelling dat zo'n relocatable iets was als een .dll in windows, meer een library dan een rechtstreeks uitvoerbaar iets?

Kijk, dit bedoel ik:
Relocatable file: an object file that holds code and data suitable for linking with other object files to create an executable or a shared object file. In other word, you can say that relocatable file is a foundation for creating executables and libraries.
Mijn bestand bevat dus code en data wat je kunt gebruiken in je applicatie.. maar het is dus niet rechstreeks als binary uitvoerbaar.. ik zoek dus voorbeelden van hoe code uit een elf relocatable binary is gebruikt in 'normale sourcecode'..

[ Voor 85% gewijzigd door Verwijderd op 08-02-2009 16:28 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:37

Creepy

Tactical Espionage Splatterer

Als ik http://knol.google.com/k/...ct-files/1ohwel4gqkcn2/3# bekijk dan kan o.a. Linux prima een relocatable ELF uitvoeren?Hmm, nee, dat is om een ELF relocatable executable te maken....
Als ik http://blog.csdn.net/hots...e/2008/08/27/2835746.aspx bekijk dan zul je een relocatable binary nog moeten linken met andere object files om er een executable van te kunnen maken.

[ Voor 46% gewijzigd door Creepy op 08-02-2009 16:41 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Yep, zo ver was ik ook, creepy, maar van dat mechanisme kan ik dus geen voorbeelden vinden.. ik kan wel voorbeelden vinden van het maken van zo'n relocatable executable, maar neits over het daadwerkelijk gebruiken hiervan. Dat verbaast mij hogelijk, daar .ELF toch de standaard is op linux tegenwoordig.. kennelijk is het ofwel zo basaal of juist zo complex, dat er niets over te vinden is.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Voglens mij kun je elfs gewoon runnen vanuit linux. Wat dat betreft is het ook niet raar dat er veel info over is - waarom zou je überuaupt zelf al die relocatie willen doen?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nogmaals, dit is dus geen uitvoerbare binary, maar een relocatable. Vergelijk het met een .dll in windows. Je kunt 'm dus niet uitvoeren.

Er is bakken vol info te vinden over het gebruiken van een dll, maar niets over een relocatable elf.

Ik wil niet perse een relocatie doen, dat boeit mij niet zoveel. Ik wil voornamelijk 'gebruik' kunnen maken van de spullen die in die relocatable zitten, dat is alles.

Zoals ik boven al zei:
Relocatable file: an object file that holds code and data suitable for linking with other object files to create an executable or a shared object file. In other word, you can say that relocatable file is a foundation for creating executables and libraries.
ik wil dus de code en data in de .elf relocatable linken in mijn eigen project en gebruiken..

[ Voor 32% gewijzigd door Verwijderd op 08-02-2009 17:20 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kun je er niet gewoon een .so van maken, of direct met dl() laden vanuit je applicatie?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
.so van maken: helaas, nee. Het is eigenlijk al een .so achtig iets dus..

met dl() laden.. ga ik nu onderzoeken.. dat bedoelde ik met klein zetje, zulke tips :)

[ Voor 16% gewijzigd door Verwijderd op 08-02-2009 17:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

http://www.atnf.csiro.au/.../user_guide/Building.html
N.a.v. de bovenstaande link krijg ik de indruk dat je er shared libraries van moet maken. Een paragraafje onder 6.3:
To build a dynamic (shared) library, you must create relocatable object files by compiling each object with the -Kpic or -KPIC option of CC. You can then build a dynamic library with these relocatable object files. If you get any bizarre link failures, you might have forgotten to compile some objects with -Kpic or -KPIC.
edit:
maar als je zelf al aangeeft dat dat niet de bedoeling is dan heb ik niks gezegd ;)

[ Voor 8% gewijzigd door Verwijderd op 08-02-2009 17:39 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nou, niet te snel gaan, ik weet het niet.. ga weer lezen ;)

Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Is het niet het idee dat headers beschrijven hoe de ELF file geinterpreteerd moet worden tijdens het linken?

Kun je niet beter de headers opvragen bij de leverancier? Of is het de bedoeling dat je de headers zelf gaat ontcijferen?

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De headers zitten al in de file zelf he..

Acties:
  • 0 Henk 'm!

Verwijderd

Na wat gepruts blijkt het dat je die relocatable files gewoon mee kan geven aan de command line van gcc.
Zo dus:
g++ -o main main.cpp hoi.o

Waar hoi.o je relocatable object is. Alleen heb je dan nog steeds een header file nodig om de symbolen in hoi.o te gebruiken in main.cpp....

Om zelf een relocatable object te maken link je met -r:
g++ -c -o intermediate/hoi.o hoi.cpp
ld -r -o hoi.o intermediate/hoi.o

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb wel een .elf.map, maar geen headers, en meer dan ik heb, ga ik niet krijgen, dit zou ook voldoende moeten zijn.. de dlopen() functie werkt ook overigens. Zal het verschil zijn tussen runtime of compiletime linken..

Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Enige oplossing lijkt me om zelf de prototypes te gaan definieren en hopen dat het niet afwijkt. :)

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok.. nu het volgende. Ik heb eerst dlopen geprobeerd. Ik kan dan compilen maar krijg een segmentation fault bij uitvoer, zonder verder bijster nuttige info.

Dan.. de optie van het bestand opgeven bij compilen. Dat werkt. Nu krijg ik allemaal meldingen als, bv:

code:
1
2
inputfile.elf: In function `functionname(void)':
: undefined reference to `somefunction'


Dat kan kloppen.. die somefunction zit ergens anders, waar ik de header file wel van heb. Alleen.. hoe vertel ik dat nu de comiler/linker? Gewoon include in het bestand wat ik uiteindelijk compile, 'does not do the trick'..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou ik heb genoeg zetje gehad.. ik ben er helemaal uit :)

De binary die ik heb, bevat functionele code, maar niet basisfuncties. Ik kan er niet teveel over uitwijden, maar dit draait op een ander hardwareplatform waarin je bepaalde bussen hebt etc.

Ze hebben de aansturing van die bussen etc weggelaten uit de binary, zeg maar de arbitraire en hardwaregebonden functies.

Als ik nu zelf een library maak waarin die functies zitten, en dan die ook meegeef bij het compilen, dan kom ik al een stuk verder :)
Pagina: 1