文章目录

  • 1. 名称
  • 2. 概要
  • 3. 描述
    • 3.1. 动态字符串标记
  • 4. 选项
  • 5. 环境
    • 5.1. 安全执行模式
    • 5.2. 环境变量
      • 5.2.1. LD_ASSUME_KERNEL(自 glibc 2.2.3 起)
      • 5.2.2. LD_BIND_NOW(自 glibc 2.1.1 起)
      • 5.2.3. LD_LIBRARY_PATH
      • 5.2.4. LD_PRELOAD
      • 5.2.5. LD_TRACE_LOADED_OBJECTS
      • 5.2.6. LD_AUDIT(自 glibc 2.4 起)
      • 5.2.7. LD_BIND_NOT(自 glibc 2.1.95 起)
      • 5.2.8. LD_DEBUG(自 glibc 2.1 起)
      • 5.2.9. LD_DEBUG_OUTPUT(自 glibc 2.1 起)
      • 5.2.10. LD_DYNAMIC_WEAK(自 glibc 2.1.91 起)
      • 5.2.11. LD_HWCAP_MASK(自 glibc 2.1 起)
      • 5.2.12. LD_ORIGIN_PATH(自 glibc 2.1 起)
      • 5.2.13. LD_POINTER_GUARD(glibc 从 2.4 到 2.22)
      • 5.2.14. LD_PROFILE(自 glibc 2.1 起)
      • 5.2.15. LD_PROFILE_OUTPUT(自 glibc 2.1 起)
      • 5.2.16. LD_SHOW_AUXV(自 glibc 2.1 起)
      • 5.2.17. LD_TRACE_PRELINKING(自 glibc 2.4 起)
      • 5.2.18. LD_USE_LOAD_BIAS(自 glibc 2.3.3 起)
      • 5.2.19. LD_VERBOSE(自 glibc 2.1 起)
      • 5.2.20. LD_PREFER_MAP_32BIT_EXEC(仅限 x86-64;自 glibc 2.23 起)
  • 6. 文件
  • 7. 注意
    • 7.1. 硬件能力

1. 名称

ld.so,ld-linux.so - dynamic linker/loader 动态链接器/加载器

手册页:https://man7.org/linux/man-pages/man8/ld-linux.so.8.html

2. 概要

动态链接器可以通过运行一些动态链接程序或共享对象来间接运行(在这种情况下,不能将命令行选项传递给动态链接器,在 ELF 情况下,动态链接器存储在程序的 .interp 段中被执行)或直接运行:

/lib/ld-linux.so.*  [OPTIONS] [PROGRAM [ARGUMENTS]]

3. 描述

程序 ld.so 和 ld-linux.so* 查找并加载程序所需的共享对象(共享库),准备程序运行,然后运行它。

Linux 二进制文件需要动态链接(在运行时链接),除非在编译期间为 ld(1) 提供了 -static 选项。

程序 ld.so 处理 a.out 二进制文件,这是一种很久以前使用的二进制格式。程序 ld-linux.so*(libc5 为 /lib/ld-linux.so.1,glibc2 为 /lib/ld-linux.so.2)处理采用更现代 ELF 格式的二进制文件。这两个程序具有相同的行为,并使用相同的支持文件和程序(ldd(1)、ldconfig(8) 和 /etc/ld.so.conf)。

解析共享对象依赖项时,动态链接器首先检查每个依赖项字符串以查看它是否包含斜杠(如果在链接时指定了包含斜杠的共享对象路径名,则会发生这种情况)。如果找到斜杠,则依赖字符串被解释为(相对或绝对)路径名,并使用该路径名加载共享对象。

如果共享对象依赖项不包含斜杠,则按以下顺序搜索它:

  • 使用二进制文件的 DT_RPATH 动态段(section)属性中指定的目录(如果存在且 DT_RUNPATH 属性不存在)。不推荐使用 DT_RPATH。
  • 使用环境变量 LD_LIBRARY_PATH,除非可执行文件在安全执行模式下运行(见下文),在这种情况下该变量将被忽略。
  • 使用二进制文件的 DT_RUNPATH 动态段属性中指定的目录(如果存在)。搜索此类目录只是为了找到 DT_NEEDED(直接依赖项)条目所需的那些对象,而不适用于这些对象的子对象,这些子对象本身必须具有自己的 DT_RUNPATH 条目。这与 DT_RPATH 不同,DT_RPATH 应用于搜索依赖树中的所有子项。
  • 来自缓存文件 /etc/ld.so.cache,其中包含先前在扩充库路径中找到的候选共享对象的编译列表。但是,如果使用 -z nodeflib 链接器选项链接二进制文件,则会跳过默认路径中的共享对象。安装在硬件功能目录(见下文)中的共享对象优先于其他共享对象。
  • 在默认路径 /lib 中,然后是 /usr/lib。 (在某些 64 位体系结构上,64 位共享对象的默认路径是 /lib64,然后是 /usr/lib64。)如果使用 -z nodeflib 链接器选项链接二进制文件,则跳过此步骤。

3.1. 动态字符串标记

在几个地方,动态链接器扩展了动态字符串标记(token):

  • 在环境变量 LD_LIBRARY_PATHLD_PRELOADLD_AUDIT 中,
  • 在 ELF 二进制文件的动态段标签 DT_NEEDEDDT_RPATHDT_RUNPATHDT_AUDITDT_DEPAUDIT 的值中,
  • 在 ld.so 命令行选项的参数中 --audit、–library-path 和 --preload(见下文),以及
  • 在 dlopen(3) 和 dlmopen(3) 函数的文件名参数中。

替换的标记如下:

  • $ORIGIN(或等效的 ${ORIGIN})
    这将扩展到包含程序或共享对象的目录。因此,位于 somedir/app 中的应用程序可以编译为:

    gcc -Wl,-rpath,'$ORIGIN/../lib'
    

    以便它在 somedir/lib 中找到关联的共享对象,无论 somedir 在目录层次结构中的位置。这有助于创建“turn-key”应用程序,这些应用程序不需要安装到特殊目录中,而是可以解压缩到任何目录中,并且仍然可以找到自己的共享对象。

  • $LIB(或等效的 ${LIB})
    这会根据架构扩展到 lib 或 lib64(例如,在 x86-64 上,它扩展到 lib64,在 x86-32 上,它扩展到 lib)。
  • $PLATFORM(或等效的 ${PLATFORM})
    这将扩展为与主机系统的处理器类型相对应的字符串(例如,“x86_64”)。在某些体系结构上,Linux 内核不向动态链接器提供平台字符串。此字符串的值取自辅助向量中的 AT_PLATFORM 值(请参阅 getauxval(3))。

请注意,从 shell 设置时,必须正确引用动态字符串标记,以防止它们扩展为 shell 或环境变量。

4. 选项

  • --argv0 string (since glibc 2.33)
    在运行程序之前将 argv[0] 设置为值string。

  • --audit list
    使用list中命名的对象作为审计员。list中的对象以冒号分隔。

  • --inhibit-cache
    不使用 /etc/ld.so.cache。

  • --library-path path
    使用 path 而不是 LD_LIBRARY_PATH 环境变量设置(见下文)。名称 ORIGIN、LIB 和 PLATFORM 被解释为 LD_LIBRARY_PATH 环境变量。

  • --inhibit-rpath list
    忽略list中对象名称中的 RPATH 和 RUNPATH 信息。在安全执行模式下运行时会忽略此选项(见下文)。list中的对象由冒号或空格分隔。

  • --list
    列出所有依赖项以及它们是如何解决的。

    [maminjie@fedora hello]$ /lib64/ld-linux-x86-64.so.2 --list ./hello linux-vdso.so.1 (0x00007ffda6969000)libc.so.6 => /lib64/libc.so.6 (0x00007f7f1202b000)/lib64/ld-linux-x86-64.so.2 (0x00007f7f1220b000)
    
  • --preload list (since glibc 2.30)
    预加载list中指定的对象。list中的对象由冒号或空格分隔。这些对象已按照以下 LD_PRELOAD 环境变量的描述中的说明进行预加载。

    与 LD_PRELOAD 相比,–preload 选项提供了一种为单个可执行文件执行预加载的方法,而不会影响在执行新程序的任何子进程中执行的预加载。

  • --verify
    验证程序是动态链接的,并且此动态链接器可以处理它。

5. 环境

各种环境变量影响动态链接器的运行。

5.1. 安全执行模式

出于安全原因,如果动态链接器确定一个二进制文件应该在安全执行模式下运行,那么一些环境变量的作用就会失效或被修改,而且这些环境变量会从环境中剥离出来,这样程序甚至不会见定义。其中一些环境变量会影响动态链接器本身的操作,如下所述。其他以这种方式处理的环境变量包括:GCONV_PATH、GETCONF_DIR、HOSTALIASES、LOCALDOMAIN、LOCPATH、MALLOC_TRACE、NIS_PATH、NLSPATH、RESOLV_HOST_CONF、RES_OPTIONS、TMPDIR 和 TZDIR。

如果辅助向量中的 AT_SECURE 条目(请参阅 getauxval(3))具有非零值,则以安全执行模式执行二进制文件。由于各种原因,此条目可能具有非零值,包括:

  • 进程的真实有效用户ID不同,或者真实有效组ID不同。这通常是执行 set-user-ID 或 set-group-ID 程序的结果。
  • 具有非 root 用户 ID 的进程执行了一个赋予进程功能的二进制文件。
  • 非零值可能已由 Linux 安全模块设置。

5.2. 环境变量

比较重要的环境变量如下:

5.2.1. LD_ASSUME_KERNEL(自 glibc 2.2.3 起)

每个共享对象都可以通知动态链接器它需要的最低内核 ABI 版本。 (此要求编码在 ELF 注释部分中,可通过 readelf -n 作为标记为 NT_GNU_ABI_TAG 的段查看。)在运行时,动态链接器确定正在运行的内核的 ABI 版本,并将拒绝加载指定最低 ABI 版本的共享对象超过那个 ABI 版本。

maminjie@fedora ~/w/g/test> readelf -n hello | grep -C3 NT_GNU_ABI_TAGDisplaying notes found in: .note.ABI-tagOwner                Data size        DescriptionGNU                  0x00000010       NT_GNU_ABI_TAG (ABI version tag)OS: Linux, ABI: 3.2.0Displaying notes found in: .gnu.build.attributes

LD_ASSUME_KERNEL 可用于使动态链接器假定它在具有不同内核 ABI 版本的系统上运行。例如,以下命令行使动态链接器在加载 myprog 所需的共享对象时假定它在 Linux 2.2.5 上运行:

$ LD_ASSUME_KERNEL=2.2.5 ./myprog

在提供具有不同最低内核 ABI 版本要求的共享对象的多个版本(在搜索路径中的不同目录中)的系统上,LD_ASSUME_KERNEL 可用于选择使用的对象版本(取决于目录搜索顺序)

从历史上看,LD_ASSUME_KERNEL 功能的最常见用途是在提供 LinuxThreads 和 NPTL(后者通常是此类系统的默认设置)的系统上手动选择较旧的 LinuxThreads POSIX 线程实现;请参阅 pthreads(7)。

5.2.2. LD_BIND_NOW(自 glibc 2.1.1 起)

如果设置为非空字符串,则使动态链接器在程序启动时解析所有符号,而不是将函数调用解析推迟到首次引用它们时的时间点。这在使用调试器时很有用。

5.2.3. LD_LIBRARY_PATH

在执行时搜索 ELF 库的目录列表。列表中的项目由冒号或分号分隔,并且不支持转义任一分隔符。零长度的目录名称表示当前工作目录。

在安全执行模式下会忽略此变量。

在 LD_LIBRARY_PATH 中指定的路径名​​中,动态链接器扩展标记 $ORIGIN、$LIB 和 $PLATFORM(或名称周围使用花括号的版本),如上面动态字符串标记中所述。因此,例如,以下将导致在包含要执行的程序的目录下的 lib 或 lib64 子目录中搜索库:

$ LD_LIBRARY_PATH='$ORIGIN/$LIB' orig

(注意单引号的使用,这会阻止 $ORIGIN 和 $LIB 作为 shell 变量的扩展!)

5.2.4. LD_PRELOAD

要在所有其他对象之前加载的其他用户指定的 ELF 共享对象的列表。此功能可用于选择性地覆盖其他共享对象中的功能。

列表的项目可以用空格或冒号分隔,并且不支持转义任何一个分隔符。使用描述下给出的规则搜索对象。按照列表中指定的从左到右的顺序搜索对象并将其添加到链接映射中。

在安全执行模式下,包含斜杠的预加载路径名将被忽略。此外,共享对象仅从标准搜索目录预加载,并且仅当它们启用了 set-user-ID 模式位(这不是典型的)。

在 LD_PRELOAD 列表中指定的名称中,动态链接器理解标记 $ORIGIN、$LIB 和 $PLATFORM(或名称周围使用大括号的版本),如上面动态字符串标记中所述。 (另请参阅 LD_LIBRARY_PATH 描述下的引用讨论。)

有多种指定要预加载的库的方法,这些方法按以下顺序处理:

(1) LD_PRELOAD 环境变量。
(2) 直接调用动态链接器时的 --preload 命令行选项。
(3) /etc/ld.so.preload 文件(如下所述)。

5.2.5. LD_TRACE_LOADED_OBJECTS

如果设置(设置为任何值),将导致程序列出其动态依赖项,就像由 ldd(1) 运行一样,而不是正常运行。

然后有许多或多或少模糊的变量,许多已过时或仅供内部使用。

5.2.6. LD_AUDIT(自 glibc 2.4 起)

用户指定的、ELF 共享对象的列表,这些对象要在单独的链接器命名空间中的所有其他对象之前加载(即,不会干扰进程中将发生的正常符号绑定)这些对象可用于审计操作动态链接器。列表中的项目以冒号分隔,不支持转义分隔符。

LD_AUDIT 在安全执行模式下被忽略。

动态链接器将在所谓的审计检查点(例如,加载新的共享对象、解析符号或从另一个共享对象调用符号)通过调用审计共享对象中的适当函数通知审计共享对象。有关详细信息,请参阅 rtld-audit(7)。审计接口在很大程度上与 Solaris 上提供的接口兼容,如运行时链接器审计接口一章中的链接器和库指南中所述。

在 LD_AUDIT 列表中指定的名称中,动态链接器理解标记 $ORIGIN、$LIB 和 $PLATFORM(或名称周围使用大括号的版本),如上面动态字符串标记中所述。 (另请参阅 LD_LIBRARY_PATH 描述下的引用讨论。)

从 glibc 2.13 开始,在安全执行模式下,审核列表中包含斜杠的名称将被忽略,并且仅加载启用了 set-user-ID 模式位的标准搜索目录中的共享对象。

5.2.7. LD_BIND_NOT(自 glibc 2.1.95 起)

如果将此环境变量设置为非空字符串,则在解析函数符号后不要更新 GOT(全局偏移表)和 PLT(过程链接表)。通过将此变量与 LD_DEBUG(与类别绑定和符号)结合使用,可以观察所有运行时函数绑定。

5.2.8. LD_DEBUG(自 glibc 2.1 起)

输出有关动态链接器操作的详细调试信息。此变量的内容是以下类别之一,以冒号逗号或(如果值被引用)空格分隔:

  • help
    在此变量的值中指定 help 不会运行指定的程序,并显示有关可以在此环境变量中指定哪些类别的帮助消息。
  • all
    打印所有调试信息(统计和未使用除外;见下文)。
  • bindings
    显示有关每个符号绑定到哪个定义的信息。
  • files
    显示输入文件的进度。
  • libs
    显示库搜索路径。
  • reloc
    显示重定位处理。
  • scopes
    显示范围信息。
  • statistics
    显示重定位统计信息。
  • symbols
    显示每个符号查找的搜索路径。
  • unused
    确定未使用的 DSO。
  • versions
    显示版本依赖。

从 glibc 2.3.4 开始,LD_DEBUG 在安全执行模式下被忽略,除非文件 /etc/suid-debug 存在(文件的内容无关紧要)。

5.2.9. LD_DEBUG_OUTPUT(自 glibc 2.1 起)

默认情况下,LD_DEBUG 输出写入标准错误。如果定义了 LD_DEBUG_OUTPUT,则输出将写入由其值指定的路径名​​,后缀为“.”。 (点)后跟附加到路径名的进程 ID。

LD_DEBUG_OUTPUT 在安全执行模式下被忽略。

5.2.10. LD_DYNAMIC_WEAK(自 glibc 2.1.91 起)

默认情况下,在搜索共享库以解析符号引用时,动态链接器将解析为它找到的第一个定义。

旧的 glibc 版本(2.2 之前)提供了不同的行为:如果链接器发现一个弱符号,它会记住该符号并继续在剩余的共享库中搜索。如果它随后发现同一符号的强定义,则它会改为使用该定义。 (如果没有找到更多的符号,那么动态链接器将使用它最初找到的弱符号。)

旧的 glibc 行为是非标准的。 (标准做法是弱符号和强符号之间的区别应该只在静态链接时有效。)在 glibc 2.2 中,动态链接器被修改为提供当前行为(这是当时大多数其他实现提供的行为)时间)。

定义 LD_DYNAMIC_WEAK 环境变量(具有任何值)提供了旧的(非标准)glibc 行为,其中一个共享库中的弱符号可能会被随后在另一个共享库中发现的强符号覆盖。 (请注意,即使设置了此变量,共享库中的强符号也不会覆盖主程序中相同符号的弱定义。)

从 glibc 2.3.4 开始,LD_DYNAMIC_WEAK 在安全执行模式下被忽略。

5.2.11. LD_HWCAP_MASK(自 glibc 2.1 起)

硬件功能掩码。

5.2.12. LD_ORIGIN_PATH(自 glibc 2.1 起)

找到二进制文件的路径。

从 glibc 2.4 开始,LD_ORIGIN_PATH 在安全执行模式下被忽略。

5.2.13. LD_POINTER_GUARD(glibc 从 2.4 到 2.22)

设置为 0 以禁用指针保护。任何其他值都启用指针保护,这也是默认值。指针保护是一种安全机制,其中一些指向存储在可写程序存储器中的代码的指针(由 setjmp(3) 保存的返回地址或由各种 glibc 内部使用的函数指针)被半随机地破坏,使攻击者更难劫持在缓冲区溢出或堆栈粉碎攻击的情况下使用的指针。从 glibc 2.23 开始,LD_POINTER_GUARD 不能再用于禁用指针保护,现在总是启用。

5.2.14. LD_PROFILE(自 glibc 2.1 起)

要分析的(单个)共享对象的名称,指定为路径名或 soname。分析输出附加到名称为“$LD_PROFILE_OUTPUT/$LD_PROFILE.profile”的文件中。

从 glibc 2.2.5 开始,LD_PROFILE 在安全执行模式下被忽略。

5.2.15. LD_PROFILE_OUTPUT(自 glibc 2.1 起)

应该写入 LD_PROFILE 输出的目录。如果此变量未定义,或定义为空字符串,则默认为 /var/tmp。

LD_PROFILE_OUTPUT 在安全执行模式下被忽略;相反,始终使用 /var/profile。 (此细节仅在 glibc 2.2.5 之前相关,因为在更高的 glibc 版本中,LD_PROFILE 在安全执行模式下也被忽略。)

5.2.16. LD_SHOW_AUXV(自 glibc 2.1 起)

如果此环境变量已定义(具有任何值),则显示从内核传递的辅助数组(另请参阅 getauxval(3))。

从 glibc 2.3.4 开始,LD_SHOW_AUXV 在安全执行模式下被忽略。

5.2.17. LD_TRACE_PRELINKING(自 glibc 2.4 起)

如果定义了此环境变量,则跟踪其名称分配给此环境变量的对象的预链接。 (使用 ldd(1) 获取可能被跟踪的对象的列表。)如果无法识别对象名称,则跟踪所有预链接活动。

5.2.18. LD_USE_LOAD_BIAS(自 glibc 2.3.3 起)

默认情况下(即,如果未定义此变量),可执行文件和预链接共享对象将遵守其依赖共享对象的基地址,而(非预链接)位置无关可执行文件 (PIE) 和其他共享对象将不遵守它们。如果 LD_USE_LOAD_BIAS 定义为值 1,则可执行文件和 PIE 都将遵守基地址。如果 LD_USE_LOAD_BIAS 定义为值 0,则可执行文件和 PIE 都不会遵守基地址。

从 glibc 2.3.3 开始,这个变量在安全执行模式下被忽略。

5.2.19. LD_VERBOSE(自 glibc 2.1 起)

如果设置为非空字符串,如果已设置 LD_TRACE_LOADED_OBJECTS 环境变量,则输出有关程序的符号版本信息。

LD_WARN(自 glibc 2.1.3 起)
如果设置为非空字符串,则警告未解析的符号。

5.2.20. LD_PREFER_MAP_32BIT_EXEC(仅限 x86-64;自 glibc 2.23 起)

根据英特尔 Silvermont 软件优化指南,对于 64 位应用程序,当分支目标与分支的距离超过 4 GB 时,分支预测性能可能会受到负面影响。如果此环境变量被设置(为任何值),动态链接器将首先尝试使用 mmap(2) MAP_32BIT 标志映射可执行页面,如果尝试失败,则回退到没有该标志的映射。注意:MAP_32BIT 将映射到地址空间的低 2 GB(不是 4 GB)。

由于 MAP_32BIT 减少了可用于地址空间布局随机化 (ASLR) 的地址范围,因此在安全执行模式下始终禁用 LD_PREFER_MAP_32BIT_EXEC。

6. 文件

  • /lib/ld.so
    a.out 动态链接器/加载器

  • /lib/ld-linux.so.{1,2}
    ELF 动态链接器/加载器

  • /etc/ld.so.cache
    包含要在其中搜索共享对象的目录的编译列表和候选共享对象的有序列表的文件。 请参见 ldconfig(8)。

  • /etc/ld.so.preload
    包含要在程序之前加载的 ELF 共享对象的空格分隔列表的文件。 请参阅上面对 LD_PRELOAD 的讨论。 如果同时使用 LD_PRELOAD 和 /etc/ld.so.preload,则首先预加载 LD_PRELOAD 指定的库。 /etc/ld.so.preload 具有系统范围的影响,导致为系统上执行的所有程序预加载指定的库。 (这通常是不可取的,通常仅用作紧急补救措施,例如,作为库错误配置问题的临时解决方法。)

  • lib*.so*
    共享对象

7. 注意

7.1. 硬件能力

某些共享对象是使用并非在每个 CPU 上都存在的特定于硬件的指令编译的。此类对象应安装在名称定义所需硬件功能的目录中,例如 /usr/lib/sse2/。动态链接器根据机器的硬件检查这些目录,并选择给定共享对象的最合适的版本。硬件能力目录可以级联以组合 CPU 特性。支持的硬件功能名称列表取决于 CPU。目前可识别以下名称:

  • Alpha
    ev4, ev5, ev56, ev6,​​ ev67

  • MIPS
    loongson2e、loongson2f、octeon、octeon2

  • PowerPC
    4xxmac、altivec、arch_2_05、arch_2_06、booke、cellbe、dfp、efpdouble、efpsingle、fpu、ic_snoop、mmu、notb、pa6t、power4、power5、power5+、power6x、ppc32、ppc601、ppc64、spex

  • SPARC
    flush、muldiv、stbar、swap、ultra3、v9、v9v、v9v2

  • s390
    dfp、eimm、esan3、etf3enh、g5、highgprs、hpage、ldisp、msa、stfle、z900、z990、z9-109、z10、zarch

  • x86(仅限 32 位)
    acpi、apic、clflush、cmov、cx8、dts、fxsr、ht、i386、i486、i586、i686、mca、mmx、mtrr、pat、pbe、pge、pn、pse36、sep、ss、sse、sse2、mt

glibc 知:ld.so相关推荐

  1. glibc 知:构建2.34版本

    文章目录 获取版本 构建安装 测试 testrun.sh strace 获取版本 主页:https://www.gnu.org/software/libc 这里选择任意一个压缩包下载即可. 构建安装 ...

  2. glibc 知:测试套件

    文章目录 前言 测试套件目标 只测试一项测试 ABI检查 有关 make xcheck 特定测试的详细信息 编写测试用例 使用交叉编译器进行测试 已知的测试套件失败 abi-check bug-ate ...

  3. glibc 知:构建和测试

    文章目录 1. 前言 2. 构建 2.1. 只构建不安装 2.2. 构建并安装 3. 测试 3.1. 正常编译应用,在新glibc下运行 3.2. 基于glibc构建树进行编译应用 3.3. 基于gl ...

  4. glibc 知:手册05:字符串和数组

    文章目录 1. 前言 2. 字符串和数组实用程序 2.1. 字符串的表示 2.2. 字符串和数组约定 2.3. 字符串长度 2.4. 复制字符串和数组 2.5. 连接字符串 2.6. 复制时截断字符串 ...

  5. glibc 知:手册12:输入/输出流

    文章目录 1. 前言 2. 输入/输出流 2.1. 流 2.2. 标准流 2.3. 打开流 2.4. 关闭流 2.5. 流和线程 2.6. 国际化应用程序中的流 2.7. 按字符或行的简单输出 2.8 ...

  6. glibc 知:官方

    文章目录 1. 官网 1.1. What is glibc?什么是glibc 1.2. Get started 开始 1.3. Get Involved 参与其中 1.4. Sources 源码 1. ...

  7. glibc 知:内容

    文章目录 1. 前言 2. 内容 2.1. Error Reporting 错误报告 2.2. Virtual Memory Allocation And Paging 虚拟内存分配和分页 2.3. ...

  8. glibc 知:手册06:字符集处理

    文章目录 1. 前言 2. 字符集处理 2.1. 扩展字符简介 2.2. 字符处理函数概述 2.3. 可重启的多字节转换函数 2.3.1. 选择转换及其属性 2.3.2. 表示转换的状态 2.3.3. ...

  9. glibc 知:系统调用

    文章目录 1. 简介 2. 包装器 2.1. 汇编系统调用 2.2. 宏系统调用 2.3. 定制系统调用 3. 汇编系统调用详解 3.1. syscalls.list 3.2. assembly sy ...

最新文章

  1. 大数据测试之hadoop命令大全 2
  2. java中改变字符串编码
  3. ITK:警告定向到文件
  4. 使用logminer分析日志文件
  5. 日历签到 java_我的Android案例―签到日历
  6. 实操代码带你理解CSS中的常用选择器(你值得掌握!)
  7. Firebug Command Line 的使用技巧
  8. VSCode自定义代码片段9——JS中的面向对象编程
  9. 51nod1464(trie + dfs)
  10. 【NOIP2015】【Luogu2615】神奇的幻方(模拟填数)
  11. EasyRecovery——一款专业的数据恢复软件
  12. memcached java api_Memcached Java Client API详解
  13. Tracert原理图解
  14. wps怎么导入access_WPS Access 2013_access 2013下载-下载之家
  15. 移动SI:如何开拓企业客户市场?
  16. Tapestry入门
  17. WINCC软件与西门子PLC以太网通讯
  18. 有ip可以建网站服务器,云服务器有独立ip吗?
  19. vue 悬停显示另一个div_CSS或者JS实现鼠标悬停显示另一元素
  20. 路由网关---zuul

热门文章

  1. c语言百科园题库及答案,百科园C语言题库
  2. skewness z 分数_z分数用于异常检测
  3. C#中Hashtable
  4. Java程序员常用的各种快捷键和命令:
  5. echarts 单独实现水波纹涟漪效果
  6. django+whoosh
  7. 昆山培训Python
  8. python2爬去多玩图库
  9. vue-cli 构建的项目如何加入骨架屏 skeleton
  10. 计算机网络——IPv4地址的划分