2010-02-24 26 views
10

Tôi đang sử dụng hệ thống dev nơi tôi phải chỉ định tên lib khi truy cập một hàm bên trong nó.Xác định thư viện hệ thống Linux nào có chức năng

Tôi đã sử dụng các chức năng như open() trước đây và bằng cách nào đó đã phát hiện ra rằng chúng đang ở trong libc.so.

Bây giờ tôi muốn sử dụng lstat(), nhưng có vẻ như cái này không có trong libc. Đáng buồn thay, các trang người đàn ông tôi nhìn không ghi lại vị trí của các chức năng.

Vì vậy, hai câu hỏi:

  1. Có thể ai đó nói mà host lib lstat?
  2. Tôi có thể tìm thấy điều này bằng cách nào? Ngoài việc sử dụng grep "name" trên tất cả các tệp trong thư mục lib, ý tôi là.
+1

Có thể bạn không sử dụng 'nm' lệnh cho điều này: 'nm lib * .so * | grep lstat'. Untested do đó bình luận, không trả lời. –

+1

Hệ thống dev nào? –

+0

lstat không có mặt như một biểu tượng trong libc, nó có vẻ được gọi là __lxstat, và có thể được giải quyết tại thời điểm liên kết – nos

Trả lời

5

Xây dựng một testcase đơn giản trong C, biên dịch và chạy 'ldd -r 'trên nó để kiểm tra những gì libs được nạp. Nếu bạn không nhận được lstat() trong C thì bạn có một vấn đề về env dev của bạn. Hoặc ngày env này trở lại trước thời đại của các liên kết tượng trưng :-)

+0

ý tưởng tốt. Trong trường hợp này, vấn đề thực sự là có thực sự không có lstat trong lib, nhưng chỉ __lxstat. Mà có thể được nhìn thấy trong các tiêu đề, mặc dù. –

+0

Ý tưởng này không quá tốt nếu có chức năng từ thư viện không xác định và không được liên kết theo mặc định. Sẽ không có nhị phân nào để chạy 'ldd' trước khi tên thư viện được thêm vào liên kết nhị phân. PS: cũng có 'LD_DEBUG = all./Binary' để xem quá trình liên kết thực tế; ld.so sẽ hiển thị những biểu tượng được yêu cầu và nơi nó cố gắng tìm chúng. – osgx

-1

Từ manpage (người đàn ông lstat):

LSTAT(P) 

NAME 
     lstat - get symbolic link status 

SYNOPSIS 
     #include <sys/stat.h> 

     int lstat(const char *restrict path, struct stat *restrict buf); 
+3

OP muốn biết thư viện nào cuối cùng sẽ được lưu trữ trong thư viện, chứ không phải tệp tiêu đề nào. – Duck

3

Đây là một cách để làm điều đó:

[email protected]:~$ cd /usr/lib 
[email protected]:/usr/lib$ grep "lstat()" * 
Binary file libperl.so.5.10 matches 
Binary file libperl.so.5.10.0 matches 
[email protected]:/usr/lib$ 
+2

libperl?Điều đó không thể đúng. Sử dụng lệnh 'nm' thay thế. Chẳng hạn như 'nm lib * .so * | grep lstat'. –

+0

Có, grep cũng hiển thị _imports_, tôi tin, do đó kết quả sai về libperl. –

+1

libperl phù hợp vì nó chứa chuỗi 'lstat()', là một hàm Perl được triển khai ở đây. Điều đó ít liên quan đến syscall bên dưới. – ephemient

-1

lstat là trong libc, và libc được liên kết theo mặc định. Bạn không cần phải làm gì để sử dụng lstat ngoài bao gồm các tập tin tiêu đề cho nó #include <sys/stat.h>

trang người đàn ông thường nêu mà thư viện họ đang ở.

+1

Tôi nghĩ rằng tôi đã chỉ ra rõ ràng rằng đây không phải là về C nhưng về một env dev nơi tôi cần phải xác định các lib một cách rõ ràng. –

+0

Tuy nhiên, nó là trong libc, do đó, liên kết đến libc. Nếu đây là một số môi trường mà có rất ít để làm với những gì thường được tìm thấy trên một máy linux, bạn cần phải cho chúng tôi biết loại môi trường này là gì. Không có cách nào để biết các hàm nằm bên cạnh tài liệu của nó - cái mà đôi khi thiếu. – nos

+0

nos - lý do duy nhất tại sao tôi không thể tìm thấy nó trong libc là nó đã không được tuyên bố ở đó, như bạn đã chỉ ra ở trên. Tôi đã giải quyết nó ngay bây giờ, cảm ơn. –

1

Khi tôi biên dịch các ứng dụng Windows trên Linux, nếu tôi gặp vấn đề với liên kết, tôi có xu hướng sử dụng tập lệnh này mà tôi đặt tên là mingw-findin. Một kịch bản tương tự có thể được sử dụng để biên dịch Linux thông thường, thay vì sử dụng phương pháp thay thế mingw, sử dụng nm thường xuyên và thay vì tìm trong thư mục có tiền tố biên dịch chéo, xem trong/usr/lib. Để sử dụng kịch bản này, tôi chạy

./mingw-findin NameOfFunction

Dưới đây là các mã:

#!/bin/sh 
liblist=` ls /usr/x86_64-w64-mingw32/lib ` 

for i in $liblist 
do 

if x86_64-w64-mingw32-nm /usr/x86_64-w64-mingw32/lib/$i | grep -q $1; then 
     echo $i 
     x86_64-w64-mingw32-nm /usr/x86_64-w64-mingw32/lib/$i | grep $1 
fi 

done 
+0

Hoặc 'nm' với cờ' -D'? Trên linux cũng có/lib; vì vậy chúng ta nên kiểm tra /etc/ld.so.conf và /etc/ld.so.conf.d/* cho các đường dẫn tìm kiếm của các thư viện. – osgx

0

Cố gắng này:

$ cat ./foobar.c 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
int main(void) 
{ 
    struct stat buf; 
    return lstat(".", &buf); 
} 


$ LD_DEBUG=bindings ./foobar 2>&1 | grep stat 
31000: binding file ./foobar [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: \ 
normal symbol `__lxstat' [GLIBC_2.2.5] 
Các vấn đề liên quan