Есть ли какой-нибудь быстрый способ найти исходный код на ассемблере?

#assembly #grep #reverse-engineering

#сборка #grep #обратный инжиниринг

Вопрос:

Я пытаюсь найти исходный код dietlibc для базовых функций, таких как printf, puts и т. Д. В настоящее время используется grep {command_name} -r -A20 в папке, где они должны быть, но это кажется действительно утомительным. Есть ли какой-нибудь более быстрый способ?

Другой известный способ — поменять местами объектные файлы для каждой функции, но я думаю, что это займет больше времени.

Комментарии:

1. Что сказал автор, когда вы связались с ними?

2. Удален нерелевантный тег C

3. Не могли бы вы более конкретно рассказать о проблеме? Похоже, что файлы хорошо организованы и имеют правильные имена. Если я хочу найти код ARM для strcpy() , он находится внутри .../arm/strcpy.S . Загрузка файлов в IDE, вероятно, поможет.

4. @Caleb Это стандартная библиотека C, созданная с нуля для встроенных устройств. Я уже нашел папку с файлами * .S, но для самых основных функций, таких как printf(), есть только файлы .c

Ответ №1:

Я уже нашел папку с файлами * .S, но для самых основных функций, таких как printf(), есть только файлы .c

Многие функции написаны на C, и они написаны в терминах других функций C и / или функций языка ассемблера. printf() Например, (in .../libstdio/printf.c ) использует vprintf() , который использует __v_printf() (in .../lib/__v_printf.c ), Который использует strcpy() и strlen() т. Д., В Которых есть реализации ARM .../arm . Некоторые функции реализованы как на C, так и на assembly, вероятно, потому, что assembly обеспечивает повышение производительности на некоторых архитектурах, но не на других (или, возможно, потому, что никто не удосужился написать версии assembly для некоторых архитектур).

Итак, если вы ищете printf.S , вы, вероятно, не найдете его ни для одной архитектуры, потому что это функция относительно высокого уровня, которая вызывает другие функции. Это означает, что вы можете перенести dietlibc на новую архитектуру без необходимости писать ассемблерные версии каждой функции в библиотеке; вам нужно только реализовать небольшой набор основных подпрограмм. Прочитайте файл ПЕРЕНОСА, чтобы получить представление о том, что нужно сделать для переноса на новую архитектуру, и это поможет вам понять, что это за основные процедуры. Или просто загляните в несколько каталогов, специфичных для архитектуры, и посмотрите, что они реализуют.

Комментарии:

1. и когда вы его компилируете, результирующий asm и / или машинный код могут варьироваться от компилятора к компилятору, версии и настройкам. Источником является C, а не какой-либо asm. Кроме того, printf является одной из самых массивных функций в библиотеке C, когда вы учитываете весь необходимый код поддержки (другие функции), а также большую часть библиотеки компилятора.