Недавно я пытался понять как работают коды в iw. В iw.h я обнаружил следующее:
#define __COMMAND(sect, name, args, nlcmd, flags, idby, handler) \
static const struct cmd __cmd_ ## handler ## nlcmd ## idby \
__attribute__((used)) __attribute__((section("__cmd"))) \
= { sect, name, args, nlcmd, flags, idby, handler }
#define COMMAND(section, name, args, cmd, flags, idby, handler) \
__COMMAND(#section, #name, args, cmd, flags, idby, handler)
#define TOPLEVEL(name, args, cmd, flags, idby, handler) \
__COMMAND(NULL, #name, args, cmd, flags, idby, handler)
extern struct cmd __start___cmd;
extern struct cmd __stop___cmd;
Я попытался выполнить поиск в Google, но смог понять только то, что «__start___cmd» и «__stop___cmd» генерируются компоновщиком. Есть ли еще какое-нибудь объяснение этого непрофессионала?
Определенный __COMMAND не использовался в кодах, и я понятия не имею, какова его цель. Я могу только предположить, что это связано с определенной структурой extern.
Я загрузил исходный код с https://www.kernel.org/pub/software/network/iw/iw-0.9.1.tar.gz
То, что интересно в этом макроопределении, является использованием переменные атрибуты :
#define __COMMAND(sect, name, args, nlcmd, flags, idby, handler) \
static const struct cmd __cmd_ ## handler ## nlcmd ## idby \
__attribute__((used)) __attribute__((section("__cmd"))) \
= { sect, name, args, nlcmd, flags, idby, handler }
gcc
(ld
, скорее) генерирует две волшебных переменные: __ start_SECTION и __ stop_SECTION. Они могут использоваться для получения запуска и конечных адресов раздела.