vmlinux ELF encontrar compensações para os membros de uma dada estrutura
Pergunta
No kernel Linux, eu preciso encontrar os deslocamentos de variáveis ??de membro de um struct que é usado. Por exemplo, para o init_task que é do tipo task_struct, eu gostaria que os deslocamentos de seu pid e tarefas.
Eu só tenho a vmlinux presente para isso. I pode se referir ao código do kernel de código aberto, mas pode ser diferente do de construção que eu tenho.
É possível obter os deslocamentos sem a fonte?
EDIT:. O vmlinux é para ARM, e eu nem sempre pode ser capaz de executar código C no dispositivo de destino
Solução
O tamanho eo layout das estruturas está presente na informação de depuração dos arquivos de objeto compilados (se você compilar com -g
e não fazer strip
).
pahole ( aka "poke-a-buraco", empacotado como dev-util/dwarves
no Gentoo) lê informações de depuração do anão de um objeto para enviar informações sobre "buracos" nas estruturas -. que pode ser um bom ponto de partida para você
Outras dicas
6,47 offsetof
implementos CCG para C e C ++ uma extensão sintática para implementar o offsetof macro.
primary:
"__builtin_offsetof" "(" typename "," offsetof_member_designator ")"
offsetof_member_designator:
identifier
| offsetof_member_designator "." identifier
| offsetof_member_designator "[" expr "]"
Esta extensão é suficiente para que
#define offsetof(type, member) __builtin_offsetof (type, member)
é uma definição adequada do offsetof macro. Em C ++, tipo pode ser dependente. Em ambos os casos, o membro pode ser constituída por um único identificador, ou uma sequência de acessos membro e referências de matriz.
encontrou outra solução com o braço-EABI-gdb -. Eu posso fazer impressão e init_task e imprimir & init_task.pid ea diferença é o deslocamento