Puede hacerlo con gdb
. A modo de ejemplo, voy a utilizar esta fuente:
struct A {
int a;
char b;
short c;
};
int main() {
struct A a;
}
Cargando el binario en gdb
:
(gdb) print (int)&((struct A*)0)->a
$1 = 0
(gdb) print (int)&((struct A*)0)->b
$2 = 4
(gdb) print (int)&((struct A*)0)->c
$3 = 6
ACTUALIZACIÓN:
Si tiene que hacerlo para un gran número de campos, entonces puede ser útil usar la nueva interfaz de python de GDB (necesitará una versión reciente de GDB para usarla, estoy usando 7.4). He creado offsets.py:
import gdb
class Offsets(gdb.Command):
def __init__(self):
super (Offsets, self).__init__ ('offsets-of', gdb.COMMAND_DATA)
def invoke(self, arg, from_tty):
argv = gdb.string_to_argv(arg)
if len(argv) != 1:
raise gdb.GdbError('offsets-of takes exactly 1 argument.')
stype = gdb.lookup_type(argv[0])
print argv[0], '{'
for field in stype.fields():
print ' %s => %d' % (field.name, field.bitpos//8)
print '}'
Offsets()
A continuación, puede añadir a su .gdbinit:
python
sys.path.insert(0, '/path/to/script/dir')
import offsets
end
Luego de usarlo en GDB, como:
(gdb) offsets-of "struct A"
struct A {
a => 0
b => 4
c => 6
}
Este script hace una pocas suposiciones simplificadoras, como que no se usan campos de bits, y no profundiza en estructuras anidadas, pero esos cambios son bastante sencillos si los necesita.
Probablemente me falta algo obvio aquí, pero si tiene una variable (digamos 'x') que se declara como una instancia de estructura (o un puntero a la estructura), entonces debería ser capaz de simplemente escribir' imprima x' (o 'print * x' si es un puntero) en gdb para volcar todos los miembros. –
No estoy tratando de obtener la dirección de lo que quiero descargar. Ya tengo el vertedero y necesito la dirección relativa de todos los miembros. – Akhneyzar