dpkg-gensymbols - 云端在线

这是 dpkg-gensymbols 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


dpkg-gensymbols - 生成符号文件(共享库依赖信息)

概要


dpkg-gensymbols dpkg-gensymbols [选项...]

商品描述


dpkg-gensymbols dpkg-gensymbols 扫描临时构建树(默认为 debian/tmp)寻找库
并生成一个 符号 描述它们的文件。 此文件,如果非空,则安装
在构建树的 DEBIAN 子目录中,以便它最终包含在控件中
包的信息。

生成这些文件时,它使用由
维护者。 它查找以下文件(并使用找到的第一个文件):

· Debian/.符号。

· debian/符号。

· Debian/.符号

· debian/符号

这些文件的主要兴趣是提供与每个文件相关的最小版本
库提供的符号。 通常它对应于那个的第一个版本
提供符号的包,但它可以由维护者手动增加,如果
符号的 ABI 在不破坏向后兼容性的情况下进行了扩展。 这是
维护者有责任使这些文件保持最新和准确,但
dpkg-gensymbols dpkg-gensymbols 对此有帮助。

当生成的符号文件与维护者提供的不同时, dpkg-gensymbols dpkg-gensymbols
将打印两个版本之间的差异。 此外,如果差异太大
重要的是,它甚至会失败(您可以自定义您可以容忍的差异,
看到 -c 选项)。

保养 符号 FILES


符号文件只有在它们反映了包的演变时才真正有用
通过几次发布。 因此,维护者必须在每次有新的更新时更新它们
添加符号,使其关联的最小版本与现实相匹配。 差异
包含在构建日志中的可以作为一个起点,但是维护者,
此外,必须确保这些符号的行为在一个
使用这些符号并链接到新版本的方式,停止
使用旧版本。 在大多数情况下,差异直接适用于
Debian/.symbols 文件。 也就是说,通常需要进一步的调整:它是
例如,建议从最小版本中删除 Debian 修订版,以便
具有较低版本号但相同上游版本的向后移植仍然满足
生成的依赖。 如果 Debian 修订版不能被删除,因为符号真的
由 Debian 特定更改添加,然后应在版本后缀 '~“。

在对符号文件应用任何补丁之前,维护者应该仔细检查
这是理智的。 公共符号不应该消失,所以理想情况下补丁应该只
添加新行。

请注意,您可以在符号文件中添加注释:任何以 '#' 作为第一个字符的行
是注释,除非它以 '#include' 开头(请参阅部分 运用 包括)。 线
以“#MISSING:”开头的是记录消失的符号的特殊注释。

不要忘记检查是否需要增加旧符号版本。 不可能
dpkg-gensymbols dpkg-gensymbols 可以警告这一点。 盲目应用差异或假设有
如果没有差异,则无需更改,不检查此类更改,可能会导致
具有松散依赖关系的软件包声称它们可以与旧的软件包一起使用,而它们不能
与。 这将通过(部分)升级引入难以发现的错误。

运用 #包裹# 代换
在极少数情况下,库的名称因架构而异。 避免
在符号文件中硬编码包的名称,您可以使用标记 #包裹#.
在安装符号文件期间,它将被真实的包名替换。
与此相反 #敏弗# 标记, #包裹# 永远不会出现在符号文件中
二进制包。

运用 符号 标签
符号标记对于标记以某种方式特殊的符号很有用。 任何符号都可以
有任意数量的标签与之关联。 虽然所有标签都被解析和存储,
只有其中一些被理解 dpkg-gensymbols dpkg-gensymbols 并触发特殊处理
符号。 见小节 标准版 符号 标签 供参考这些标签。

标记规范就在符号名称之前(不允许有空格
之间)。 它总是以左括号开头 (, 以结束括号结束 )
必须至少包含一个标签。 多个标签由 | 特点。 每个标签
可以选择有一个值,该值由标记名称分隔 = 特点。 标签
名称和值可以是任意字符串,除非它们不能包含任何特殊的 )
| = 人物。 标记规范后的符号名称可以选择用
' or " 字符以允许其中包含空格。 但是,如果没有标签
为交易品种指定,引号被视为交易品种名称的一部分,继续向上
直到第一个空间。

(tag1=我被标记|带空格的标记名称)"标记引号"@Base 1.0
(可选)tagged_unquoted_symbol@Base 1.0 1
untagged_symbol@Base 1.0

示例中的第一个符号名为 标记 符号 并有两个标签: tag1 -
折扣值 i am 行李牌 姓名 - 空间 那没有价值。 第二个符号命名
未加引号的标记符号 仅使用名为的标签进行标记 可选. 最后一个符号是
正常未标记符号的示例。

由于符号标签是 deb-符号(5) 格式,它们只能是一部分
源包中使用的符号文件(这些文件应该被视为模板
用于构建嵌入在二进制包中的符号文件)。 什么时候
dpkg-gensymbols dpkg-gensymbols 被称为没有 -t 选项,它将输出兼容的符号文件
以及 deb-符号(5) 格式:根据要求对符号进行全面处理
他们的标准标签并从输出中去除所有标签。 相反,在模板模式下
(-t) 所有符号及其标签(标准的和未知的)都保存在输出中
并在加载时以其原始形式写入。

标准版 符号 标签
可选
标记为可选的符号可以随时从库中消失,并且
永远不会导致 dpkg-gensymbols dpkg-gensymbols 失败。 然而,消失的可选符号
将在每个新包修订版的差异中持续显示为 MISSING。 这个
行为提醒维护者需要这样的符号
从符号文件中删除或读取到库中。 当可选符号时,
之前被声明为 MISSING 的,突然在下一个修订版中重新出现,
它将以其最低版本升级回“现有”状态
不变。

此标签对于不消失的私有符号很有用
导致 ABI 损坏。 例如,大多数C++模板实例化都属于这种
类别。 像任何其他标签一样,这个标签也可能有一个任意值:它可以
用于说明为什么该符号被认为是可选的。

拱=架构列表
拱位=架构位
首序=架构顺序
这些标签允许限制符号所在的体系结构集
应该存在。 这 拱位端序 从 dpkg 开始支持标签
1.18.0. 当符号列表用在
库,所有与当前主机无关的特定于 arch 的符号
建筑被视为不存在。 如果特定于拱形的符号
库中不存在匹配当前主机架构,正常
缺少符号的程序适用,它可能会导致 dpkg-gensymbols dpkg-gensymbols 失败。 在
另一方面,如果在不应该出现的时候发现了特定于拱门的符号
存在(因为当前的主机架构没有在标签中列出或没有
匹配字节序和位),它是拱中性的(即拱,拱位
和 arch-endian 标签被删除,因此该符号将出现在差异中
更改),但它不被视为新的。

在默认的非模板模式下操作时,仅在特定于 arch 的符号中
那些匹配当前主机架构的被写入符号文件。 在
相反,所有特定于拱门的符号(包括来自外国拱门的符号)都是
在模板模式下操作时总是写入符号文件。

格式 架构列表 与使用的相同 构建依赖
现场 Debian /控制 (除了方括号 [])。 例如,
下面列表中的第一个符号将仅在 alpha、any-amd64 和
ia64 架构,仅次于 linux 架构的第二个,而第三个
除了 armel 以外的任何地方。

(arch=alpha 任何-amd64 ia64)a_64bit_specific_symbol@Base 1.0
(arch=linux-any)linux_specific_symbol@Base 1.0
(arch=!armel)symbol_armel_does_not_have@Base 1.0

架构位 或者是 32 or 64.

(拱位=32)a_32bit_specific_symbol@Base 1.0
(拱位=64)a_64bit_specific_symbol@Base 1.0

架构顺序 或者是 or .

(arch-endian=little)a_little_endian_specific_symbol@Base 1.0
(arch-endian=big)a_big_endian_specific_symbol@Base 1.0

可以链接多个限制。

(arch-bits=32|arch-endian=little)a_32bit_le_symbol@Base 1.0

忽略黑名单
dpkg-gensymbols 有一个不应出现在内部的符号黑名单
符号文件,因为它们通常只是实现细节的副作用
工具链。 如果出于某种原因,您真的希望这些符号之一成为
包含在符号文件中,您应该用 忽略黑名单。 它
对于某些低级工具链库(如 libgcc)可能是必需的。

C ++ 表示 C ++ 符号图案。 看 运用 符号 模式 下面小节。

符号 表示 符号 (符号版本)符号模式。 看 运用 符号 模式
下面小节。

正则表达式 表示 正则表达式 符号图案。 看 运用 符号 模式 下面小节。

运用 符号 模式
与标准符号规范不同,一个模式可能涵盖多个真实符号
图书馆。 dpkg-gensymbols dpkg-gensymbols 将尝试将每个模式与每个真实符号匹配
不需要 在符号文件中定义了一个特定的符号对应物。 每当第一
找到匹配的模式,它的所有标签和属性都将用作基础
符号的规范。 如果没有任何模式匹配,符号将是
视为新的。

如果模式与库中的任何符号都不匹配,则该模式被视为丢失。 默认情况下
这将触发一个 dpkg-gensymbols dpkg-gensymbols 下失败 -c1 或更高级别。 然而,如果
失败是不希望的,模式可能会被标记为 可选 标签。 那么如果图案
不匹配任何内容,它只会在差异中显示为 MISSING。 此外,像任何
符号,该模式可能仅限于具有 标签。 请
标准版 符号 标签 上面的小节以获取更多信息。

模式是 deb-符号(5) format 因此它们仅在符号中有效
文件模板。 模式规范的语法与以下之一没有任何不同
特定符号。 但是,规范的符号名称部分用作表达
匹配 名称@版本 真正的象征。 为了区分
不同的模式类型,一个模式通常会被标记一个特殊的标签。

此刻, dpkg-gensymbols dpkg-gensymbols 支持三种基本模式类型:

C ++
这种模式表示为 C ++ 标签。 它只匹配 C++ 符号
符号名称(由 C ++过滤(1) 实用程序)。 这个图案很适合搭配
混淆名称的符号可能因不同的体系结构而异,而它们的
损坏的名称保持不变。 一组这样的符号是 非虚拟 暴徒
将架构特定的偏移量嵌入到它们的损坏名称中。 一个常见的例子
这种情况下的虚拟析构函数在菱形继承下需要一个非
虚拟 thunk 符号。 例如,即使 _ZThn8_N3NSB6ClassDD1Ev@Base on 32bit
架构可能是 _ZThn16_N3NSB6ClassDD1Ev@Base 64 位架构,它可以是
与单个匹配 C ++ 模式:

libdummy.so.1 libdummy1 #MINVER#
[...]
(c++)"非虚拟 thunk 到 NSB::ClassD::~ClassD()@Base" 1.0
[...]

可以通过执行以下命令来获得上面的 demanded 名称:

$ echo '_ZThn8_N3NSB6ClassDD1Ev@Base' | C++过滤器

请注意,虽然根据定义,损坏的名称在库中是唯一的,但这不是
对于 demangled 名称来说,这必然是正确的。 几个不同的实数符号可能有
相同的破坏名称。 例如,非虚拟 thunk 符号就是这种情况
复杂的继承配置或大多数构造函数和析构函数(自 g++
通常为它们生成两个实数符号)。 然而,当这些碰撞发生在
ABI 级别,它们不应降低符号文件的质量。

符号
这种模式表示为 符号 标签。 维护良好的库已版本化
符号,其中每个版本对应于符号获得的上游版本
添加。 如果是这种情况,您可以使用 符号 模式以匹配任何关联的符号
到特定版本。 例如:

libc.so.6 libc6 #MINVER#
(symver)GLIBC_2.0 2.0
[...]
(symver)GLIBC_2.7 2.7
访问@GLIBC_2.0 2.2

与版本 GLIBC_2.0 和 GLIBC_2.7 相关的所有符号将导致最小
分别为 2.0 和 2.7 版本,符号除外 访问@GLIBC_2.0.
后者将导致对 libc6 版本 2.2 的最小依赖,尽管在
“(symver)GLIBC_2.0”模式的范围,因为特定符号优先于
图案。

请注意,虽然旧式通配符模式(在
符号名称字段)仍然受支持,它们已被新样式语法弃用
“(symver|可选)版本”。 例如,“*@GLIBC_2.0 2.0”应该写成
“(symver|optional)GLIBC_2.0 2.0”如果需要相同的行为。

正则表达式
正则表达式模式由 正则表达式 标签。 他们通过 perl 匹配
在符号名称字段中指定的正则表达式。 正则表达式匹配
照原样,因此不要忘记以 ^ 字符或者它可以匹配任何
真实符号的一部分 名称@版本 细绳。 例如:

libdummy.so.1 libdummy1 #MINVER#
(正则表达式)"^mystack_.*@Base$" 1.0
(正则表达式|可选)“私有”1.0

“mystack_new@Base”、“mystack_push@Base”、“mystack_pop@Base”等符号将是
与第一个模式匹配,而例如 "ng_mystack_new@Base" 不会。 第二
模式将匹配名称中包含字符串“private”的所有符号并匹配
将继承 可选 从模式标记。

上面列出的基本模式可以在有意义的地方进行组合。 在这种情况下,他们是
按照指定标签的顺序进行处理。 例如,两者

(c++|regex)"^NSA::ClassA::Private::privmethod\d\(int\)@Base" 1.0
(regex|c++)N3NSA6ClassA7Private11privmethod\dEi@Base 1.0

将匹配符号“_ZN3NSA6ClassA7Private11privmethod1Ei@Base”和
“_ZN3NSA6ClassA7Private11privmethod2Ei@Base”。 当匹配第一个模式时,原始
符号首先被分解为 C++ 符号,然后分解的名称与
正则表达式。 另一方面,当匹配第二个模式时,正则
表达式与原始符号名称匹配,然后测试符号是否为 C++
一种是试图破坏它。 任何基本模式的失败都会导致
整个模式的失败。 因此,例如,
"__N3NSA6ClassA7Private11privmethod\dEi@Base" 将不匹配任一模式
因为它不是有效的 C++ 符号。

一般来说,所有模式都分为两组:别名(基本 C ++符号) 以及
通用模式(正则表达式,多个基本模式的所有组合)。 基本匹配
基于别名的模式很快(O(1)) 而通用模式是 O(N)(N - 通用模式
计数)每个符号。 因此,建议不要过度使用通用模式。

当多个模式匹配同一个真实符号时,别名(首先 C ++, 然后 符号) 是
优先于通用模式。 通用模式按照它们被找到的顺序匹配
在符号文件模板中直到第一次成功。 但请注意,该手册
不建议重新排序模板文件条目,因为 dpkg-gensymbols dpkg-gensymbols 产生
差异基于其名称的字母数字顺序。

运用 包括
当体系结构之间导出的符号集不同时,它可能变得效率低下
使用单个符号文件。 在这些情况下,包含指令可能会被证明是有用的
有几种方式:

· 您可以分解某些外部文件中的公共部分,并将该文件包含在您的
.符号。 通过使用像这样的包含指令来创建文件:

#包括 ”.symbols.common”

· include 指令也可以像任何符号一样被标记:

(tag|...|tagN)#include "file-to-include"

因此,包含的所有符号都来自 要包含的文件 将被视为被标记
- 行李牌 ... 标签N 默认情况下。 您可以使用此功能创建一个通用的
.symbols 文件,其中包含架构特定的符号文件:

common_symbol1@Base 1.0
(arch=amd64 ia64 alpha)#include "package.symbols.64bit"
(arch=!amd64 !ia64 !alpha)#include "package.symbols.32bit"
common_symbol2@Base 1.0

符号文件被逐行读取,并且一旦包含指令就被处理
他们遇到了。 这意味着被包含文件的内容可以覆盖任何
出现在 include 指令之前的内容以及之后的任何内容
指令可以覆盖包含在包含文件中的任何内容。 任何符号(甚至
包含文件中的另一个 #include 指令可以指定额外的标签或覆盖
继承标签在其标签规范中的值。 然而,没有办法
符号以删除任何继承的标签。

包含的文件可以重复包含库的 SONAME 的标题行。 在那里面
在这种情况下,它会覆盖之前读取的任何标题行。 但是,一般来说最好是
避免重复标题行。 一种方法如下:

#include "libsomething1.symbols.common"
arch_specific_symbol@Base 1.0

图书馆 颠覆性技术
一个维护良好的库具有以下特点:

· 其 API 是稳定的(公共符号永远不会被删除,只有新的公共符号被删除
添加)并仅在 SONAME 更改时以不兼容的方式更改;

· 理想情况下,尽管内部发生变化,它仍使用符号版本控制来实现 ABI 稳定性
和 API 扩展;

· 它不导出私有符号(此类符号可以标记为可选作为解决方法)。

在维护符号文件的同时,很容易注意到符号的出现和消失
符号。 但是捕获不兼容的 API 和 ABI 更改更加困难。 就这样
维护者应该通读上游变更日志,寻找规则
良好的图书馆管理已被打破。 如果发现潜在问题,
应该通知上游作者,因为上游修复总是比 Debian 好
具体解决办法。

配置


-P包构建目录
Scan 扫描 包构建目录 而不是 debian/tmp。

-p
定义包名称。 如果列出了多个二进制包,则需要
debian/control(或者如果没有 debian/control 文件)。

-v版本
定义包版本。 默认为从中提取的版本
Debian/变更日志。 如果在源包树之外调用,则为必需。

-e库文件
仅分析明确列出的库,而不是查找所有公共库。
您可以使用用于路径名扩展的 shell 模式(请参阅 文件::水珠(3perl)
详细信息手册页)在 库文件 将多个库与单个匹配
参数(否则你需要多个 -e).

-I文件名
使用 文件名 作为参考文件生成集成在的符号文件
包本身。

-O[文件名]
将生成的符号文件打印到标准输出或 文件名 如果指定,
而不是 debian/tmp/DEBIAN/符号 (或 包构建目录/DEBIAN/符号 if -P
被使用)。 如果 文件名 是预先存在的,其内容用作
生成的符号文件。 您可以使用此功能来更新符号文件,以便
它与您的库的较新上游版本相匹配。

-t 以模板模式写入符号文件而不是兼容的格式
deb-符号(5). 主要区别在于模板模式中的符号名称和
标签以其原始形式书写,与后处理的符号名称相反
在兼容模式下剥离标签。 此外,一些符号可能是
编写标准时省略 deb-符号(5) 文件(根据标签
处理规则),而所有符号始终写入符号文件模板。

-c[0-4]
定义将生成的符号文件与模板进行比较时要执行的检查
文件用作起点。 默认情况下,级别为 1。增加级别做更多
检查并包括所有较低级别的检查。 0 级永远不会失败。 1 级失败
如果某些符号消失了。 如果某些新符号已被替换,则级别 2 失败
介绍。 如果某些库已消失,则级别 3 将失败。 4 级失败,如果有
已引入库。

这个值可以被环境变量覆盖
DPKG_GENSYMBOLS_CHECK_LEVEL.

-q 保持安静,永远不要在生成的符号文件和
用作起点的模板文件或显示有关新/丢失库的任何警告
或新/丢失的符号。 此选项仅禁用信息输出,但不禁用
检查自己(见 -c 选项)。

-a 假设 作为处理符号文件时的主机架构。 使用此选项可
为任何架构生成符号文件或差异,前提是其二进制文件是
已经可用。

-d 启用调试模式。 显示了许多消息来解释什么 dpkg-gensymbols dpkg-gensymbols
一样。

-V 启用详细模式。 生成的符号文件包含不推荐使用的符号
注释。 此外在模板模式下,模式符号后跟注释
列出与模式匹配的真实符号。

-?, - 帮帮我
显示使用信息并退出。

- 版
显示版本并退出。

使用 onworks.net 服务在线使用 dpkg-gensymbols



最新的 Linux 和 Windows 在线程序