Примечание: Ранее в этом ответе содержалось много разных способов сделать это, все с тем или иным ограничением. С тех пор я нашел то, что считаю идеальным решением, поэтому, чтобы уменьшить беспорядок, я удалил другие методы из последней версии ответа;Если вы хотите проверить другие методы, см. эту более раннюю версию . Хотя я чувствую, что метод, который я здесь оставил, является лучшим, вы можете также проверить другие, если один из них лучше соответствует вашим потребностям.
Некоторые из более ранних методов имелиограничение того, что ядро необходимо компилировать с включенными специальными параметрами конфигурации или отладочной информацией, а иногда это может быть невозможно по той или иной причине. Однако вместо этого вы можете скомпилировать модуль ядра с включенной отладочной информацией и извлечь из него информацию.
Makefile:
CC += -g
ifneq ($(KERNELRELEASE),)
obj-m := offsetof.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
make -C $(KERNELDIR) SUBDIRS=$(PWD) modules
endif
offsetof.c:
#include <linux/init.h>
#include <linux/module.h>
// The header where the struct you're interested in is defined
#include <linux/blkdev.h>
MODULE_LICENSE("GPL");
// Ensures that the struct we're interested in is included in the debug information
struct request myvar;
После запуска make
полученный модуль ядра будет содержать всю информацию о структуре, которая нам нужна. Чтобы извлечь эту информацию, вы можете использовать, например. pahole
из пакета dwarves
: pahole -C request offsetof.ko
Я также автоматизировал это (используя pyelftools
вместо pahole
, тем не менее) и установил его на github ,Использование: offsetof --kernel linux/blkdev.h "struct request"
Если ваше ядро уже содержит отладочную информацию, вы можете просто указать pahole
прямо на [несжатый] образ ядра (vmlinux) вместо компиляции модуля ядра. Если у вас есть только сжатый образ ядра (vmlinuz), вы можете использовать extract-vmlinux , который находится в каталоге scripts/
в исходном каталоге ядра.