MMAPOBJ(2)                      System Calls                      MMAPOBJ(2)
NAME
       mmapobj - map a file object in the appropriate manner
SYNOPSIS
       #include <sys/mman.h>       
int mmapobj(
int fd, 
uint_t flags, 
mmapobj_result_t *storage,            
uint_t *elements, 
void *arg);
PARAMETERS
       fd                   The open file descriptor for the file to be mapped.       
flags                   Indicates that the default behavior of 
mmapobj() should
                   be modified accordingly. Available flags are:                   
MMOBJ_INTERPRET                       Interpret the contents of the file descriptor instead
                       of just mapping it as a single image. This flag can
                       be used only with 
ELF and 
AOUT files.                   
MMOBJ_PADDING                       When mapping in the file descriptor, add an
                       additional mapping before the lowest mapping and
                       after the highest mapping. The size of this padding
                       is at least as large as the amount pointed to by 
arg.
                       These mappings will be private to the process, will
                       not reserve any swap space and will have no
                       protections. To use this address space, the
                       protections for it will need to be changed. This
                       padding request will be ignored for the 
AOUT format.       
storage                   A pointer to the 
mmapobj_result_t array where the mapping
                   data will be copied out after a successful mapping of 
fd.       
elements                   A pointer to the number of 
mmapobj_result_t elements
                   pointed to by 
storage.  On return, 
elements contains the
                   number of mappings required to fully map the requested
                   object.  If the original value of 
elements is too small,                   
E2BIG is returned and 
elements is modified to contain the
                   number of mappings necessary.       
arg                   A pointer to additional information that might be
                   associated with the specific request. Only the                   
MMOBJ_PADDING request uses this argument. If                   
MMOBJ_PADDING is not specified, 
arg must be 
NULL.
DESCRIPTION
       The 
mmapobj() function establishes a set of mappings between a
       process's address space and a file.  By default, 
mmapobj() maps the
       whole file as a single, private, read-only mapping.  The       
MMOBJ_INTERPRET flag instructs 
mmapobj() to attempt to interpret the
       file and map the file according to the rules for that file format.
       The following 
ELF and 
AOUT formats are supported:       
ET_EXEC and 
AOUT executables
           This format results in one or more mappings whose size, alignment
           and protections are as described by the file's program header
           information. The address of each mapping is explicitly defined by
           the file's program headers.       
ET_DYN and 
AOUT shared objects
           This format results in one or more mappings whose size, alignment
           and protections are as described by the file's program header
           information. The base address of the initial mapping is chosen by           
mmapobj(). The addresses of adjacent mappings are based off of
           this base address as defined by the file's program headers.       
ET_REL and 
ET_CORE           This format results in a single, read-only mapping that covers
           the whole file.  The base address of this mapping is chosen by           
mmapobj().
       The 
mmapobj() function will not map over any currently used mappings
       within the process, except for the case of an 
ELF ET_EXEC file for
       which a previous reservation has been made via 
/dev/null. The most
       common way to make such a reservation would be with an 
mmap() of       
/dev/null.
       Mappings created with 
mmapobj() can be processed individually by
       other system calls such as 
munmap(2).
       The 
mmapobj_result structure contains the following members:
         typedef struct mmapobj_result {
               caddr_t         mr_addr;         /* mapping address */
               size_t          mr_msize;        /* mapping size */
               size_t          mr_fsize;        /* file size */
               size_t          mr_offset;       /* offset into file */
               uint_t          mr_prot;         /* the protections provided */
               uint_t          mr_flags;        /* info on the mapping */
         } mmapobj_result_t;
       The macro 
MR_GET_TYPE(
mr_flags) must be used when looking for the
       above flags in the value of 
mr_flags.
       Values for 
mr_flags include:
         MR_PADDING   0x1  /* this mapping represents requested padding */
         MR_HDR_ELF   0x2  /* the ELF header is mapped at mr_addr */
         MR_HDR_AOU   0x3  /* the AOUT header is mapped at mr_addr */
       When 
MR_PADDING is set, 
mr_fsize and 
mr_offset will both be 0.
       The 
mr_fsize member represents the amount of the file that is mapped
       into memory with this mapping.
       The 
mr_offset member is the offset into the mapping where valid data
       begins.
       The 
mr_msize member represents the size of the memory mapping
       starting at 
mr_addr. This size may include unused data prior to       
mr_offset that exists to satisfy the alignment requirements of this
       segment. This size may also include any non-file data that are
       required to provide 
NOBITS data (typically .
bss). The system reserves
       the right to map more than 
mr_msize bytes of memory but only 
mr_msize       bytes will be available to the caller of 
mmapobj().
RETURN VALUES
       Upon successful completion, 0 is returned and 
elements contains the
       number of program headers that are mapped for 
fd. The data describing
       these elements are copied to storage such that the first 
elements       members of the storage array contain valid mapping data.
       On failure, -1 is returned and 
errno is set to indicate the error. No
       data is copied to storage.
ERRORS
       The 
mmapobj() function will fail if:       
E2BIG                     The 
elements argument was not large enough to hold the
                     number of loadable segments in 
fd. The 
elements                     argument will be modified to contain the number of
                     segments required.       
EACCES                     The file system containing the 
fd to be mapped does not
                     allow execute access, or the file descriptor pointed to
                     by 
fd is not open for reading.       
EADDRINUSE                     The mapping requirements overlap an object that is
                     already used by the process.       
EAGAIN                     There is insufficient room to reserve swap space for
                     the mapping.
                     The file to be mapped is already locked using advisory
                     or mandatory record locking. See 
fcntl(2).       
EBADF                     The 
fd argument is not a valid open file descriptor.       
EFAULT                     The 
storage, 
arg, or 
elements argument points to an
                     invalid address.       
EINVAL                     The 
flags argument contains an invalid flag.                     
MMOBJ_PADDING was not specified in 
flags and 
arg was
                     non-null.       
ENODEV                     The 
fd argument refers to an object for which 
mmapobj()                     is meaningless, such as a terminal.       
ENOMEM                     Insufficient memory is available to hold the program
                     headers.
                     Insufficient memory is available in the address space
                     to create the mapping.       
ENOTSUP                     The current user data model does not match the 
fd to be
                     interpreted; thus, a 32-bit process that tried to use                     
mmapobj() to interpret a 64-bit object would return                     
ENOTSUP.
                     The 
fd argument is a file whose type can not be
                     interpreted and 
MMOBJ_INTERPRET was specified in 
flags.
                     The 
ELF header contains an unaligned 
e_phentsize value.       
ENOSYS                     An unsupported filesystem operation was attempted while
                     trying to map in the object.
ATTRIBUTES
       See 
attributes(7) for descriptions of the following attributes:
       +--------------------+-------------------+
       |  ATTRIBUTE TYPE    |  ATTRIBUTE VALUE  |
       +--------------------+-------------------+
       |Interface Stability | Private           |
       +--------------------+-------------------+
       |MT-Level            | Async-Signal-Safe |
       +--------------------+-------------------+
SEE ALSO
       ld.so.1(1), 
fcntl(2), 
memcntl(2), 
mmap(2), 
mprotect(2), 
munmap(2),       
madvise(3C), 
mlockall(3C), 
msync(3C), 
elf(3ELF), 
a.out(5),       
attributes(7)       Linker and Libraries Guide                                June 20, 2021                     MMAPOBJ(2)