Модификация существующих объектов ELF
Я новичок в модификации ELF, так что для начала я хочу посмотреть, хорошо ли работает RDWR. Я на самом деле не делаю никаких обновлений к оригиналу.
int main(int argc, char *argv[]) {
size_t ehdrsz, phdrsz;
int fd;
Elf *e;
Elf32_Ehdr *ehdr; //to describe ELF header
if (argc != 2)
errx(EX_USAGE,"input... ./%s filename\n",argv[0]);
if (elf_version(EV_CURRENT) == EV_NONE)
errx(EX_SOFTWARE,"Invalid elf_version %s\n",elf_errmsg(-1));
if ((fd = open(argv[1], O_RDWR, 0777)) < 0)
errx(EX_OSERR, "open %s\n",elf_errmsg(-1));
if ((e = elf_begin(fd, ELF_C_RDWR, NULL)) == NULL)
errx(EX_SOFTWARE,"elf_begin %s\n",elf_errmsg(-1));
if ((ehdr = elf32_getehdr(e)) == NULL)
errx(EX_SOFTWARE,"elf32_newehdr %s\n",elf_errmsg(-1));
if ( elf_update (e, ELF_C_NULL ) < 0)
errx ( EXIT_FAILURE , " elf_update ( NULL ) failed : %s.", elf_errmsg ( -1));
if (elf_update(e, ELF_C_WRITE ) < 0 )
errx(EX_SOFTWARE,"elf32_update_2 %s\n",elf_errmsg(-1));
elf_end(e);
close(fd);
return 1;
}
gcc modifyELF.c -lelf -m32 -o modifyELF
./modifyELF helloELF
И оказалось, что helloELF больше не работает.
./helloELF
Ошибка сегментации (ядро сброшено)
При проверке с помощью readelf -h я вижу следующие различия между оригинальным и обновленным файлом helloELF.
original -> Начало заголовков разделов: 3592 (байт в файл)
обновлено -> Начало заголовков разделов: 5936 (байт в файл)
размеры тоже разные. Все просто.
оригинал -> 7136
обновлено -> 4792
1). Почему происходит ошибка сегментации? Что нужно сделать, чтобы заставить себя работать?
2). почему размеры разные даже без обновлений?