كيف يمكنني العثور على أي تبعية قزم لا تتحقق؟

StackOverflow https://stackoverflow.com/questions/1562071

  •  21-09-2019
  •  | 
  •  

سؤال

لقد قمت ببناء برنامج lef test باستخدام LSB SDK (لاحظ أن سؤالي ليس خاصًا بـ LSB):

$ /opt/lsb/bin/lsbcc tst.c
$ ls -l a.out 
-rwxr-xr-x 1 math math 10791 2009-10-13 20:13 a.out
$ file a.out 
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

لكنني غير قادر على إطلاقه (نعم ، أؤكد لكم الملف هو في الدليل ...):

$ ./a.out 
bash: ./a.out: No such file or directory

$ uname -a
Linux math 2.6.28-15-generic #52-Ubuntu SMP Wed Sep 9 10:48:52 UTC 2009 x86_64 GNU/Linux

أعتقد أن هناك تبعية قزم لا تفي ولكني لا أعرف كيف أجدها. هل هناك أداة مماثلة لـ LDD للمكتبات التي يمكن استخدامها لتجد الرابط المفقود؟

لا أعتقد أنه مرتبط بفرق 2.6.15/2.6.28-15 لأن برنامج التحويل البرمجي LSB يعمل:

$ file /opt/lsb/bin/lsbcc 
/opt/lsb/bin/lsbcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped

فقط في حالة ، إليك القسم الديناميكي ELF من A.Out:

 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400428
 0x000000000000000d (FINI)               0x400638
 0x0000000000000004 (HASH)               0x400278
 0x0000000000000005 (STRTAB)             0x400350
 0x0000000000000006 (SYMTAB)             0x4002a8
 0x000000000000000a (STRSZ)              121 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x600fe8
 0x0000000000000002 (PLTRELSZ)           24 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x400410
 0x0000000000000007 (RELA)               0x4003f8
 0x0000000000000008 (RELASZ)             24 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x4003d8
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0x4003ca
 0x0000000000000000 (NULL)               0x0
هل كانت مفيدة؟

المحلول

هذا يبدو كما يحدث عندما يكون مترجم ELF مفقودًا.

ضمان /lib/ld-lsb.so.2 (أو ما شابه ؛ يختلف عن طريق إصدار LSB والهندسة المعمارية). ldd و readelf -l سيكون قادرًا على إظهار مترجم ELF الذي يطلبه القابل للتنفيذ.

(lsbcc (أو شيء ما في أدوات LSB) يتجاوز افتراضي النظام /lib/ld-linux.so.2, ربما عن طريق المرور -Wl,--dynamic-linker=/lib/ld-lsb.so.2 بالنسبة إلى المترجم ، لأسباب أعتقد أنها سخيفة إلى حد ما (لقد قدمت GLIBC دائمًا توافقًا متخلفًا إلى حد ما هنا) ، ولكن هناك.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top