74 lines
2.3 KiB
Awk
Executable File
74 lines
2.3 KiB
Awk
Executable File
# On utilise désormais objdump -s pour se faciliter la vie
|
||
# Contenu de la section .text :
|
||
# 1000 930f0000 930f7000 930fc0ff 93004000 ......p.......@.
|
||
# 1010 938f0000 938f3000 938fd0ff 1301c0ff ......0.........
|
||
# 1020 930f3100 930fd1ff 9301f07f 938f1100 ..1.............
|
||
# 1030 13020080 930ff2ff 13030001 930f0301 ................
|
||
# 1040 930300ff 938f03ff 37040080 1304f4ff ........7.......
|
||
# 1050 930f1400 9304f0ff 938f1400 938f2403 ..............$.
|
||
# 1060 eff05ffa .._.
|
||
# Contenu de la section .data :
|
||
# 1064 78563412 cacaefbe adde0000 00000000 xV4.............
|
||
# 1074 00000000 0000 ......
|
||
|
||
function swapbytes(drow) {
|
||
return substr(drow, 7, 2) substr(drow, 5, 2) substr(drow, 3, 2) substr(drow, 1, 2)
|
||
}
|
||
|
||
function writemem(addr, section) {
|
||
printf("@%08x\n", addr) # Adresse formatée
|
||
# On a aligné sur un multiple de 8, let's go
|
||
for (i = 1; i < length(section); i += 8) {
|
||
print(substr(section, i, 8));
|
||
}
|
||
print "deadc0de" # Balise de fin de section (constante)
|
||
}
|
||
|
||
# Ligne donnant l'info de la section
|
||
# Toujours trouvée avant le reste
|
||
/^Contenu|^Contents/ {
|
||
if (content) {
|
||
writemem(start_addr, content)
|
||
}
|
||
# En toute logique on pourrait mettre là le nom de section, mais
|
||
# ça dépend de la locale, donc pour l'instant on laisse tomber
|
||
section = 1
|
||
content = ""
|
||
}
|
||
|
||
/^\s*[0-9a-f]+/ {
|
||
if (section) {
|
||
addr = strtonum("0x" $1)
|
||
start_addr = strtonum("0x" $1) / 4
|
||
if (addr != start_addr * 4) {
|
||
print("Début de section non alignée : "addr) > "/dev/stderr"
|
||
exit
|
||
}
|
||
section = 0;
|
||
}
|
||
|
||
for (i = 2; i <= NR; i++) {
|
||
v = $i
|
||
if (v ~ /[0-9a-f]{2,8}/) {
|
||
# Le dernier nombre peut avoir une taille 2, 4, 6, 8
|
||
if (length(v) == 6) {
|
||
v = v "00"
|
||
} else if (length($i) == 4) {
|
||
v = v "0000"
|
||
} else if (length($i) == 2) {
|
||
v = v "000000"
|
||
} else if (length($i) != 8) {
|
||
# Pour la partie avec les '.'
|
||
continue;
|
||
}
|
||
content = content swapbytes(v)
|
||
}
|
||
}
|
||
}
|
||
|
||
END {
|
||
if (content) {
|
||
writemem(start_addr, content)
|
||
}
|
||
}
|