Display or modify the contents of an ELF note (QNX)
Syntax:
elfnote -p [-n name] [-q] [-t type] [-v] file
elfnote [-p] [-n name] [-t type] [-F fmt] -m value [-vq] file [outfile]
elfnote [-pv] [-S size [-L]] [-q][-x [exec | noexec]] file [outfile]
Runs on:
QNX Neutrino, Linux, macOS, Microsoft Windows
Options:
- -F
fmt
- Specifies how to interpret the elements of the -m option's argument.
- x — The element at the corresponding position in the value string is
interpreted as a hexadecimal representation of raw data. For example, if the note description
contains numeric types, they must be given in the correct target endian order and represented in
hexadecimal bytes. This is the default format if you specify -m.
- n — The element at the corresponding position in the value string is
interpreted as an unsigned integer with an optional size suffix (k, m, or
g). The value can be specified as a decimal, octal (0...), or hexadecimal (0x...) number.
The number is automatically converted to the correct endian order. This is the default format if you
specify -S.
- -L
- For a QNX note of type QNT_STACK, use lazy stack allocation. Use
only when -S is specified.
- -m value
- Modify the contents of the note, where value is a string that specifies a
series of elements separated by a comma. Take the
note format for QNT_STACK, for
example, which consists of three fields:
- The total size
- The pre-allocated size
- Whether the stack is executable
Thus, a 64K stack, 32K pre-allocated,
non-executable note takes the
form:elfnote -nQNX -tQNT_STACK -Fn -m 64k,32k,1 file
The
-F option determines how the
individual elements are interpreted. Each
-F option value specifies the
conversion of one element in
value; if the format string has
fewer characters than there are elements in
value, the format is applied
repeatedly.
- -n name
- The note name to match.
- -p
- Display (print) the notes. If you also use -t to specify a note type,
elfnote displays only that type
of notes; otherwise, elfnote
displays all the notes. If you specify the
-m option,
elfnote displays the value
before modification.
- -q
- Quiet operation. Do not print warning or error messages.
- -S
size
- The stack size. This option implies -n QNX, -t QNT_STACK, and
-Fn.
- -t type
- The note type to match. Acceptable values are numbers or the following
types (defined in
<elfdefinitions.h>).
When you specify defined types, -n
GNU or -n
QNX is implied.
. The
following symbolic names can be used with
-t:
- NT_GNU_BUILD_ID
- QNT_DEBUG_FULLPATH
- QNT_DEBUG_RELOC
- QNT_STACK
- QNT_GENERATOR
- QNT_DEFAULT_LIB
- QNT_CORE_SYSINFO
- QNT_CORE_INFO
- QNT_CORE_STATUS
- QNT_CORE_GREG
- QNT_CORE_FPREG
- QNT_LINK_MAP — you can
use coreinfo to display
this note in core files.
You typically use elfnote to
modify QNT_STACK, as described
below.
- -v
- Increase verbosity.
- -x [exec | noexec]
- Specify whether to update the QNT_STACK note in the binary to request an
executable stack:
- exec — Update the
binary to request an executable stack.
- noexec — Update the
binary to request a non-executable stack (the
default for newly built binaries).
You can use this option on its own or combine
it with
-S and
-L to update the stack size as
well. If you don't specify
-S,
the stack executability changes but the stack size
does not.
Use
-S,
-L and
-x for
the simplest setting of stack parameters.
- Change stack to be executable, preserving
existing size and allocation
values:
elfnote -x exec file
- Change stack to be non-executable, preserving
existing size and allocation
values:
elfnote -x noexec file
Description:
The elfnote utility displays or modifies the contents of a note in an
Executable and Linkable Format file.
When you modify the contents of a note, you must specify -t. If
-t does not specify a defined type, the
note name is not implied and you must also specify
-n.
Note:
- You can't change the size of a note, only its contents.
-
Setting a stack size that's insufficient for the
startup of the process, including space for
arguments and environment variables (limited by
_SC_ARG_MAX or
ARG_MAX), may cause unexpected
early failures of the process execution.
- You must specify at least one of the following options: -p,
-m, -S or -x; otherwise,
elfnote fails.
Examples:
For ldrel-compatible behavior, use options -S and -L.
For example, the following command allocates a stack size of 128k at
thread creation time:
elfnote -S 128k file
The following command allocates a stack size of 128k, lazy allocated:
elfnote -S 128k -L file
The following examples explain how to modify
QNT_STACK to set stack size and stack
alloc using:
- a raw hexadecimal value (either comma-separated or not), the equivalent command
is:
elfnote -t QNT_STACK -Fx -m 00,00,02,00,00,10,00,00,01,00,00,00 filename
- a numeric format, the equivalent commands
are:
elfnote -S 131072 -L -x noexec filename
elfnote -t QNT_STACK -Fn -m stack size,stack prealloc size,flags filename
The
only current flag is QNX_STACK_NOTEXECUTABLE 1.Note: Apply the n format
string repeatedly to parse the individual, comma-separated numeric
elements.
- a mixed format, the equivalent commands
are:
elfnote -n QNX -t QNT_STACK -m 000002000010000001000000 filename
elfnote -t QNT_STACK -Fx -m 00,00,02,00,00,10,00,00,01,00,00,00 filename
elfnote -t QNT_STACK -Fn -m 128K,4K,1 filename
The following example assumes you have a binary containing a note with a name
SP_NOTE and type 9, consisting of the four 32-bit values, 100, 200, 300, and 400.
To display the note:
# elfnote -p -n SP_NOTE file
Note name = SP_NOTE, type = 9
hex : 64000000c80000002c01000090010000
Change the values to 16, 32, 48 and 64:
elfnote -n SP_NOTE -t 9 -F n -m 16,32,48,64 file
Display the changed note:
# elfnote -p -n SP_NOTE file
Note name = SP_NOTE, type = 9
hex : 10000000200000003000000040000000
Change the value back to the original by specifying a hex string:
elfnote -n SP_NOTE -t 9 -m 64000000c80000002c01000090010000 file
Display the result again:
# elfnote -p -n SP_NOTE file
Note name = SP_NOTE, type = 9
hex : 64000000c80000002c01000090010000