I have ran through code that use _ attribute _((section(\"name\")). I understand that for gcc compiler this allows you to tell the linker to put the object cre
There are many possible uses. [Edit to add note: this is just a sample of uses I've seen myself or considered, not a complete list.]
The Linux kernel, for instance, marks some code and data sections as used only during kernel bootstrap. These can be jettisoned after the kernel is running, reclaiming the space for other uses.
You can use this to mark code or data values that need patching on a particular processor variant, e.g., with or without a coprocessor.
You can use it to make things live in "special" address spaces that will be burned to PROM or saved on an EEPROM, rather than in ordinary memory.
You can use it to collect together code or data areas for purposes like initialization and cleanup, as with C++ constructors and destructors that run before the program starts and when it ends, or for using shorter addressing modes (I don't know how much that would apply on ARM as I have not written any ARM code myself).
The actual use depends on the linker script(s).
From a usecase point of view, there are lots of different types of .data
, like:
.vdso
or vsyscall
pages. Or, another example, bootloader and kernel)RIP
-relative addressing, the data must be within that range of your currently executing code)So in the end it's often about attributes (the word here used in a more generic sense than what __attribute__(...)
allows you to state from within gcc sourcecode. Whether another section is needed and/or useful is ... in the eye of the beholder - the system designer, that is.
The availabiltiy of the section
attribute, therefore, allows for flexibility and that is, IMHO, a good thing.