La pizzeria di Christian
113 subscribers
1.49K photos
3 videos
22 files
515 links
Canale pubblico dove scrivo come perdo tempo
@sigma_hub
Download Telegram
like chi lo ha settato
trovatemi 1 app con questo a 1
La pizzeria di Christian
hmmmmmm che strano
Cosa è sta roba?
Sto cercando di aggiugnere a llvm-link (lld di LLVM per PE/COFF) il supporto ai Import library (.lib) in formato "Long format". Attualmente LLD supporta solo il short format in uso da MSVC 6.0+.
Il mio discorso è riuscire a caricare i file da MSVC 4.0 e linkare correttamente con LLD.
Quindi io ho uno shared object creato con MSVC 4.0 e una import library che devo linkare con un eseguibile compilato con clang 22.
Quali sono le complicazioni?
A quanto pare LLVM quando legge la Import library in short format fa le seguenti cose:
1. Crea un simbolo specificato denominato per indicare che questo simbolo verrà importato da una DLL (__imp_ + simbolo)
2. Nel caso di Aarch64 crea un simbolo ausiliario nella import table, non so specificamente cosa sia il simbolo ausiliario (__imp_aux_) ma è poco rilevante perchè MSVC 4.0 non esiste per Aarch64.
3. Se stiamo parlando di un riferimento ad un codice, serve un piccolo pezzettino di assembly (denominato import thunk) che nel codice (in riferimento al simbolo creato al punto 1) ci fa saltellare effettivamente all'interno della DLL per chiamare questo simbolo.
Ovviamente se prendiamo ad esempio (asm x86)
0xff 0x25 0x00 0x00 0x00 0x00 (JMP *0x00)
che è un import thunk questo pezzo qua verrà risolto durante il loader del sistema operativo con le relocations e la import table (IAT)
1
La pizzeria di Christian
Cosa è sta roba? Sto cercando di aggiugnere a llvm-link (lld di LLVM per PE/COFF) il supporto ai Import library (.lib) in formato "Long format". Attualmente LLD supporta solo il short format in uso da MSVC 6.0+. Il mio discorso è riuscire a caricare i file…
Tutto questo non funziona se siamo nel caso del long format perché i simboli "__imp_" sono già stati precedentemente aggiunti dal compilatore e non esiste la import table specifica dello short format, quindi quello da capire è come far capire a LLVM che relocation e che import table sparare per i simboli specifici, teoricamente dovrebbe già esserci il thunk ?
1
simbolo nel eseguibile normale —>
qui c'è già l'__imp_ su MSVC 4.0
qui c'è la funzione che salta all'__imp_
questo è COMDAT quindi non verrà usato nel binario finale quindi penso sia solo stub
potrebbe anche essere cosi perchè li ci sarebbe in realtà in quel dd offset unk_10 dovrebbe esserci il jmp assoluto alla DLL
hmm io facevo tutto questo ma mi chiedo se non abbia in realtà molto più senso fare in altro modo
piuttosto che ciclare tutti i simboli durante la creazione dell'import table avrebbe più senso capire questi simboli durante la lettura dei simboli e associarli a modo
tipo sto pezzo è ew onestamente
la cosa sus è che questo ha solo come input "ImportFile" :(
ti odio arm
sto iniziando a capire incredibile
Che palle volevo andare a vedere Richard Stallman a Cesena ma, come al solito, il l**oro mi ha cuckato 😭😭😭
Assoluto cinema
LLVM ricarica la stessa .lib N volte per ogni simbolo
intelligenza di qualche ora fa

union X { Classe1 *a; Classe2 *b; }

if (X.a != nullptr) ? X.a.qualcosa() : X.b.qualcosa()

🤯 mi sento cosi intelligente
ma come mi è venuto in mente di fare questo modo per controllare il puntatore che droghe ho fumato
caso normale:
DLL Short: OK