LINUX.ORG.RU

Собрать бинарь из исходников под старый линукс

 


0

2

Добрый день, подскажите пожалуйста. Есть предполагаемые исходники файла и есть сам скомпилированный файл лет 10-14 назад. Можно ли собрать такой же бинарь из этих исходников, идентичный. К сожалению условия под которые собирался много лет назад бинарь плохо известны, возможно какой-то линукс на ядре 2.0.0 Это выдает команда

file ./our_binary_file
Собираю все на ядре 2.2.3, получается совершенно другой файл по размеру, хотя секция .text одинаковая по размеру. При помощи objdump в «старом файле» нашел такие записи как init.c и initfini.c Предположительно все это собиралось на чем-то бинарно совместимым с red hat 5. Подскажите, как-нибудь можно установить опции компиляции с которыми был собран бинарь?


В бинаре могут быть записаны версии библиотек и компилятора.

$ ldd our_binary_file
$ strings our_binary_file   # или objdump -s our_binary_file

Современные компиляторы, если прога собирается с дебагом, записывают в секцию .debug_str все флаги.

А какой смысл собирать бинарь 1 в 1? Для чего это может быть нужно?

anonymous
()

возможно какой-то линукс на ядре 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 и меньше)

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Версия компилятора одинаковая 2.95.4, опции компиляции предположительно тоже известны. Может ли из-за разных версий динамических библиотек получаться разный бинарный код? Т.к. objdump выдает, что тот файл который я собираю сейчас зависит от библиотек скомпилированных gcc 3.5.*. Судя по секции .note

da17
() автор топика
Последнее исправление: da17 (всего исправлений: 1)
Ответ на: комментарий от firkax

Это все на работе и выносить нельзя ничего, в новом этой секции нет, а есть что-то вроде call_gmon_start и glibc_cxа_finalize. В остальном все схоже на вид. Честно говоря, я вообще в основном разбираюсь только в том, что идет после

int main(void)

как я понимаю все что до main это служебный код для инициализации среды и он зависит от glibc?

da17
() автор топика
Последнее исправление: da17 (всего исправлений: 3)
Ответ на: комментарий от da17

Сравни тогда дизассемблированный код функций, которые в исходнике есть. Если он почти совпадает - то стоит искать дальнейшую разницу в libc, если нет - то либо в компиляторе/опциях либо в самом исходнике.

firkax ★★★★★
()
Ответ на: комментарий от da17

Если программа небольшая, либо если потенциальных мест, где могло поменяться что-то критически важное, немного, то попробуй почитать дизассемблированный код и понять, соответствует ли асм исходникам.

А так, получается, что в твоём уравнении две неизвестные.

anonymous
()

существенны восновном версии glibc и разделяемых библиотек и конечно платформа, а ядро больше если там драйвер. Смысла добиваться тех же флагов сборки впринципе нет.

Syncro ★★★★★
()