שחרור ספריית מערכת Glibc 2.31

לאחר שישה חודשים של פיתוח פורסם שחרור ספריית מערכת ספריית GNU C (glibc) 2.31, התואם באופן מלא לדרישות של תקני ISO C11 ו-POSIX.1-2008. המהדורה החדשה כוללת תיקונים מ-58 מפתחים.

מאלה שיושמו ב-Glibc 2.31 שיפורים אתה יכול לציין:

  • נוסף מאקרו _ISOC2X_SOURCE כדי לאפשר יכולות המוגדרות בטיוטת תקן ה-ISO העתידי C2X. תכונות אלו מופעלות גם בעת שימוש במאקרו _GNU_SOURCE או בעת בנייה ב-gcc עם הדגל "-std=gnu2x";
  • עבור פונקציות המוגדרות בקובץ הכותרת "math.h" המעגלות את תוצאותיהן לסוג קטן יותר, מוצעות פקודות המאקרו הסוג הגנריות המקבילות בקובץ "tgmath.h", כנדרש לפי המפרט TS 18661-1:2014 ו-TS 18661-3: 2015;
  • נוספה פונקציית pthread_clockjoin_np() אשר ממתינה להשלמת השרשור, תוך התחשבות בפסק הזמן (אם פסק הזמן מתרחש לפני ההשלמה, הפונקציה תחזיר שגיאה). בניגוד pthread_timedjoin_np(), ב-pthread_clockjoin_np() ניתן להגדיר את סוג הטיימר לחישוב פסק הזמן - CLOCK_MONOTONIC (לוקח בחשבון את הזמן שהמערכת משקיעה במצב שינה) או CLOCK_REALTIME;
  • פותר ה-DNS תומך כעת באפשרות ה-trust-ad ב-/etc/resolv.conf ובדגל RES_TRUSTAD ב-_res.options, כאשר הוא מוגדר, דגל DNSSEC מועבר בבקשות DNS AD (נתונים מאומתים). במצב זה, דגל ה-AD שהוגדר על ידי השרת הופך זמין לאפליקציות הקוראות לפונקציות כמו res_search(). כברירת מחדל, אם האפשרויות המוצעות אינן מוגדרות, glibc אינו מציין את דגל ה-AD בבקשות ומנקה אותו אוטומטית בתגובות, מה שמציין שבדיקות DNSSEC חסרות;
  • בניית קבצי קריאות תקינים למערכת עבור Glibc כבר אינה מצריכה התקנת קבצי הכותרות של ליבת לינוקס. היוצא מן הכלל הוא ארכיטקטורת RISC-V של 64 סיביות;
  • מחוסל פגיעות CVE-2019-19126, המאפשר לך לעקוף את ההגנה
    ASLR בתוכניות עם דגל setuid וקבע את פריסת הכתובות בספריות טעונות באמצעות מניפולציה של משתנה הסביבה LD_PREFER_MAP_32BIT_EXEC.

שינויים שמפרים את התאימות:

  • totalorder(), totalordermag() ופונקציות דומות עבור סוגי נקודה צפה אחרים מקבלים כעת מצביעים כארגומנטים לביטול אזהרות לגבי המרת ערכים במצב NaN, בהתאם להמלצות TS 18661-1 המוצעות לתקן C2X העתידי.
    קובצי הפעלה קיימים המעבירים ארגומנטים של נקודה צפה ישירות ימשיכו לפעול ללא שינוי;

  • פונקציית הסטיים שהוצאה משימוש כבר אינה זמינה עבור קבצים בינאריים מקושרים ל-glibc, והגדרתה הוסרה מ-time.h. כדי להגדיר את זמן המערכת, השתמש בפונקציה clock_settime. בעתיד, אנו מתכננים להסיר את פונקציית ftime שהוצאה משימוש, כמו גם את קובץ הכותרת sys/timeb.h (יש להשתמש ב-gettimeofday או clock_gettime במקום ftime);
  • הפונקציה gettimeofday כבר לא מעבירה מידע על אזור הזמן הכולל של המערכת (תכונה זו הייתה רלוונטית בימי 4.2-BSD והוצאה משימוש במשך שנים רבות). כעת יש להעביר את הארגומנט 'tzp' מצביע null, ויש להשתמש בפונקציה localtime() כדי לקבל מידע על אזור זמן על סמך השעה הנוכחית. קריאה ל-gettimeofday עם ארגומנט שאינו אפס 'tzp' תחזיר שדות ריקים tz_minuteswest ו-tz_dsttime במבנה אזור הזמן. הפונקציה gettimeofday עצמה הוצאה משימוש תחת POSIX (מומלץ clock_gettime במקום gettimeofday), אך אין תוכניות להסיר אותה מ-glibc;
  • settimeofday כבר לא תומך בהעברת פרמטרים בו-זמנית לקביעת השעה וקיזוז תיקון הזמן. בעת קריאה ל-settimeofday, אחד מהארגומנטים (זמן או היסט) חייב להיות מוגדר כעת ל- null, אחרת קריאת הפונקציה תיכשל עם שגיאת EINVAL. כמו gettimeofday, הפונקציה settimeofday הוצאה משימוש על-ידי POSIX ומומלצת להיות מוחלפת בפונקציית clock_settime או במשפחת הפונקציות adjtime;
  • התמיכה בארכיטקטורת SPARC ISA v7 הופסקה (תמיכה ב-v8 נשמרת לעת עתה, אך רק עבור מעבדים התומכים בהוראות CAS, כגון מעבדי LEON, לא מעבדי SuperSPARC).
  • אם הצימוד נכשל ב"עצלן", שבו המקשר אינו מחפש סמלים של פונקציה עד הקריאה הראשונה לאותה פונקציה, הפונקציה dlopen מאלצת כעת את התהליך להסתיים (קודם לכן החזירה NULL בכשל);
  • עבור MIPS Hard Float ABI, נעשה כעת שימוש בערימת ההפעלה, אלא אם כן ה-build מגביל במפורש את השימוש בליבת לינוקס 4.8+ באמצעות הפרמטר "-enable-kernel=4.8.0" (עם ליבות עד 4.8, קריסות הן נצפה עבור כמה תצורות MIPS);
  • הקבצים סביב קריאות מערכת הקשורות למניפולציה בזמן הועברו לשימוש בקריאה למערכת time64, אם קיימת (במערכות 32 סיביות, glibc מנסה תחילה קריאות מערכת חדשות שמתפעלות את סוג הזמן של 64 סיביות, ואם אין כאלה, נופלות חזרה לשיחות 32 סיביות הישנות).

מקור: OpenNet.ru

הוספת תגובה