Как получить полный код сборки из файла c? - PullRequest
0 голосов
/ 03 июня 2018

В настоящее время я пытаюсь выяснить способ получения эквивалентного кода сборки из соответствующего исходного файла c.(извините за то, что я не могу свободно говорить по-английски, я новичок в английском.)

Я использую язык C в течение нескольких лет, но у меня мало опыта в языке ассемблера.

Я смог вывести код сборки, используя опцию S в gcc.Однако полученный код сборки содержит инструкцию вызова, которая, в свою очередь, выполняет переход к другим функциям, таким как _exp.Это не то, что я хотел, мне нужен был полнофункциональный код сборки в одном файле, без зависимости от других кодов.

Можно ли добиться того, что я ищу?Я был бы очень признателен за получение ответа!

РЕДАКТИРОВАТЬ: Чтобы лучше описать проблему, я показываю вам мой код здесь:

#include <math.h>
float sigmoid(float i){
    return 1/(1+exp(-i));
}

И да, это смущающе мало,Я должен был предоставить это в первый раз, когда я открыл этот вопрос.Я также хотел бы добавить, что платформа, на которой я сейчас работаю, - это Windows 10 64bit, компилятор, который я использую, это cl.exe из MSbuild.Еще раз, спасибо заранее!

Редактировать 2: Теперь я вижу, что не ясно описал то, что хотел.Извини за это.Во всяком случае, моя первоначальная цель состояла в том, чтобы на самом низком уровне увидеть, как компьютеры вычисляют математические функции.Уровень, на котором я решил наблюдать за процессом расчета, - это код сборки, и выбранная мной математическая функция была сигмоидальной, как указано выше.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

_exp - стандартная математическая функция библиотеки double exp(double);очевидно, вы находитесь на платформе, которая добавляет начальное подчеркивание к именам символов C.

Учитывая .s, который вызывает некоторые библиотечные функции, создайте его так же, как и файл .c, который вызывает библиотечные функции:

gcc foo.S -o foo  -lm

По умолчанию вы получите динамический исполняемый файл.


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

gcc -O3 -march=native foo.c -o foo -static -lm
objdump -drwC -Mintel foo > foo.s

Нет гарантии, что реализация _exp в libm.a (статическая библиотека) идентичнана тот, который вы получите в libm.so или libm.dll или где-либо еще, потому что это другой файл.Это особенно верно для такой функции, как memcpy, где уловки динамического компоновщика часто используются для выбора оптимальной версии (для вашего процессора) во время выполнения.

0 голосов
/ 03 июня 2018

В целом это невозможно, конечно, есть исключения, я мог бы создать их так, чтобы другие тоже могли, но это не интересная программа.

Обычно ваша C-программа, ваша точка входа main () - это только процент кода.Есть загрузчик, который содержит фактическую точку входа для операционной системы для запуска вашей программы, это делает некоторые вещи, которые подготавливают пространство вашей виртуальной памяти, чтобы ваша программа могла работать.Нули .bss и другие подобные вещи.это часто и (или) должно быть написано на ассемблере (в противном случае вы столкнетесь с проблемой курицы и яйца), но не на языке ассемблера, который вы увидите, пока не найдете источники библиотеки C, вы часто получаете объект как частьнабор инструментов вместе с другими библиотеками компилятора и т. д.

Затем, если вы делаете какие-либо вызовы C или создаете код, который приводит к вызову библиотеки компилятора (выполнить деление на платформе, которая не поддерживает деление, выполнить с плавающей запятой наПлатформа, которая не имеет плавающей запятой и т. д.), это еще один объект, пришедший из некоторого другого C или сборки, который является частью исходных кодов библиотеки или компилятора и который вы не увидите во время компиляции / сборки / ссылки (цепочка в цепочке инструментов)process.

Таким образом, за исключением специально созданных тривиальных программ или специально созданных для этой цели инструментов (для определенных, вероятно, платформ с использованием неизолированного металла), вы не увидите, что вся ваша программа превратится в один большой исходный файл сборки, пока она не будет собрана.связанный.

Если не baremetal, то, конечно, есть уровень операционной системы, который вы наверняка не увидите как часть вашего исходного кода, в конечном счете, вызовы библиотеки C, которым нужна система, найдут место, где ониСделайте это, все скомпилировано в объект / lib перед их использованием, а исходные коды сборки для операционной системы являются частью какого-то другого процесса создания исходного кода и сборки где-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...