2012-07-07 43 views
26

Khi chúng tôi gỡ lỗi chương trình bằng gdb, chúng ta thường thấy các hàm có tên lạ được xác định trong libc (glibc?). Câu hỏi của tôi là:Vai trò của libc (glibc) trong ứng dụng linux của chúng ta là gì?

  1. Có phải là libc/glibc việc triển khai chuẩn của một số hàm C/C++ chuẩn như "strcpy", "strlen", "malloc"?
  2. Hoặc, nó không chỉ là cách sử dụng đầu tiên như được mô tả ở trên, mà còn là một trình bao bọc của các cuộc gọi hệ thống Unix/Linux như "mở", "đóng", "fctl"? Nếu vậy, tại sao chúng ta không thể phát hành syscalls trực tiếp, không có libc?
  3. libc chỉ bao gồm một tệp lib (.a hoặc .so) hay nhiều tệp lib (trong trường hợp này, libc là tên chung của tập hợp lib này)? Các tệp lib này nằm ở đâu?
  4. Sự khác nhau giữa libc và glibc là gì?

Trả lời

1

Đó là "thư viện chuẩn". Nó chính xác như "MSVCRTL" trong thế giới Windows.

Thư viện chuẩn Gnu ("glibc") là việc triển khai libc phổ biến nhất (hầu như phổ biến?) Được tìm thấy trên các hệ thống Linux. Dưới đây là các tập tin có liên quan về một tuổi hệ thống SUSE Linux:

ls -l /lib => 
-rwxr-xr-x 1 root root 1383527 2005-06-14 08:36 libc.so.6 

ls -l /usr/lib => 
-rw-r--r-- 1 root root 2580354 2005-06-14 08:20 libc.a 
-rw-r--r-- 1 root root  204 2005-06-14 08:20 libc.so 

Liên kết này nên trả lời bất kỳ câu hỏi bổ sung mà bạn có thể có (bao gồm cả tài liệu tham khảo để mã nguồn đầy đủ và hoàn glibc):

+0

tks, chân thành, paulsm4 – basketballnewbie

10

Đối với hai trường hợp đầu tiên, glibc là cả thư viện chuẩn C (ví dụ: "hàm C chuẩn") và trình bao bọc cho các cuộc gọi hệ thống. Bạn không thể phát trực tiếp các cuộc gọi hệ thống vì trình biên dịch không biết cách - glibc chứa "keo" cần thiết để phát hành các cuộc gọi hệ thống, được viết trong assembly. (Có thể reimplement này chính mình, nhưng nó hơn rất nhiều rắc rối hơn nó có giá trị.)

(thư viện chuẩn C++ là một điều riêng biệt, nó được gọi là libstdc++.)

glibc không phải là một đơn .so (thư viện động) - có một nhóm, nhưng libc và libm là hai loại được sử dụng phổ biến nhất. Tất cả các thư viện tĩnh và động được lưu trữ trong /lib.

libc là một thuật ngữ chung được sử dụng để chỉ tất cả các thư viện chuẩn C - có một số. glibc là loại được sử dụng phổ biến nhất; những người khác bao gồm eglibc, uclibc, và dietlibc.

+0

duskwuff, bạn là khá rõ ràng, thưởng thức help.really của bạn, – basketballnewbie

37

libc thực hiện cả hai chức năng C chuẩn như strcpy() và chức năng POSIX (có thể là cuộc gọi hệ thống) như getpid(). Lưu ý rằng không phải tất cả các hàm C chuẩn đều nằm trong libc - hầu hết các hàm toán học đều nằm trong libm.

Bạn không thể thực hiện trực tiếp các cuộc gọi hệ thống giống như cách bạn gọi các chức năng bình thường vì các cuộc gọi tới hạt nhân không phải là các cuộc gọi hàm bình thường, vì vậy chúng không thể được giải quyết bởi trình liên kết. Thay vào đó, các khối ngôn ngữ lắp ráp kiến ​​trúc cụ thể được sử dụng để gọi vào hạt nhân - bạn cũng có thể viết chúng trực tiếp trong chương trình của riêng bạn, nhưng bạn không cần phải vì libc cung cấp chúng cho bạn.

Lưu ý rằng trong Linux, đó là sự kết hợp của hạt nhân và libc cung cấp API POSIX.libc thêm một số tiền phong nha của giá trị - không phải mọi chức năng POSIX nhất thiết phải là một cuộc gọi hệ thống, và đối với những người đang có, hành vi hạt nhân không phải lúc nào cũng tuân theo POSIX.

libc là một tệp thư viện duy nhất (cả hai phiên bản .so.a đều có sẵn) và trong hầu hết các trường hợp, nằm trong /usr/lib. Tuy nhiên, dự án glibc (GNU libc) cung cấp nhiều hơn chỉ libc - nó cũng cung cấp libm được đề cập trước đó và các thư viện lõi khác như libpthread. Vì vậy, libc chỉ là một trong các thư viện được cung cấp bởi glibc - và có các triển khai thay thế khác của libc khác với glibc.

+0

caf, chỉ nhờ vào bạn – basketballnewbie

0

Bạn có thể kiểm tra thông tin chi tiết về "libc" và "glibc" từ trang người đàn ông trên hệ thống linux của bạn bằng cách nhập "man libc" trên vỏ, sao chép như sau;

LIBC(7)  Linux Programmer's Manual  LIBC(7) 

NAME 
     libc - overview of standard C libraries on Linux 

DESCRIPTION 
     The term "libc" is commonly used as a shorthand for the "standard C library", a library of standard functions that can be 
     used by all C programs (and sometimes by programs in other languages). Because of some history (see below), use of the 
     term "libc" to refer to the standard C library is somewhat ambiguous on Linux. 

    glibc 
     By far the most widely used C library on Linux is the GNU C Library ⟨http://www.gnu.org/software/libc/⟩, often referred 
     to as glibc. This is the C library that is nowadays used in all major Linux distributions. It is also the C library 
     whose details are documented in the relevant pages of the man-pages project (primarily in Section 3 of the manual). Doc‐ 
     umentation of glibc is also available in the glibc manual, available via the command info libc. Release 1.0 of glibc was 
     made in September 1992. (There were earlier 0.x releases.) The next major release of glibc was 2.0, at the beginning of 
     1997. 

     The pathname /lib/libc.so.6 (or something similar) is normally a symbolic link that points to the location of the glibc 
     library, and executing this pathname will cause glibc to display various information about the version installed on your 
     system. 

    Linux libc 
     In the early to mid 1990s, there was for a while Linux libc, a fork of glibc 1.x created by Linux developers who felt 
     that glibc development at the time was not sufficing for the needs of Linux. Often, this library was referred to 
     (ambiguously) as just "libc". Linux libc released major versions 2, 3, 4, and 5 (as well as many minor versions of those 
     releases). For a while, Linux libc was the standard C library in many Linux distributions. 

     However, notwithstanding the original motivations of the Linux libc effort, by the time glibc 2.0 was released (in 1997), 
     it was clearly superior to Linux libc, and all major Linux distributions that had been using Linux libc soon switched 
     back to glibc. Since this switch occurred long ago, man-pages no longer takes care to document Linux libc details. Nev‐ 
     ertheless, the history is visible in vestiges of information about Linux libc that remain in some manual pages, in par‐ 
     ticular, references to libc4 and libc5. 
Các vấn đề liên quan