после редактирования первого поста ему пришел пипец - всё в одну строку.
повторяю его с дополнениями:

Пока изучал в дебагере "Relocation Processing", дошел до идеи допилить либу /lib/ld-linux.so.2 (это ссылка на /lib/ld-2.17.so) до "патчера памяти процесса".

Начните с экспериментов "в песочнице" - в вирт.машине установите любимый линукс, доустановите debug-символы и исходники для пакета glibc (репозитории Debuginfo, Sources), установите дебагер IDA-free-7.6 (более новый не советую, но это на ваше усмотрение).

Запустив дебагер IDA, в меню "Debugger" -> "Debugger options" включите 2-е галки "Suspend on debugging start" (или "Suspend on process entry point") и "Suspend on library load/unload"

Откройте модуль толстого клиента 1cv8, начните отладку, нажав F9, и выведите окно загруженных модулей процесса - меню "Debugger" -> "Debugger windows" -> "Module list".

В окне "Module list" на первой строке вверху написано имя файла запускаемого приложения (1cv8).

Включаем в меню "Debugger" -> "Use source-level debugging", если вы доустановили исходники glibc.

Жмём F9 для продолжения выполнения процесса. Когда дебагер остановится при наступлении события "LIB_LOADED", то в окне "Module list" во второй строке сверху будет написано имя файла либы, с которой сейчас работает загрузчик ld-linux-x86-64.so.2



снимок сделан в момент динамической загрузки первого модуля - xml2.so, либа ещё не очончательно загружена - смотрите в окно исходного кода - IDA остановился внутри функции dl_open_worker в файле исходника dl-open.c на 301 строке.

фрагмент исходника dl-open.c с номерами строк:
Код:
227:  _dl_debug_initialize (0, args->nsid);
228:
229:  /* Load the named object.  */
230:  struct link_map *new;
231:  args->map = new = _dl_map_object (call_map, file, lt_loaded, 0,
232:                            mode | __RTLD_CALLMAP, args->nsid);
      полагаю _dl_map_object делает отображение (mapping) файла в виртуальную память процесса

267:  /* Load that object's dependencies. */
268:  _dl_map_object_deps (new, NULL, 0, 0,
269:                   mode & (__RTLD_DLOPEN | RTLD_DEEPBIND | __RTLD_AUDIT));
      полагаю _dl_map_object_deps читая заголовок ELF-файла, замаппит в память процесса статически слинкованные либы

297:  /* Notify the debugger all new objects are now ready to go.  */
298:  struct r_debug *r = _dl_debug_initialize (0, args->nsid);
299:  r->r_state = RT_CONSISTENT;
300:  _dl_debug_state ();
301:  LIBC_PROBE (map_complete, 3, args->nsid, r, new);
суть 4-х строк 298-301 - уведомить дебагер о том, что "all new objects are now ready to go",
в строке 301 "map_complete" подсказывает, что дебагер уведомляется о событии "mapping выполнен"

В либе xml2.so ещё не исправлены релоки (т.е. впереди будет патчинг памяти процесса в качестве примера) и не выполнен код инициализации библиотеки (секции .init и .init_array)

Полагаю, что удобный момент патчить память процесса - после "relocation processing", но до выполнения инициализации библиотеки (секции .init и .init_array). Релоки будут уже исправлены и мне не придется с ними бороться - мой код запишет новое поверх старого и оно уже не будет "исправляться".

после "mapping processing" начинается выполнение "relocation processing"
Код:
307:  /* Only do lazy relocation if `LD_BIND_NOW' is not set.  */
308:  int reloc_mode = mode & __RTLD_AUDIT;
309:  if (GLRO(dl_lazy))
310:    reloc_mode |= mode & RTLD_LAZY;

      // выполнен "mapping processing"

554:  /* Notify the debugger all new objects have been relocated.  */
555:  if (relocation_in_progress)
556:    LIBC_PROBE (reloc_complete, 3, args->nsid, r, new);

  // +++  вот тут я внедрю код исправления орфографических ошибок в приложении - набрали, блядь, неграмотных по объявлению

      // начинается выполнение "initializer functions"
558:  /* Run the initializer functions of new objects.  */
559:  _dl_init (new, args->argc, args->argv, args->env);