내가 하려는 일에 대한 간단한 요약

내가 하려는 일에 대한 간단한 요약

(이 질문은 나의 간접적인 연속이다.이전 질문이미 해결되었습니다. )

내가 하려는 일에 대한 간단한 요약

pin_sim.so건설 시뮬레이터 snipersim의 이름을 딴 .so 파일이 있습니다 (http://www.snipersim.org). 이 라이브러리는 기본적으로 시뮬레이션에 사용되는 Intel PIN 계측 라이브러리 주위에 래퍼를 구현합니다.

이 파일은 기본 애플리케이션이 시뮬레이션을 시작하기 전에 동적으로 로드됩니다. 시뮬레이션 대상 실행 파일은 동일한 라이브러리 버전으로 로드되어야 pin_sim.so하고 pin_sim.so특정 버전의 라이브러리가 패키징되므로 시뮬레이션이 시작되기 전에 pin_sim.so 를 사용하여 로드된 라이브러리 버전을 확인합니다 ldd.

질문

내 홈 데스크탑(Linux Mint 17.2 실행)에서는 제대로 작동합니다. ldd pin_sim.so반품:

linux-vdso.so.1 =>  (0x00007ffcd75a3000)
libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007fdd19d08000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fdd19b00000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fdd198e6000)
libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007fdd1962d000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fdd19429000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fdd19124000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdd18e1e000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fdd18c08000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd18842000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdd1ae55000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdd18624000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fdd18421000)

그러나 액세스 권한이 있는 OpenSUSE 13.1을 실행하는 컴퓨팅 클러스터에서 이 명령은 다음을 반환합니다(파일을 복사하거나 다시 컴파일하는지 여부).

not a dynamic executable

또한 스나이퍼를 올바르게 실행할 수 없습니다(시뮬레이션이 실행되지 않습니다. 이는 pin_sim.so가 올바르게 로드되지 않는 것과 관련이 있는 것 같습니다).

이 파일을 클러스터에서 컴파일한 다음 이를 내 집 컴퓨터에 복사하면 ldd는 이전과 마찬가지로 작동합니다. ldd로 시도한 다른 모든 파일(주요 스나이퍼 바이너리 포함)은 잘 작동하지만 pin_sim.so만 실패합니다.

추가 정보

file pin_sim.so내 집 컴퓨터에서(재컴파일하지 않고 클러스터에서도 동일):

pin_sim.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=4ac6397fefb655c475b5a941cef726183d3e3710, not stripped

file pin_sim.so클러스터에서(재컴파일):

pin_sim.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

objdump -p pin_sim.so | grep NEEDED두 머신 모두에서(클러스터에서 다시 컴파일한 후에도):

NEEDED               libpython2.7.so.1.0
NEEDED               librt.so.1
NEEDED               libz.so.1
NEEDED               libsqlite3.so.0
NEEDED               libdl.so.2
NEEDED               libstdc++.so.6
NEEDED               libm.so.6
NEEDED               libgcc_s.so.1
NEEDED               libc.so.6
NEEDED               ld-linux-x86-64.so.2

readelf -d pin_sim.so | grep NEEDED두 머신 모두에서(클러스터에서 다시 컴파일한 후에도):

0x0000000000000001 (NEEDED)             Shared library: [libpython2.7.so.1.0]
0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libsqlite3.so.0]
0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]

ldd --version내 집 컴퓨터에서:

ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19

ldd --version클러스터에서:

ldd (Gentoo 2.20-r2 p4) 2.20

내가 시도한 것/내 생각

저는 Linux 동적 연결 프로세스에 익숙하지 않아서 많이 시도하지 않았습니다.

웹을 둘러보니 매우 오래된 ldd 바이너리(ldd 지원이 ELF 형식에 추가되기 전에 컴파일됨) 또는 64비트 시스템 없이 32비트 바이너리에서 ldd를 실행하는 것에 대한 참조만 찾을 수 있습니다. 32비트 시스템 라이브러리가 설치됩니다. 이 바이너리는 제가 컴파일했고 64비트이므로 ldd가 실패할 수 있는 이유를 모르겠습니다.

스나이퍼의 버전 검사기를 ldd 사용에서 readelf/objdump 사용으로 전환하는 것을 고려하고 있지만 ldd가 실패한다는 사실에 여전히 놀랐습니다.

어떤 아이디어가 있나요? 클러스터에 루트 액세스 권한이 없습니다.

편집 1: 스트레스

클러스터 시스템에서 두 개의 시스템 호출 추적을 수행했습니다. 하나는 sniper 바이너리(ldd가 성공함)에 있고 다른 하나는 pin_sim.so 바이너리(ldd가 실패함)에 있습니다.

시작 부분부터 갈라지기 시작한 흥미로운 부분까지 잘라냈습니다.

편집 2: 이제 strace -f

strace -f ldd sniper:

faccessat(AT_FDCWD, "./sniper", R_OK)   = 0
faccessat(AT_FDCWD, "./sniper", X_OK)   = 0
faccessat(AT_FDCWD, "/lib/ld-linux.so.2", X_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/lib64/ld-linux-x86-64.so.2", X_OK) = 0
pipe([3, 4])                            = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
lseek(255, -52, SEEK_CUR)               = 5706
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x359287389d0) = 21112
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigaction(SIGCHLD, {0x6f679b3710, [], SA_RESTORER|SA_RESTART, 0x35927cffc20}, {0x6f679b3710, [], SA_RESTORER|SA_RESTART, 0x35927cffc20}, 8) = 0
close(4)                                = 0
read(3, Process 21112 attached
 <unfinished ...>
[pid 21112] close(255)                  = 0
[pid 21112] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 21112] rt_sigaction(SIGTSTP, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, {SIG_DFL, [], 0}, 8) = 0
[pid 21112] rt_sigaction(SIGTTIN, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, {SIG_DFL, [], 0}, 8) = 0
[pid 21112] rt_sigaction(SIGTTOU, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, {SIG_DFL, [], 0}, 8) = 0
[pid 21112] rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, 8) = 0
[pid 21112] rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, {SIG_IGN, [], SA_RESTORER, 0x35927cffc20}, 8) = 0
[pid 21112] rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x35927cffc20}, {0x6f679b3710, [], SA_RESTORER|SA_RESTART, 0x35927cffc20}, 8) = 0
[pid 21112] rt_sigaction(SIGCHLD, {0x6f679b3710, [], SA_RESTORER|SA_RESTART, 0x35927cffc20}, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x35927cffc20}, 8) = 0
[pid 21112] rt_sigaction(SIGINT, {0x6f679ce1a0, [], SA_RESTORER, 0x35927cffc20}, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, 8) = 0
[pid 21112] dup2(4, 1)                  = 1
[pid 21112] close(4)                    = 0
[pid 21112] close(3)                    = 0
[pid 21112] rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
[pid 21112] rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, {0x6f679ce1a0, [], SA_RESTORER, 0x35927cffc20}, 8) = 0
[pid 21112] rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, {SIG_DFL, [], SA_RESTORER, 0x35927cffc20}, 8) = 0
[pid 21112] rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x35927cffc20}, {0x6f679b3710, [], SA_RESTORER|SA_RESTART, 0x35927cffc20}, 8) = 0
[pid 21112] execve("/lib64/ld-linux-x86-64.so.2", ["/lib64/ld-linux-x86-64.so.2", "--verify", "./sniper"], [/* 51 vars */]) = 0
[pid 21112] brk(0)                      = 0x2d9db43c910
[pid 21112] open("./sniper", O_RDONLY|O_CLOEXEC) = 3
[pid 21112] read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\2\0>\0\1\0\0\0\321\307@\0\0\0\0\0"..., 832) = 832
[pid 21112] fstat(3, {st_mode=S_IFREG|0775, st_size=46853390, ...}) = 0
[pid 21112] getcwd("/path/to/sniper/lib", 128) = 52
[pid 21112] mmap(0x400000, 3837952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x400000
[pid 21112] mmap(0x9a8000, 626688, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3a8000) = 0x9a8000
[pid 21112] mmap(0xa41000, 32872, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xa41000
[pid 21112] close(3)                    = 0
[pid 21112] exit_group(0)               = ?
[pid 21111] <... read resumed> "", 128) = 0
[pid 21112] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21112, si_uid=169971, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG, NULL) = 21112
wait4(-1, 0x3e3bd435d80, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn()                          = 0
close(3)                                = 0
*** TRACE CONTINUES, no longer important because the other one has already errored out by this point ***

strace ldd -f pin_sim.so:

faccessat(AT_FDCWD, "./pin_sim.so", R_OK) = 0
faccessat(AT_FDCWD, "./pin_sim.so", X_OK) = 0
faccessat(AT_FDCWD, "/lib/ld-linux.so.2", X_OK) = -1 ENOENT (No such file or directory)
faccessat(AT_FDCWD, "/lib64/ld-linux-x86-64.so.2", X_OK) = 0
pipe([3, 4])                            = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
lseek(255, -52, SEEK_CUR)               = 5706
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x36aaed959d0) = 21099
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigaction(SIGCHLD, {0x798dd3a710, [], SA_RESTORER|SA_RESTART, 0x36aae35cc20}, {0x798dd3a710, [], SA_RESTORER|SA_RESTART, 0x36aae35cc20}, 8) = 0
close(4)                                = 0
read(3, Process 21099 attached
 <unfinished ...>
[pid 21099] close(255)                  = 0
[pid 21099] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 21099] rt_sigaction(SIGTSTP, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, {SIG_DFL, [], 0}, 8) = 0
[pid 21099] rt_sigaction(SIGTTIN, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, {SIG_DFL, [], 0}, 8) = 0
[pid 21099] rt_sigaction(SIGTTOU, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, {SIG_DFL, [], 0}, 8) = 0
[pid 21099] rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, 8) = 0
[pid 21099] rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, {SIG_IGN, [], SA_RESTORER, 0x36aae35cc20}, 8) = 0
[pid 21099] rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x36aae35cc20}, {0x798dd3a710, [], SA_RESTORER|SA_RESTART, 0x36aae35cc20}, 8) = 0
[pid 21099] rt_sigaction(SIGCHLD, {0x798dd3a710, [], SA_RESTORER|SA_RESTART, 0x36aae35cc20}, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x36aae35cc20}, 8) = 0
[pid 21099] rt_sigaction(SIGINT, {0x798dd551a0, [], SA_RESTORER, 0x36aae35cc20}, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, 8) = 0
[pid 21099] dup2(4, 1)                  = 1
[pid 21099] close(4)                    = 0
[pid 21099] close(3)                    = 0
[pid 21099] rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
[pid 21099] rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, {0x798dd551a0, [], SA_RESTORER, 0x36aae35cc20}, 8) = 0
[pid 21099] rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, 8) = 0
[pid 21099] rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x36aae35cc20}, {0x798dd3a710, [], SA_RESTORER|SA_RESTART, 0x36aae35cc20}, 8) = 0
[pid 21099] execve("/lib64/ld-linux-x86-64.so.2", ["/lib64/ld-linux-x86-64.so.2", "--verify", "./pin_sim.so"], [/* 51 vars */]) = 0
[pid 21099] brk(0)                      = 0x2b0b251b090
[pid 21099] open("./pin_sim.so", O_RDONLY|O_CLOEXEC) = 3
[pid 21099] read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240@\24\0\0\0\0\0"..., 832) = 832
[pid 21099] fstat(3, {st_mode=S_IFREG|0775, st_size=55707995, ...}) = 0
[pid 21099] getcwd("/path/to/sniper/lib", 128) = 52
[pid 21099] mmap(NULL, 12474024, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2b0af187000
[pid 21099] mprotect(0x2b0afa9b000, 2093056, PROT_NONE) = 0
[pid 21099] mmap(0x2b0afc9a000, 716800, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x913000) = 0x2b0afc9a000
[pid 21099] mmap(0x2b0afd49000, 145064, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b0afd49000
[pid 21099] mprotect(0x3a0fbff6000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSDOWN) = -1 EACCES (Permission denied)
[pid 21099] close(3)                    = 0
[pid 21099] exit_group(1)               = ?
[pid 21099] +++ exited with 1 +++
<... read resumed> "", 128)             = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21099, si_uid=169971, si_status=1, si_utime=0, si_stime=1} ---
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], WNOHANG, NULL) = 21099
wait4(-1, 0x3de445c7ac0, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn()                          = 0
close(3)                                = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x798dd36e90, [], SA_RESTORER, 0x36aae35cc20}, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x36aae35cc20}, {0x798dd36e90, [], SA_RESTORER, 0x36aae35cc20}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
faccessat(AT_FDCWD, "/libx32/ld-linux-x32.so.2", X_OK) = -1 ENOENT (No such file or directory)
fstat(1, {st_mode=S_IFCHR|0622, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x36aaed99000
write(1, "\tnot a dynamic executable\n", 26 not a dynamic executable
) = 26
read(255, "\nexit $result\n# Local Variables:"..., 5758) = 52
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(1)                           = ?
+++ exited with 1 +++

편집 3

readelf -Wl pin_sim.so:

Elf file type is DYN (Shared object file)
Entry point 0x1440a0
There are 7 program headers, starting at offset 64

Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x913415 0x913415 R E 0x200000
  LOAD           0x913990 0x0000000000b13990 0x0000000000b13990 0x0ae648 0x0d1d18 RW  0x200000
  DYNAMIC        0x9bf0f8 0x0000000000bbf0f8 0x0000000000bbf0f8 0x0002a0 0x0002a0 RW  0x8
  GNU_EH_FRAME   0x7fbee0 0x00000000007fbee0 0x00000000007fbee0 0x036cfc 0x036cfc R   0x4
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RWE 0x10
  GNU_RELRO      0x913990 0x0000000000b13990 0x0000000000b13990 0x0ac670 0x0ac670 R   0x1
  PAX_FLAGS      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000     0x8

 Section to Segment mapping:
  Segment Sections...
   00     .hash .dynsym .dynstr .gnu.version .gnu.version_d .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .charmversion .eh_frame_hdr .eh_frame .gcc_except_table 
   01     .init_array .fini_array .jcr .data.rel.ro .dynamic .got .data .pinclientint .bss 
   02     .dynamic 
   03     .eh_frame_hdr 
   04     
   05     .init_array .fini_array .jcr .data.rel.ro .dynamic .got 
   06

답변1

두 번째 strace 섹션에는 x32 바이너리에 대한 이상하지만 있을 법하지 않은 설명이 있습니다.

faccessat(AT_FDCWD, "/libx32/ld-linux-x32.so.2", X_OK) = -1 ENOENT (No such file or directory)

어쩌면 클러스터의 /lib64/ld-linux-x86-64.so.2가 pin_sim.so를 좋아하지 않을 수도 있습니다.

문제를 추가로 해결하려면 /lib64/ld-linux-x86-64.so.2 --list /path/to/your/pin_sim.so클러스터에서 실행해 보세요.

-f다음번에는 전체 프로세스 트리 추적을 활성화하는 strace 매개변수를 추가하는 것을 잊지 마세요 .

답변2

언급한 대로 WSL(Ubuntu 16.04)에서도 동일한 문제가 있습니다.논평그 이유는 내 라이브러리에 GNU_STACK RWE 플래그가 있지만 Ubuntu WSL이 이를 지원하지 않기 때문입니다. 따라서 도서관에 실제로 필요하지 않은 경우해결책다음 명령을 사용하여 라이브러리에서 E 플래그를 제거하는 것입니다.

sudo apt install execstack
execstack -c yourlib.so

관련 정보