Perbedaan antara / usr / include / sys dan / usr / include / linux?

12

Yah, jelas ada perbedaan, tetapi saya ingin tahu tentang alasan mengapa beberapa hal berada di bawah / usr / include / sys dan yang lainnya masuk ke / usr / include / linux, dan memiliki nama file header yang sama? Apakah ini ada hubungannya dengan POSIX vx non-POSIX?

Juga, saya telah berhasil mengisi / usr / include / linux dengan header pada sistem Fedora saya dengan mengambil paket kernel-header, apakah ada nama paket standar untuk mendapatkan file header yang berada di bawah / usr / include / sys ? Saya belum dapat menemukannya.

Jeff
sumber

Jawaban:

14

Header di bawah /usr/include/linuxdan di bawah /usr/include/asm*didistribusikan dengan kernel Linux. Header lainnya ( /usr/include/sys/*.h,, /usr/include/bits/*.hdan banyak lagi) didistribusikan dengan pustaka C (pustaka GNU C , juga dikenal sebagai glibc, pada semua sistem Linux yang tidak tertanam). Ada sedikit penjelasan dalam manual glibc .

Perhatikan bahwa /usr/include/linuxdan /usr/include/asmharus berisi tajuk yang digunakan saat mengkompilasi pustaka C, bukan tajuk dari kernel yang berjalan. Jika tidak, jika beberapa konstanta atau struktur data berubah, akan ada ketidakkonsistenan antara program yang dikompilasi dan pustaka C, yang kemungkinan akan mengakibatkan crash atau lebih buruk. (Jika header cocok dengan pustaka C tetapi pustaka C tidak cocok dengan kernel, apa yang sebenarnya terjadi adalah bahwa kernel dirancang untuk menjaga ABI yang stabil dan harus mendeteksi bahwa itu disebut di bawah ABI yang berbeda dan menafsirkan argumen syscall sesuai. kernel harus melakukan ini untuk program yang dikompilasi secara statis.

Saya ingat perdebatan sengit antara Debian dan Red Hat beberapa saat (satu dekade?) Yang lalu tentang /usr/include/linuxmasalah ini; rupanya masing-masing pihak menempel pada posisinya. (Sejauh yang saya mengerti, Debian benar, seperti yang dijelaskan di atas.) Debian saat ini mendistribusikan /usr/include/linuxdan teman-teman dalam linux-libc-devpaket, yang dikompilasi dari sumber kernel tetapi tidak ditingkatkan dengan kernel. Header kernel ada dalam paket versi khusus yang menyediakan linux-headers-2.6metapackage; inilah yang Anda perlukan untuk mengkompilasi modul untuk versi kernel tertentu.

Paket yang Anda cari adalah header C library. Saya tidak tahu apa namanya, tetapi Anda bisa mengetahuinya yum provides /usr/include/sys/types.h.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Jawaban untuk bit terakhir adalah glibc-headers.
mattdm