Доброго ВС!
Файл first.c
#include <stdio.h>
void firsh(void)
{
printf("First function...\n");
}
main.c
int
main(int argc, char **argv)
{
firsh();
}
./a.out Выводит First function...
Теперь я изменяю first.c (название функции firsh стало first)
#include <stdio.h>
void first(void)
{
printf("First function...\n");
}
Тоесть в директории у меня находятся файлы
libfirst.so
libfirsh.so
a.out
main.c
first.c
Затем открываю hexEditor и меняю в файле libfirst.so названия first на firsh (их будет 2: symtab и dynsym). Пытаюсь выполнить
#./a.out
./a.out: symbol lookup error: ./a.out: undefined symbol: firsh
Ок смотрим, чем отличаются libfirst.so и libfirsh.so: 1) ID сборки по адресу 0x472 2) 512,514,548 байты
От ID сборки результат выполнения никак не зависит. Методом тыка определяю, что за работоспособность программы отвечают 512 и 548 байты: У меня в libfirsh.so было 0x512=0x8A 0x548=0x81
libfirst.so: 0x512=0x88 0x548=0x8D
После изменения даных байтов в libfirst.so на те, что находятся в libfirsh.so
# ./a.out
First function...
Вопрос в том, что это такое, как их вычислить, и поправить при подобных манипуляциях.