Parce que:
- on avait mis ça dans GCC pour LINK.EXE qui ne gérait pas du tout les BSS en _nostub.
- on a gardé ça pour Obj2ti parce que ça permet d'accéder aux variables globales non initialisées en PC-relatif (elles sont en .data avec le code).
Évidemment, en mode kernel, GCC génère des .comm pour utiliser les BSS (il décide ça à l'aide du symbole short _nostub;, c'est pour ça qu'il est en short et pas en asm("xdef _nostub") ).
Et pourquoi un traîtement spécial pour le symbole _nostub? Facile: le nom commence par un underscore. C'est ça le critère.