Учитывая тег C ++, ситуация не так безнадежна, как подразумевают некоторые другие ответы.
В частности, по крайней мере, в большинстве компиляторов C ++ имя функции будет искажено (Microsoft называет его «украшенным»), чтобы указать параметры, принимаемые этой функцией. Схема искажения варьируется от одного компилятора к другому, но по существу любой из них кодирует достаточно информации, чтобы вы могли заново создать объявление для функции - тип возвращаемого значения, имя самой функции, имя класса, если это функция-член и точное число и тип параметров, ожидаемых функцией.
Хотя это и не нужно делать путем искажения имени, у системы C ++ нет другого выбора, кроме как включить информацию о параметрах в объектный файл. Когда вы перегружаете функции, компоновщику нужно каким-то образом разобраться, какую перегрузку связать с конкретным вызовом.
Я должен добавить, что сортировка всего этого может быть довольно трудоемкой, хотя - например, если код включает шаблоны, имя символа в объектном файле будет расширяться все шаблон параметры (включая параметры по умолчанию). Например, рассмотрим тривиальный код, подобный следующему:
#include <vector>
#include <string>
std::vector<std::string> x;
Когда я компилирую это с VC ++, а затем выполняю dumpbin /symbols foo.obj
, вывод составляет около 75 килобайт. Несмотря на то, что мой исходный код, по-видимому, определяет только один символ, объектный файл содержит определения примерно для 180 символов, многие из которых почти полностью не связаны со всем, что я написал.
Стоит также отметить, что если объектный файл был скомпилирован с отладочной информацией, это (как правило) будет производить значительно больше информации о типе (и тому подобное) в объектном файле.