[MinGW, gcc] Своя точка входа в программу

feliks28

Повелся на статью Пытаюсь повторить.
Для начала почти пустой файл test.c:
my_main
{}

Пытаюсь скомпилировать (без прагм, только флагами):
gcc -nostartfiles -nodefaultlibs -nostdlib test.c -Wl,--entry=my_main
Ругается:
%Директория MinGW%\bin\..lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: warning: cannot find entry symbol my_main; defaulting to 00401000

Как тогда правильно назначить собственную точку входа?
p.s. В комментариях статьи вычитал что "MS линкер любит пошалить и запихивает в PE-файл (между стабом DOS и началом PE-заголовка) какой-то "мусор". Что же это за "мусор"? Так вот, туда попадает слово "Rich" + compid (!) вашей машины, поксоренный определенным ключом!"
Еще какие-нибудь линкеры балуются подобным образом?

oliver11

--entry=_my_main хавает.

feliks28

Эмм да, но почему так?
И кстати, все равно
Warning: resolving _my_main by linking to 0
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups

Где бы почитать про это поподробнее можно?

pitrik2

Где бы почитать про это поподробнее можно?
--enable-stdcall-fixup
--disable-stdcall-fixup
If the link finds a symbol that it cannot resolve, it will attempt to do "fuzzy linking" by looking for another defined symbol that differs only in the format of the symbol name (cdecl vs stdcall) and will resolve that symbol by linking to the match. For example, the undefined symbol _foo might be linked to the function 12, or the undefined symbol 16 might be linked to the function _bar. When the linker does this, it prints a warning, since it normally should have failed to link, but sometimes import libraries generated from third-party dlls may need this feature to be usable. If you specify --enable-stdcall-fixup, this feature is fully enabled and warnings are not printed. If you specify --disable-stdcall-fixup, this feature is disabled and such mismatches are considered to be errors.

pitrik2

И кстати, все равно
code resolving _my_main by linking to 0
ну значит надо так:
--entry=0
и больше никаких ворнингов
просто это команда не компилятору, а линковщику
сначала твой код компилируется, при этом функция my_main превращается в 0
после этого то что получилось линкуется и именно в этом месте используется параметр --entry

feliks28

Ага, спасибо, скомпилилось.
Только вот понимания мне это не добавило
Я имел ввиду не где про ворнинг почитать (т.к. считаю, что ворнинги надо исключать, а не отключать) а про объявление точек входа.
Нужно ли __stdcall? Что за цифры после @ в 0? Почему _my_main, а не просто my_main? И т.п....

zontik

Нужно ли __stdcall? Что за цифры после @ в 0?
да, количество параметров, почему? - исторически сложилось

pitrik2

почему? - исторически сложилось
ну дык как по-другому различать функции с разным числом параметров и одним именем?

Vladislav177Rus

Вроде бы не параметров, а байт, которые они занимают в стеке

feliks28

ну дык как по-другому различать функции с разным числом параметров и одним именем?
Ну так в си ж такого нет. Тем более, что я в каком-то языке перегружал функции с одинковым количеством параметров, но разными принимаемыми типами...

feliks28

В общем, результируя тред, предлагается забить на подробности?
Тем более, что задача отлинковки стандартной библиотеки (судя по размеру) достигнута
Хотя, конечно, хотелось бы разобраться...
Оставить комментарий
Имя или ник:
Комментарий: