А вот здесь кажется описано как подменять стартовую процедуру на свою (для другого МК, но суть-то одна):
https://sourceforge.net/p/sdcc/discussi ... /a2ed0dd5/
То, что там написано, оказалось довольно бесполезно без некоторого добавления (во всяком случае для PIC). В принципе, можно в С определить функцию _sdcc_gsinit_startup() и тогда библиотечная такая функция прилинковываться не будет. На первый взгляд все хорошо: управление изначально передается на _sdcc_gsinit_startup, которую мы сами написали, ничего лишнего не вставляется. Но делать почти ничего при этом нельзя (но лишь почти, мелочи можно). Дело в том, что для передачи аргументов длиннее 1 байта надо определить глобальные символы STK00, STK01 и т.д. Это, вместе с аккумулятором w, составляет стек передачи аргументов. А эти STK00, STK01 и т.д. средствами С определить никак не получается. Т.е. определить-то можно, но компилятор их переделает (в объектном модуле) в _STK00 и т.д. Он ко всем символам добавляет _ в начало (кстати, это надо иметь в виду при обращении к Сишным символам из ассемблера, например при вызове С-функций). И хоть тресни, ничего не получается, линковка не проходит, приходится ассемблерный модуль все равно добавлять. Хотя бы для того, чтобы определить эти STK00 и пр. (они, кстати, нужны даже тогда, когда мы сами не описываем передачу длинных аргументов, обращение к подпрограммам умножения и т.п. все равно обычно генерируется, а там эти символы тоже нужны). А если ассемблерный модуль добавлять, то там и начальную передачу управления можно сделать, я выше писал как.
Мне пока не удается обойтись без ассемблерного объектного модуля, если хотеть, чтобы не добавлялся библиотечный стартап, но при этом был стек аргументов длиннее 1 байта (который нужен в т.ч. для умножения и т.п.). Есть идеи как? Хотя, конечно, это уже чисто "академический" вопрос, прилинковать небольшую ассемблерную программку не составляет никакой практической проблемы.