Это называется name mangling — как по-русски, я не знаю, но называю это «козявить имена».
Названия foo в объектных файлах действительно не будет существовать.
Линкер тут ни к чему, имена готовит компилятор. Потому, кстати, в межъязыковых библиотеках стараются имена не козявить.
Чтобы функция называлась именно так, как надо, в Си++ есть ключевое слово extern "C"
, и часто его применяют, например, при экспорте в межъязыковой DLL, при интеграции Си-кода с Си++. Что в Ди, не знаю.
В Си такого точно нет, как ты назвал, так и называются.
Линкер, конечно, может каким-то образом подхватывать DLL (так работает LD), но это очень не стандартно — при переходе с LD на LLD пришлось готовить *.a для всех имеющихся DLL. Но в любом случае именами занимается компилятор.