Добрый день, подскажите пожалуйста. Есть предполагаемые исходники файла и есть сам скомпилированный файл лет 10-14 назад. Можно ли собрать такой же бинарь из этих исходников, идентичный. К сожалению условия под которые собирался много лет назад бинарь плохо известны, возможно какой-то линукс на ядре 2.0.0 Это выдает команда
file ./our_binary_file
Собираю все на ядре 2.2.3, получается совершенно другой файл по размеру, хотя секция .text одинаковая по размеру.
При помощи objdump в «старом файле» нашел такие записи как init.c и initfini.c Предположительно все это собиралось на чем-то бинарно совместимым с red hat 5. Подскажите, как-нибудь можно установить опции компиляции с которыми был собран бинарь?
возможно какой-то линукс на ядре 2.0.0 Это выдает команда file ./our_binary_file
Собираю все на ядре 2.2.3,
От ядра, на котором собираешь, эта надпись вообще не зависит, она зависит от настроек тулчейна или может быть весрии glibc с которой собираешь. Традиционно получается так, что версия «совместимого ядра» лет на 10 старше версии ядра на котором компилировался бинарник. Например если компилировать в стандартном дебиане 11 то получаются файлы «для ядра 3.2.0», при том что в самом дебиане оно 5.10.
А так, тебе надо угадать: тип компилятора (скорее всего gcc но не факт), версию компилятора, опции компилятора, версию libc. Возможно, ещё что-то, но всё остальное влияет уже меньше.
Начни с команды ldd, её можно приблизительно узнать какой libc нужен (2.х который libc6 или 1.х который libc5 и меньше)
Версия компилятора одинаковая 2.95.4, опции компиляции предположительно тоже известны. Может ли из-за разных версий динамических библиотек получаться разный бинарный код? Т.к. objdump выдает, что тот файл который я собираю сейчас зависит от библиотек скомпилированных gcc 3.5.*. Судя по секции .note
Это все на работе и выносить нельзя ничего, в новом этой секции нет, а есть что-то вроде call_gmon_start и glibc_cxа_finalize. В остальном все схоже на вид. Честно говоря, я вообще в основном разбираюсь только в том, что идет после
int main(void)
как я понимаю все что до main это служебный код для инициализации среды и он зависит от glibc?
Сравни тогда дизассемблированный код функций, которые в исходнике есть. Если он почти совпадает - то стоит искать дальнейшую разницу в libc, если нет - то либо в компиляторе/опциях либо в самом исходнике.
Если программа небольшая, либо если потенциальных мест, где могло поменяться что-то критически важное, немного, то попробуй почитать дизассемблированный код и понять, соответствует ли асм исходникам.
А так, получается, что в твоём уравнении две неизвестные.
существенны восновном версии glibc и разделяемых библиотек и конечно платформа, а ядро больше если там драйвер. Смысла добиваться тех же флагов сборки впринципе нет.