A move is the process of taking some offsets in the code to the actual memory location. Permutations (places that will be edited by the movement process and a description of each movement) are generated by the compiler, for example. for TLS variables for dynamic library calls for PIC / PIE code. The move description is stored in a binary file (for example, in ELF format on Linux).
The move is partially performed at the build stage, by means of the ld linker program in linux; other linkers in other OSs.
But there are some permutations that cannot be performed offline (before running the program). Such permutations are necessary to use ASLR (randomization of address space allocation) to load dynamic libraries. Therefore, some of them are executed immediately before starting the program using the program interpreter ( ld.so on linux), which is also called the runtime linker. It will load your program and its dynamic libraries into memory and will perform the move.
The third place where permutations are performed is the call to dlopen() (in libdl.so on unix). This is a library for dynamically loading dynamic libraries; and since dynamic libraries have permutations, this library must also execute them.
An error message is from some linker, and if you see this after starting the program, this is the second (ld.so) or third case (libdl).
I cannot find the exact place where this message is generated, but this is possible due to
- memory or data corruption on the disk (non-ecc memory or other hardware error), which made some data incorrect. Reboot the computer; file system checks and md5sums; reinstallation of used packages (glibc; libgcc); recompile your application; replace memory, reduce memory frequency.
- the undefined character was used. Try setting the environment variable
LD_BIND_NOW (if you are on glibc or a derivative) to nonzero. - the program distorted his memory. for example use, or a random arrow pointer, or something like that. Try using
valgrind (if you are on Intel). - a synchronization error that allows you to tear memory. Use
valgrind --tool=helgrind (if you are on Intel and you have a lot of time to wait)
osgx
source share