You copied the Doc URL to your clipboard.

Aligning regions to page boundaries

You can produce an ELF file with each execution region starting at a page boundary.

The linker provides the following built-in functions to help create load and execution regions on page boundaries:

  • AlignExpr, to specify an address expression.
  • GetPageSize, to obtain the page size for use in AlignExpr. If you use GetPageSize, you must also use the --paged linker command-line option.
  • SizeOfHeaders(), to return the size of the ELF header and Program Header table.

Note

  • Alignment on an execution region causes both the load address and execution address to be aligned.
  • The default page size is 0x8000. To change the page size, specify the --pagesize linker command-line option.

To produce an ELF file with each execution region starting on a new page, and with code starting on the next page boundary after the header information:

LR1 0x0 + SizeOfHeaders()
{
    ER_RO +0
    {
        *(+RO)
    }
    ER_RW AlignExpr(+0, GetPageSize())
    {
        *(+RW)
    }
    ER_ZI AlignExpr(+0, GetPageSize())
    {
        *(+ZI)
    }
}

If you set up your ELF file in this way, then you can memory-map it onto an operating system in such a way that:

  • RO and RW data can be given different memory protections, because they are placed in separate pages.
  • The load address everything expects to run at is related to its offset in the ELF file by specifying SizeOfHeaders() for the first load region.
Was this page helpful? Yes No