2019-04-29 14:25:05 -07:00
|
|
|
// Copyright 2018 The gVisor Authors.
|
2018-04-27 10:37:02 -07:00
|
|
|
//
|
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
|
//
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
//
|
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
|
|
package linux
|
|
|
|
|
|
|
|
|
|
// Linux auxiliary vector entry types.
|
|
|
|
|
const (
|
|
|
|
|
// AT_NULL is the end of the auxiliary vector.
|
|
|
|
|
AT_NULL = 0
|
|
|
|
|
|
|
|
|
|
// AT_IGNORE should be ignored.
|
|
|
|
|
AT_IGNORE = 1
|
|
|
|
|
|
|
|
|
|
// AT_EXECFD is the file descriptor of the program.
|
|
|
|
|
AT_EXECFD = 2
|
|
|
|
|
|
|
|
|
|
// AT_PHDR points to the program headers.
|
|
|
|
|
AT_PHDR = 3
|
|
|
|
|
|
|
|
|
|
// AT_PHENT is the size of a program header entry.
|
|
|
|
|
AT_PHENT = 4
|
|
|
|
|
|
|
|
|
|
// AT_PHNUM is the number of program headers.
|
|
|
|
|
AT_PHNUM = 5
|
|
|
|
|
|
|
|
|
|
// AT_PAGESZ is the system page size.
|
|
|
|
|
AT_PAGESZ = 6
|
|
|
|
|
|
|
|
|
|
// AT_BASE is the base address of the interpreter.
|
|
|
|
|
AT_BASE = 7
|
|
|
|
|
|
|
|
|
|
// AT_FLAGS are flags.
|
|
|
|
|
AT_FLAGS = 8
|
|
|
|
|
|
|
|
|
|
// AT_ENTRY is the program entry point.
|
|
|
|
|
AT_ENTRY = 9
|
|
|
|
|
|
|
|
|
|
// AT_NOTELF indicates that the program is not an ELF binary.
|
|
|
|
|
AT_NOTELF = 10
|
|
|
|
|
|
|
|
|
|
// AT_UID is the real UID.
|
|
|
|
|
AT_UID = 11
|
|
|
|
|
|
|
|
|
|
// AT_EUID is the effective UID.
|
|
|
|
|
AT_EUID = 12
|
|
|
|
|
|
|
|
|
|
// AT_GID is the real GID.
|
|
|
|
|
AT_GID = 13
|
|
|
|
|
|
|
|
|
|
// AT_EGID is the effective GID.
|
|
|
|
|
AT_EGID = 14
|
|
|
|
|
|
|
|
|
|
// AT_PLATFORM is a string identifying the CPU.
|
|
|
|
|
AT_PLATFORM = 15
|
|
|
|
|
|
|
|
|
|
// AT_HWCAP are arch-dependent CPU capabilities.
|
|
|
|
|
AT_HWCAP = 16
|
|
|
|
|
|
|
|
|
|
// AT_CLKTCK is the frequency used by times(2).
|
|
|
|
|
AT_CLKTCK = 17
|
|
|
|
|
|
|
|
|
|
// AT_SECURE indicate secure mode.
|
|
|
|
|
AT_SECURE = 23
|
|
|
|
|
|
|
|
|
|
// AT_BASE_PLATFORM is a string identifying the "real" platform. It may
|
|
|
|
|
// differ from AT_PLATFORM.
|
|
|
|
|
AT_BASE_PLATFORM = 24
|
|
|
|
|
|
|
|
|
|
// AT_RANDOM points to 16-bytes of random data.
|
|
|
|
|
AT_RANDOM = 25
|
|
|
|
|
|
|
|
|
|
// AT_HWCAP2 is an extension of AT_HWCAP.
|
|
|
|
|
AT_HWCAP2 = 26
|
|
|
|
|
|
|
|
|
|
// AT_EXECFN is the path used to execute the program.
|
|
|
|
|
AT_EXECFN = 31
|
|
|
|
|
|
|
|
|
|
// AT_SYSINFO_EHDR is the address of the VDSO.
|
|
|
|
|
AT_SYSINFO_EHDR = 33
|
|
|
|
|
)
|
2019-08-09 13:16:46 -07:00
|
|
|
|
|
|
|
|
// ELF ET_CORE and ptrace GETREGSET/SETREGSET register set types.
|
|
|
|
|
//
|
|
|
|
|
// See include/uapi/linux/elf.h.
|
|
|
|
|
const (
|
|
|
|
|
// NT_PRSTATUS is for general purpose register.
|
|
|
|
|
NT_PRSTATUS = 0x1
|
|
|
|
|
|
|
|
|
|
// NT_PRFPREG is for float point register.
|
|
|
|
|
NT_PRFPREG = 0x2
|
|
|
|
|
|
|
|
|
|
// NT_X86_XSTATE is for x86 extended state using xsave.
|
|
|
|
|
NT_X86_XSTATE = 0x202
|
2020-01-13 07:44:58 +00:00
|
|
|
|
|
|
|
|
// NT_ARM_TLS is for ARM TLS register.
|
|
|
|
|
NT_ARM_TLS = 0x401
|
2019-08-09 13:16:46 -07:00
|
|
|
)
|
2021-05-04 16:38:25 -07:00
|
|
|
|
|
|
|
|
// ElfHeader64 is the ELF64 file header.
|
|
|
|
|
//
|
|
|
|
|
// +marshal
|
|
|
|
|
type ElfHeader64 struct {
|
|
|
|
|
Ident [16]byte // File identification.
|
|
|
|
|
Type uint16 // File type.
|
|
|
|
|
Machine uint16 // Machine architecture.
|
|
|
|
|
Version uint32 // ELF format version.
|
|
|
|
|
Entry uint64 // Entry point.
|
|
|
|
|
Phoff uint64 // Program header file offset.
|
|
|
|
|
Shoff uint64 // Section header file offset.
|
|
|
|
|
Flags uint32 // Architecture-specific flags.
|
|
|
|
|
Ehsize uint16 // Size of ELF header in bytes.
|
|
|
|
|
Phentsize uint16 // Size of program header entry.
|
|
|
|
|
Phnum uint16 // Number of program header entries.
|
|
|
|
|
Shentsize uint16 // Size of section header entry.
|
|
|
|
|
Shnum uint16 // Number of section header entries.
|
|
|
|
|
Shstrndx uint16 // Section name strings section.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ElfSection64 is the ELF64 Section header.
|
|
|
|
|
//
|
|
|
|
|
// +marshal
|
|
|
|
|
type ElfSection64 struct {
|
|
|
|
|
Name uint32 // Section name (index into the section header string table).
|
|
|
|
|
Type uint32 // Section type.
|
|
|
|
|
Flags uint64 // Section flags.
|
|
|
|
|
Addr uint64 // Address in memory image.
|
|
|
|
|
Off uint64 // Offset in file.
|
|
|
|
|
Size uint64 // Size in bytes.
|
|
|
|
|
Link uint32 // Index of a related section.
|
|
|
|
|
Info uint32 // Depends on section type.
|
|
|
|
|
Addralign uint64 // Alignment in bytes.
|
|
|
|
|
Entsize uint64 // Size of each entry in section.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ElfProg64 is the ELF64 Program header.
|
|
|
|
|
//
|
|
|
|
|
// +marshal
|
|
|
|
|
type ElfProg64 struct {
|
|
|
|
|
Type uint32 // Entry type.
|
|
|
|
|
Flags uint32 // Access permission flags.
|
|
|
|
|
Off uint64 // File offset of contents.
|
|
|
|
|
Vaddr uint64 // Virtual address in memory image.
|
|
|
|
|
Paddr uint64 // Physical address (not used).
|
|
|
|
|
Filesz uint64 // Size of contents in file.
|
|
|
|
|
Memsz uint64 // Size of contents in memory.
|
|
|
|
|
Align uint64 // Alignment in memory and file.
|
|
|
|
|
}
|