2012-11-16 11 views
11

Ho una situazione interessante sul lavoro che sto cercando di trovare una buona soluzione per. Abbiamo un codice che gira su un metallo nudo MIPS multi-core (nessun kernel). Abbiamo l'obbligo di integrare alcuni codici di terze parti che devono essere aggiornati. Stavo pensando di compilare il codice di terze parti come PIC e quindi modificare il GOT per i simboli codice/dati quando scarico questo codice (ho il controllo su dove risiederà il codice). Inoltre, supponete che le interfacce nel codice di terze parti non vengano modificate, quindi non ci sono nuove voci PLT/GOT. Funzionerà ?. Quali altre cose dovrei considerare?Emulazione del caricatore dinamico per correggere gli offset delle librerie condivise

+1

diciamo, mentre penso che stia nuotando nella parte molto profonda di una domanda molto localizzata, semplicemente non riesco a convincermi a farlo cadere (e in effetti, invece, ho votato), poiché è semplicemente troppo dannatamente intrigante l'idea e la curiosità mi hanno conquistato (e apparentemente anche altri). In bocca al lupo! – WhozCraig

+0

@vamsi La domanda non mi è chiara. Intendi cambiare il GOT ogni volta che carichi una nuova versione di terze parti (aggiornamento)? Stai chiedendo come scrivere da solo un caricatore? – selalerer

+0

@selalerer Sì, intendevo cambiare il GOT ogni volta che carica una nuova versione di terze parti. Sì, in sostanza quello che finirò per avere è un caricatore leggero. Non voglio implementare un caricatore a pieno campo. Tutto quello che voglio fare è sistemare le tabelle GOT/PLT e ottenere il nuovo codice attivo. – vamsi

risposta

1

La risposta corretta è più lunga di "incorporare un linker/caricatore dinamico"? Il tuo problema sembra lo stesso risolto da ld.so e simili. Descrivere tutte le cose che un linker/loader dinamico deve considerare è l'argomento di libri come Linkers and Loaders di John Levine.

+1

Sto cercando qualcosa di più semplice della scrittura del mio caricatore incorporato. Ho letto il libro che hai menzionato sopra. Quando avrò finito di risolvere il mio problema, pubblicherò ciò che ho finito per fare. Grazie!. – vamsi

0

Le binutils Linux/Unix objcopy sarebbero quelle che state cercando. Supponendo che tu stia costruendo tutti i tuoi binari in una volta, invece di volerli caricare dinamicamente in runtime in ordine casuale [e non hai abbastanza memoria per diffonderli attraverso quella memoria], allora penso che funzionerebbe.

Ovviamente, se SOLO hai bisogno di sistemare il GOT, allora non vedo perché non puoi farlo solo - non è così difficile scrivere qualcosa che lo faccia. Ma objcopy è già stato scritto e può fare un po 'di binari/eseguibili "pasticciare" (l'ho usato per creare boot-rom per vari sistemi, incluse le ROM del BIOS per PC e simili) [Non che io sia venuto fuori con l'idea, più come se avessi preso il makefile di qualcuno, cosa che accadeva di avere objcopy al suo interno - ho solo guardato cosa ha fatto per capire come ha fatto la rom quando qualcosa stava andando storto in un punto o in un altro]

Problemi correlati