|
|
cc [flag . . . ] file . . . -lelf [library] . . .#include <libelf.h>
Elf_Scn elf_getscn(Elf elf, size_t index);
size_t elf_ndxscn(Elf_Scn scn);
Elf_Scn elf_newscn(Elf elf);
Elf_Scn elf_nextscn(Elf elf, Elf_Scn scn);
elf_getscn returns a section descriptor, given an index into the file's section header table. Note the first ``real'' section has index 1. Although a program can get a section descriptor for the section whose index is 0 (SHN_UNDEF, the undefined section), the section has no data and the section header is ``empty'' (though present). If the specified section does not exist, an error occurs, or elf is null, elf_getscn returns a null pointer.
elf_newscn creates a new section and appends it to the list for elf. Because the SHN_UNDEF section is required and not ``interesting'' to applications, the library creates it automatically. Thus the first call to elf_newscn for an ELF descriptor with no existing sections returns a descriptor for section 1. If an error occurs or elf is null, elf_newscn returns a null pointer.
After creating a new section descriptor, the program can use
elf_getshdr
to retrieve the newly created, ``clean'' section header.
The new section descriptor will have no associated data [see
elf_getdata(3elf)].
When creating a new section in this way, the library
updates the e_shnum
member of the
ELF
header and sets the
ELF_F_DIRTY
bit for the section [see
elf_flag(3elf)].
If the program is building a new file, it is responsible
for creating the file's
ELF
header
[see
elf_getehdr(3elf)]
before creating new sections.
elf_nextscn takes an existing section descriptor, scn, and returns a section descriptor for the next higher section. One may use a null scn to obtain a section descriptor for the section whose index is 1 (skipping the section whose index is SHN_UNDEF). If no further sections are present or an error occurs, elf_nextscn returns a null pointer.
elf_ndxscn takes an existing section descriptor, scn, and returns its section table index. If scn is null or an error occurs, elf_ndxscn returns SHN_UNDEF.
scn = 0; while ((scn = elf_nextscn(elf, scn)) != 0) { / process section / }