Могу ли я скомпилировать (используя компилятор g ++) исполняемый файл (на linux) и удалить динамический компоновщик c /lib64/ld-linux-x86-64.so.2? Я имею в виду, что если я добавлю исполняемый файл после сборки, он должен обнаружить компоновщик текущей (linux) системы.
Похоже, что опция компоновщика GNU --dynamic-linker
делает именно то, что вы просили.
[ aquila tmp ] $ cat 1.c
int niam (int a) { return a * (a-1) ; }
int main(int argc) { return niam (argc) ; }
[ aquila tmp ] $ cc 1.c
[ aquila tmp ] $ ./a.out ; echo $?
0
[ aquila tmp ] $ ls /tmp/ld.so
ls: cannot access '/tmp/ld.so': No such file or directory
[ aquila tmp ] $ cc -Wl,--dynamic-linker,/tmp/ld.so 1.c
[ aquila tmp ] $ ./a.out
-bash: ./a.out: No such file or directory
[ aquila tmp ] $ file ./a.out
./a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /tmp/ld.so
, for GNU/Linux 2.6.32, BuildID[sha1]=e520e119f419bf9b557da6d6b3158bb5ad2195e9, not stripped
[ aquila tmp ] $ ldd ./a.out
linux-vdso.so.1 (0x00007ffc775a8000)
libc.so.6 => /lib64/libc.so.6 (0x00007fa4901c7000)
/tmp/ld.so => /lib64/ld-linux-x86-64.so.2 (0x0000556ec4bcb000)
[ aquila tmp ] $ ls -l a.out
-rwxr-xr-x 1 ranga davfs2 8008 Apr 8 09:53 a.out
[ aquila tmp ] $ cp /lib64/ld-linux-x86-64.so.2 /tmp/ld.so
[ aquila tmp ] $ ./a.out
[ aquila tmp ] $ ldd a.out
linux-vdso.so.1 (0x00007ffd374a4000)
libc.so.6 => /lib64/libc.so.6 (0x00007f7e87b9a000)
/tmp/ld.so => /lib64/ld-linux-x86-64.so.2 (0x00005595b5585000)
У меня нет /lib64/ld-linux-x86-64.so.2, на самом деле у меня нет пути / lib64. Мой компоновщик существует по другому пути. Проблема существует, когда я хочу доставить вывод из моей системы в систему, которая имеет /lib64/ld-linux-x86-64.so.2. Поэтому я подумал, смогу ли я просто удалить динамический путь компоновщика c.
Обратите внимание, что - удаление пути компоновщика динамического c (заголовок программы PT_INTERP
ELF) с помощью --no-dynamic-linker
создаст двоичный объект, который не будет выполнен - соединение успешно выполнено, даже если Динамический c путь компоновщика, указанный в строке ссылки, был недопустим во время соединения - в то время как ldd
показывает системный динамический c компоновщик, на самом деле для запуска исполняемого файла требуется, чтобы динамический c компоновщик присутствовал точно по указанному пути - (поэтому) вам нужно знать путь к динамическому c компоновщику целевой системы во время соединения
он должен определять компоновщик тока ( linux) system.
Записан путь загрузчика динамического c, который обычно используется на взаимосовместимых платформах (и совместимых версиях загрузчика динамического c). так что это может помочь точно описать, чего вы пытаетесь достичь и что вам мешает.