连接器重复符号处理(一)动态库重复符号处理规则

在日常开发工作中,经常会遇到符号重复定义的问题,这篇文章主要描述的是链接器在处理重复符号时的规则。

在解析引用的过程中,最常发生的问题就是会出现重复符号,该问题发生在链接的最后阶段,具体为在所有可用符号列表中包含两个甚至更多同名符号,连接器就会报错,一般如下错误:

./libsecond.a(secondfile.o):在函数‘duplicateFunction(int)’中:
/root/test/cf/secondfile.cpp:6: duplicateFunction(int) 的多重定义
./libfirst.a(firstfile.o):/root/test/cf/firstfile.cpp:6:第一次在此定义

判断相同的符号,在C和C++有些不同:

  • 在C中,只要函数,结构体,数据类型的名称一样,那么就认为这些符号是相同的。
  • 在C++中,因为函数重载的存在,只有函数的名称和参数列表中每个参数的类型都相同时函数才是重复的。

链接静态库时有重复符号

下面两个文件 firstfile.cppsecodfile.cpp分别编译成静态库,再链接到可执行程序中。

void firstFunction();
void duplicateFunction(int a);
#include <iostream>
void firsFunction() {
    std::cout<<"first function"<<std::endl;
}

void duplicateFunction(int a) {
    std::cout<<"duplicate function in first file "<<a<<std::endl;
}

gcc -Wall -g -c firstfile.cpp
ar -rcs libfirst.a firstfile.o

void secondFunction();
void duplicateFunction(int b);
#include <iostream>
void secondFunction() {
    std::cout<<"second function"<<std::endl;
}

void duplicateFunction(int b) {
    std::cout<<"duplicate function in secode file "<<b<<std::endl;
}

gcc -Wall -g -c secondfile.cpp
ar -rcs libsecond.a secondfile.o

#include <iostream>
#include "firstfile.h"
#include "secondfile.h"
int main() {
    duplicateFunction(0);
    secondFunction();
    return 0;
}

g++ main.cpp -L. -lfirst -lsecond -o app

报错:

./libsecond.a(secondfile.o):在函数‘duplicateFunction(int)’中:
/root/test/cf/secondfile.cpp:6: duplicateFunction(int) 的多重定义
./libfirst.a(firstfile.o):/root/test/cf/firstfile.cpp:6:第一次在此定义

程序app链接libfirst.alibsecond.a链接静态库不允许有重复符号

动态库链接时处理重复符号的规则

链接器在处理动态库的符号链接时,比静态库复杂些,对重复符号并非是零容忍,所以即使多个动态库中有相同的符号,链接器也有一套规则选定一个符号,而非直接报错
对通过dlopen动态加载的方式并没重复符合的问题。
对静态链接的方式链接动态库处理重复符号为以下规则:

  • 符号的优先级优先级是根据在进程内存映射中不同部分的符号赋予了不同的重要等级
  • 链接时指定的动态库链接顺序:如果同等优先级的代码中存在两个或多个重复符号,相比于后出现在动态库链接列表中的动态库,更早传递给链接器的动态库中的符号将有更高的优先级。
符号的优先级
  • 第1 优先级符号,客户程序二进制文件符号(链接动态库了的程序)。
  • 第2优先级符号,动态库可见符号(动态库导出了的符号)。
  • 第3优先级符号,不参与链接的符号(动态库中未导出的符号)。

处理重复符号是通常不考虑静态符号(static方法或变量),无论符号属于客户二进制文件还是属于静态链接的动态库。

例子

可执行程序的二进制文件符号与动态库ABI函数冲突

改例子中包含 一个静态库一个动态库客户程序静态库与动态库中有一个同名的函数

int staticLibFirstFunction(int x);
int staticLibSecondFunction(int x);
int sharedStaticDuplicateFunction(int x);
#include <iostream>
int staticLibFirstFunction(int x){
    std::cout<<__FUNCTION__<<std::endl;
	return x+1;
}

int staticLibSecondFunction(int x){
    std::cout<<__FUNCTION__<<std::endl;
    return x+2;
}

int sharedStaticDuplicateFunction(int x){
    std::cout<<"staticlib:"<<__FUNCTION__<<std::endl;
    return 0;
}

gcc -Wall -g -c staticlib.cpp
ar -rcs libstaticlib.a staticlib.o

int shlibFunction(void);
int sharedStaticDuplicateFunction(int x);
#include <iostream>
int shlibFunction(void) {
    std::cout<<__FUNCTION__<<std::endl;
    return 0;
}

int sharedStaticDuplicateFunction(int x) {
    std::cout<<"sharedLib:"<<__FUNCTION__<<std::endl;
    return 0;
}

gcc -Wall -g -c shlib.c
gcc -fIPC -shared shlib.o -Wl,-soname,libshlib.so.1 -o libshlib.so.1.0.0
ldconfig -n .
ln -s libshlib.so.1 libshlib.so

ldconfig -n是让ldconfig创建所需动态库版本的软连接(这里是libshlib.so.1,因为soname是这个)。

#include "staticlib.h"
#include "shlib.h"
int main() {
    staticLibFirstFunction(0);
    staticLibSecondFunction(1);
    shlibFunction();
    sharedStaticDuplicateFunction(2);
    return 0;
}

gcc -Wall -g -I…/ -c main.c
gcc main.o -L…/ -lstaticlib -L…/sharedlib -lshlib -Wl,-R./ -o app

-Wl,-R 是给链接器传递设在rpath值,用于运行时定义依赖的动态库的路径,可以通过readelf -d的查看DT_RPATH/RPATH值。

运行结果

staticLibFirstFunction
staticLibSecondFunction
shlibFunction
staticlib:sharedStaticDuplicateFunction

对于在静态库和动态库中都定义了的符号sharedStaticDuplicateFunction,链接器找的是静态库中的符号。因为静态库中的符号就相当于是可执行程序的符号,是第一优先级符号

不同动态库ABI符号冲突

不同动态库的ABI符号冲突,两个动态库中有同名的导出符号,根据前面描述的优先级规则,两个动态库的符号都属于第二优先级,链接器将根据静态链接时的库的顺序选择一个。

int shlibFunction(void);
int firstshlibFunction(void);
#include <iostream>
int shlibFunction(void) {
    std::cout<<"firstshlib:"<<__FUNCTION__<<std::endl;
    return 0;
}

int firstshlibFunction(void) {
    std::cout<<__FUNCTION__<<std::endl;
    return 0;
}


gcc -Wall -g -c -fPIC firstshlib.cp
gcc -shared firstshlib.o -Wl,-soname,libfirstshlib.so.1 -o libfirstshlib.so.1.0.0
ldconfig -n .
ln -s libfirstshlib.so.1 libfirstshlib.so

动态库libfirstshlib.so,导出的符号为shlibFunctionfirstshlibFunction

int shlibFunction(void);
int secondshlibFunction(void);
int secondshlibAnotherFunction(void);
#include <iostream>
int shlibFunction(void) {
    std::cout<<"secondshlib:"<<__FUNCTION__<<std::endl;
    return 0;
}

int secondshlibFunction(void) {
    std::cout<<__FUNCTION__<<std::endl;
    return 0;
}

int secondshlibAnotherFunction(void) {
    shlibFunction();
    return 0;
}

gcc -Wall -g -fPIC -c secondshlib.cpp
gcc -shared secondshlib.o -Wl,-soname,libsecondshlib.so.1 -o libsecondshlib.so.1.0.0
ldconfig -n .
ln -s libsecondshlib.so.1 libsecondshlib.so

动态库libsecondshlib.so,导出的符号为shlibFunction, secondshlibFunction,secondshlibAnotherFunction。其中shlibFunction为重复符合。

#include <iostream>
#include "firstshlib.h"
#include "secondshlib.h"
int main() {
    shlibFunction();
    firstshlibFunction();
    secondshlibFunction();
    secondshlibAnotherFunction();
    return 0;
}

g++ -Wall -g -I./firstshlib -I./secondshlib -c main.cpp
g++ main.o -L./ -lfirstshlib -lsecondshlib -Wl,-R./ -o app

最后生成程序app时,首先链接的是libfirstshlib.so,所以输出结果如下:

firstshlib:shlibFunction
firstshlibFunction
secondshlibFunction
firstshlib:shlibFunction

动态中重复的符号shlibFunction,最终选择的是libfirstshlib.so的符号。
对函数动态库libsecondshlib.so中的函数secondshlibAnotherFunction(),在实现的内部调用的是重复符号shlibFunction(),它最终也是链接的libfirstshlib.so中的符号。

如果将链接顺序改为:g++ main.o -L./ -lsecondshlib -lfirstshlib -Wl,-R./ -o app,输出如下:

secondshlib:shlibFunction
firstshlibFunction
secondshlibFunction
secondshlib:shlibFunction

通过这个例子就可以说明,同优先级的符号,由链接时的顺序决定。

动态库的内部符号与动态的导出符号重复。
void shlibFunction();
void firstshlibFunction();
#include <iostream>
void shlibFunction() {
    std::cout<<"firstshlib:"<<__FUNCTION__<<std::endl;
}

void firstshlibFunction() {
    std::cout<<__FUNCTION__<<std::endl;
}

gcc -Wall -g -fPIC -c firstshlib/firstshlib.cpp
gcc -shared firstshlib.o -Wl,-soname,libfirstshlib.so.1 -o libfirstshlib.so.1.0.0
ldconfig -n .
ln -s libfirstshlib.so.1 libfirstshlib.so

动态库libfisrtshlib.so的导出符号为shlibFunction, firstshlibFunction

void secondshlibFunction();
#include <iostream>
static void shlibFunction() {
    std::cout<<"secondshlib,static function:"<<__FUNCTION__<<std::endl;
}

void secondshlibFunction() {
    shlibFunction();
}

gcc -Wall -g -fPIC -c secondshlib/secondshlib.cpp
gcc -shared secondshlib.o -Wl,-soname,libsecondshlib.so.1 -o libsecondshlib.so.1.0.0
ldconfig -n .
ln -s libsecondshlib.so.1 libsecondshlib.so

动态库libsecondshlib.so的导出符号为secondshlibFunction,它还有一个内部符号shlibFunction,被static修饰。它与libfirstshlib.so中的导出符号shlibFunction重名。

#include "firstshlib.h"
#include "secondshlib.h"

int main() {
    shlibFunction();
    firstshlibFunction();
    secondshlibFunction();
}

g++ -Wall -g -l./fisrtshlib -l./secondshlib -c main.cpp
g++ main.o -L./ -lfirstshlib -lsecondshlib -Wl,-R./ -o app

运行app,输出入下:

firstshlib:shlibFunction
firstshlibFunction
secondshlib,static function:shlibFunction

可执行程序app中的shlibFunction方法是链接的firstshlib中的方法,而secondshlibFunction中调用的shlibFunction链接的是libsecondshlib.so中的自己的内部方法,其实在生成libsecondshlib.so动态库时就确定了。在生成执行文件时,内部符号并不参与链接。

上面就是连接器链接动态库时,处理重复符号的规则,这套规则虽然能避免链接出错,但也可能会导致链接了错误的同名符号而导致逻辑的问题。
一般在开发阶段,应该尽可能的采用独立的命名规则来规避符合重复的问题,特别是在C++中通过命名空间的机制,可以很大程度的避免重复符号。但是对规模庞大,依赖第三方库的应用来说,重复符号的问题难以控制。那么就需要我们能知道这套规则,尽可能的使链接器能链接到正确的符号。

在下一篇文章中,将介绍这套规则可能会导致的问题及解决方法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
[1.8.5] 修复了编译后的一个重大问题导致栈奔溃的问题。 [1.8.3] 优化了 E2EE 内存中同进程库的加载机制,更加可靠。 E2EE程序在内存中永远只保留一个版本,无论何种方式调用E2EE,只要是同进程都使用外层服务器所使用的E2EE版本,不会进行重复加载。 [网站服务器] 重构了 取配置文本() 。剔除了英文命名,加入了获取JSON形式的文本。可通过参数 是否为JSON 获取。 加入了 取验证器(验证器文件)。可通过验证器文件名载入验证器。 优化了 服务器日志处理。当打开日志文件失败(日志文件为只读等情况)时,可顺利启动服务器。 [其它] 创建文本() 修复了“``”时无法转换为双引号的问题。 重新处理了 E2EE通用服务模块。 把网站做成服务时,请不要调用 网站.初始化() 方法。资源或者依赖路径的初始化,请放在“网站.订阅初始化函数”对应的回调函数中。 [1.8.2] [数据库连接池] 加入了 输出执行SQL 和 执行时间 到日志的功能。对应的方法“是否输出SQL”和“置是否输出SQL”。可随时开启和关闭(线程安全)。 [网站服务器] 加入了 等待结束 方法。等待服务器运行直到停止或者结束。如果服务器在运行中,则此操作会一直等待并且会阻塞当前线程 加入了 清除页面缓存 方法。可通过请求相对路径,清除服务器上的 静态文件缓存 和 动态请求缓存 中的缓存数据。 修复了 大文件(2G以上) 获取尺寸无效的问题。这个是因为之前为网站打包工作做改造时,统一使用了32位数据长度的文件信息获取方法,32位有符号的数值无法描述2G以上的文件尺寸,会产生越界。 !!! 此功能影响到 网站打包 功能,所以可能需要新版的网站打包功能做支持。或者手动调用  网站打包  功能对网站进行打包。 [1.8.0] SSL部分加入了苹果ATS(强制HTTPS)支持。开发程序对接微信等方面更加友好。E2EE服务器现已支持PFS完全前向保密机制。 [网站服务器] 加入了 动态缓存页 请求数据缓存的功能。 修复了 文件上传尺寸过大等情况下,还能获取上传成功的消息状态。 上传 在配置中 最大上传尺寸 单位改成了 KB 上传 文件类型加入了白名单模式。 如果只限定范围内的文件类型,上传文件类型只要填写后缀即可,例如:jpg;gif;png;webp(此时只允许这几种后缀的文件上传) 如果允许上传大部分类型,而只限定不允许某些类型,则可以使用 * 来代替所有,之外的后缀都不允许。例如:*;exe;com;bat;msi(此时除了exe...msi之外的所有类型都允许上传) 修复了 某些情况下,静态缓存文件无法准确响应 gzip 的问题。 [服务器请求] 加入了 验证参数() / 验证所有参数() 功能。自动匹配和验证 远程服务/视图函数 的参数。响应验证器设置。 [存取键值表/存取列表] 修复了 键值表/列表 在某些特定环境下可能解析JSON或创建小数类型对象崩溃的问题(D-OWL)。 [对象工厂] 加入了 创建时间戳() / 载入时间戳() 功能。能够生成和载入秒或毫秒级的时间戳。 修复了 创建文本从时间() / 创建时间从文本() 中的国际时间转换问题。 重写了 创建文本从时间() 和 创建时间从文本()。不会再因为格式不匹配阻塞或者崩溃。 优化了 Base64解码 函数,可兼容包含换行等号空格等情况。 [网站客户端] !!! 重要更新:返回信息头如果有多个,将不会再转换为存取列表,而是会不停的追加多行文本,一行表示一条数据。 修复了 键值表 作为POST参数时可能引起的访问失败问题。 加入了 自动跳转时,获取每次服务器返回的信息头。 修复了 代理设置无效的问题。可正常使用代理服务器。 [网页内容解析器] 修复了标签和属性中出现“-”和“_”无法完整解析名称的问题。 [加解密对象] 修复了 RSA 加解密签名时,设置输出小写十六进制文本始终为大写的问题(番茄) [数据验证器] 字母中文等验证条件加入了扩展字符支持。允许在字母等验证时可包含自定义字符“空格”“中划线”等。 jimstone
下面是一系列蓝屏中可能出现的代码. 0 0x00000000 作业完成。 1 0x00000001 不正确的函数。 2 0x00000002 系统找不到指定的档案。 3 0x00000003 系统找不到指定的路径。 4 0x00000004 系统无法开启档案。 5 0x00000005 拒绝存取。 6 0x00000006 无效的代码。 7 0x00000007 储存体控制区块已毁。 8 0x00000008 储存体空间不足,无法处理这个指令。 9 0x00000009 储存体控制区块地址无效。 10 0x0000000A 环境不正确。 11 0x0000000B 尝试加载一个格式错误的程序。 12 0x0000000C 存取码错误。 13 0x0000000D 资料错误。 14 0x0000000E 储存体空间不够,无法完成这项作业。 15 0x0000000F 系统找不到指定的磁盘驱动器。 16 0x00000010 无法移除目录。 16 0x00000010 无法移除目录。 17 0x00000011 系统无法将档案移到 其它的磁盘驱动器。 18 0x00000012 没有任何档案。 19 0x00000013 储存媒体为写保护状态。 20 0x00000014 系统找不到指定的装置。 21 0x00000015 装置尚未就绪。 22 0x00000016 装置无法识别指令。 23 0x00000017 资料错误 (cyclic redundancy check) 24 0x00000018 程序发出一个长度错误的指令。 25 0x00000019 磁盘驱动器在磁盘找不到 持定的扇区或磁道。 26 0x0000001A 指定的磁盘或磁盘无法存取。 27 0x0000001B 磁盘驱动器找不到要求的扇区。 28 0x0000001C 打印机没有纸。 29 0x0000001D 系统无法将资料写入指定的磁盘驱动器。 30 0x0000001E 系统无法读取指定的装置。 31 0x0000001F 连接到系统的某个装置没有作用。 32 0x00000020 文件被另一进程使用中不能访问The process cannot access the file because it is being used by another process. 33 0x00000021 档案的一部份被锁定, 现在无法存取。 34 0x00000022 磁盘驱动器的磁盘不正确。 请将 %2 (Volume Serial Number: %3) 插入磁盘机%1。 36 0x00000024 开启的分享档案数量太多。 38 0x00000026 到达档案结尾。 39 0x00000027 磁盘已满。 50 0x00000032 不支持这种网络要求。 51 0x00000033 远程计算机无法使用。 52 0x00000034 网络名称重复。 53 0x00000035 网络路径找不到。 54 0x00000036 网络忙碌中。 55 0x00000037 特殊的网络资源或设备不可再使用The specified network resource or device is no longer available. 56 0x00000038 网络BIOS命令已达到限制The network BIOS command limit has been reached. 57 0x00000039 网络配接卡发生问题。 58 0x0000003A 指定的服务器无法执行要求的作业。 59 0x0000003B 网络发生意外错误。 60 0x0000003C 远程配接卡不兼容。 61 0x0000003D 打印机队列已满。 62 0x0000003E 服务器的空间无法储存等候打印的档案。 63 0x0000003F 等候打印的档案已经删除。 64 0x00000040 指定的网络名称无法使用。 65 0x00000041 拒绝存取网络。 65 0x00000041 拒绝存取网络。 66 0x00000042 网络资源类型错误。 67 0x00000043 网络名称找不到。 68 0x00000044 超过区域计算机网络配接卡的名称限制。 69 0x00000045 超过网络 BIOS 作业阶段的限制。 70 0x00000046 远程服务器已经暂停或者正在起始中。 71 0x00000047 由于联机数目已达上限,此时无法再联机到这台远程计算机。 72 0x00000048 指定的打印机或磁盘装置已经暂停作用。 80 0x00000050 档案已经存在。 82 0x00000052 无法建立目录或档案。 83 0x00000053 INT 2484 0x00000054 处理这项要求的储存体无法使用。 85 0x00000055 近端装置名称已经在使用中。 86 0x00000056 指定的网络密码错误。 87 0x00000057 参数错误。 88 0x00000058 网络发生资料写入错误。 89 0x00000059 此时系统无法执行其它行程。 100 0x00000064 无法建立其它的系统 semaphore。 101 0x00000065 属于其它行程专用的 semaphore. 102 0x00000066 semaphore 已经设定,而且无法关闭。 103 0x00000067 无法指定 semaphore 。 104 0x00000068 在岔断时间无法要求专用的 semaphore 。 104 0x00000068 在岔断时间无法要求专用的 semaphore 。 105 0x00000069 此 semaphore 先前的拥有权已经结束。 106 0x0000006A 请将磁盘插入 %1。 107 0x0000006B 因为代用的磁盘尚未插入,所以程序已经停止。 108 0x0000006C 磁盘正在使用中或被锁定。 109 0x0000006D Pipe 已经中止。 110 0x0000006E 系统无法开启指定的 装置或档案。 111 0x0000006F 档名太长。 112 0x00000070 磁盘空间不足。 113 0x00000071 没有可用的内部档案标识符。 114 0x00000072 目标内部档案标识符不正确。 117 0x00000075 由应用程序所执行的 IOCTL 呼叫 不正确。 118 0x00000076 写入验证参数值不正确。 119 0x00000077 系统不支持所要求的指令。 120 0x00000078 此项功能仅在 Win32 模式有效。 121 0x00000079 semaphore 超过逾时期间。 122 0x0000007A 传到系统呼叫的资料区域 太小。 123 0x0000007B 文件名、目录名称或储存体卷标语法错误。 124 0x0000007C 系统呼叫层次不正确。 125 0x0000007D 磁盘没有设定卷标。 126 0x0000007E 找不到指定的模块。 127 0x0000007F 找不到指定的程序。 128 0x00000080 没有子行程可供等待。 128 0x00000080 没有子行程可供等待。 129 0x00000081 %1 这个应用程序无法在 Win32 模式下执行。 130 0x00000082 Attempt to use a file handle to an open disk partition for an operation other than raw disk I/O. 131 0x00000083 尝试将档案指针移至档案开头之前。 132 0x00000084 无法在指定的装置或档案,设定档案指针。 133 0x00000085 JOIN 或 SUBST 指令 无法用于 内含事先结合过的磁盘驱动器。 134 0x00000086 尝试在已经结合的磁盘驱动器,使用 JOIN 或 SUBST 指令。 135 0x00000087 尝试在已经替换的磁盘驱动器,使 用 JOIN 或 SUBST 指令。 136 0x00000088 系统尝试删除 未连结过的磁盘驱动器的连结关系。 138 0x0000008A 系统尝试将磁盘驱动器结合到已经结合过之磁盘驱动器的目录。 139 0x0000008B 系统尝试将磁盘驱动器替换成已经替换过之磁盘驱动器的目录。 140 0x0000008C 系统尝试将磁盘驱动器替换成已经替换过之磁盘驱动器的目录。 141 0x000000 系统尝试将磁盘驱动器 SUBST 成已结合的磁盘驱动器 目录。 142 0x0000008E 系统此刻无法执行 JOIN 或 SUBST。 143 0x0000008F 系统无法将磁盘驱动器结合或替换同一磁盘驱动器下目录。 144 0x00000090 这个目录不是根目录的子目录。 145 0x00000091 目录仍有资料。 146 0x00000092 指定的路径已经被替换过。 147 0x00000093 资源不足,无法处理这项 指令。 148 0x00000094 指定的路径这时候无法使用。 148 0x00000094 指定的路径这时候无法使用。 149 0x00000095 尝试要结合或替换的磁盘驱动器目录,是已经替换过的的目标。 150 0x00000096 CONFIG.SYS 文件未指定系统追踪信息,或是追踪功能被取消。 151 0x00000097 指定的 semaphore事件 DosMux0000SemWait 数目不正确。 152 0x00000098 DosMux0000SemWait 没有执行;设定太多的 semaphore。 153 0x00000099 DosMux0000SemWait 清单不正确。 154 0x0000009A 您所输入的储存媒体标 元长度限制。 155 0x0000009B 无法建立其它的执行绪。 156 0x0000009C 接收行程拒绝接受信号。 157 0x0000009D 区段已经被舍弃,无法被锁定。 158 0x0000009E 区段已经解除锁定。 159 0x0000009F 执行绪识别码的地址不正确。 160 0x000000A0 传到 DosEx0000ecPgm 的自变量字符串不正确。 161 0x000000A1 指定的路径不正确。 162 0x000000A2 信号等候处理。 164 0x000000A4 系统无法建立执行绪。 167 0x000000A7 无法锁定档案的部份范围。 170 0x000000AA 所要求的资源正在使用中。 173 0x000000AD 取消范围的锁定要求不明显。 174 0x000000AE 档案系统不支持自动变更锁定类型。 180 0x000000B4 系统发现不正确的区段号码。 182 0x000000B6 操作系统无法执行 %1。 182 0x000000B6 操作系统无法执行 %1。 183 0x000000B7 档案已存在,无法建立同一档案。 186 0x000000BA 传送的旗号错误。 187 0x000000BB 指定的系统旗号找不到。 188 0x000000BC 操作系统无法执行 %1。 189 0x000000BD 操作系统无法执行 %1。 190 0x000000BE 操作系统无法执行 %1。 191 0x000000BF 无法在 Win32 模式下执行 %1。 192 0x000000C0 操作系统无法执行 %1。 193 0x000000C1 %1 不是正确的 Win32 应用程序。 194 0x000000C2 操作系统无法执行 %1。 195 0x000000C3 操作系统无法执行 %1。 196 0x000000C4 操作系统无法执行 这个应用程序。 197 0x000000C5 操作系统目前无法执行 这个应用程序。 198 0x000000C6 操作系统无法执行 %1。 199 0x000000C7 操作系统无法执行 这个应用程序。 200 0x000000C8 程序代码的区段不可以大于或等于 64KB。 201 0x000000C9 操作系统无法执行 %1。 202 0x000000CA 操作系统无法执行 %1。 203 0x000000CB 系统找不到输入的环境选项。\r 205 0x000000CD 在指令子目录下,没有任何行程有信号副处理程序。 206 0x000000CE 文件名称或扩展名太长。 207 0x000000CF ring 2 堆栈使用中。 207 0x000000CF ring 2 堆栈使用中。 208 0x000000D0 输入的通用档名字元 * 或 ? 不正确, 或指定太多的通用档名字元。 209 0x000000D1 所传送的信号不正确。 210 0x000000D2 无法设定信号处理程序。 212 0x000000D4 区段被锁定,而且无法重新配置。 214 0x000000D6 附加到此程序或动态连结模块的动态连结模块太多。 215 0x000000D7 Can’t nest calls to LoadModule. 230 0x000000E6 The pipe state is invalid. 231 0x000000E7 所有的 pipe instances 都在忙碌中。 232 0x000000E8 The pipe is being closed. 233 0x000000E9 No process is on the other end of the pipe. 234 0x000000EA 有更多可用的资料。 240 0x000000F0 作业阶段被取消。 254 0x000000FE 指定的延伸属性名称无效。 255 0x000000FF 延伸的属性不一致。 259 0x00000103 没有可用的资料。 266 0x0000010A 无法使用 Copy API。 267 0x0000010B 目录名称错误。 275 0x00000113 延伸属性不适用于缓冲区。 276 0x00000114 在外挂的档案系统上的延伸属性档案已经毁损。 277 0x00000115 延伸属性表格文件满。 278 0x00000116 指定的延伸属性代码无效。 278 0x00000116 指定的延伸属性代码无效。 282 0x0000011A 外挂的这个档案系统不支持延伸属性。 288 0x00000120 意图释放不属于叫用者的 mutex0000。 298 0x0000012A semaphore 传送次数过多。 299 0x0000012B 只完成 Read/WriteProcessMemory 的部份要求。 317 0x0000013D 系统找不到位于讯息文件 %2 中编号为 0x0000%1 的讯息。 487 0x000001E7 尝试存取无效的地址。 534 0x00000216 运算结果超过 32 位。 535 0x00000217 信道的另一端有一个行程在接送资料。 536 0x00000218 等候行程来开启信道的另一端。 994 0x000003E2 存取延伸的属性被拒。 995 0x000003E3 由于执行绪结束或应用程序要求,而异常终止 I/O 作业。 996 0x000003E4 重叠的 I/O 事件不是设定成通知状态。 997 0x000003E5 正在处理重叠的 I/O 作业。 998 0x000003E6 对内存位置的无效存取。 999 0x000003E7 执行 inpage 作业发生错误。 1001 0x000003E9 递归太深,堆栈满溢。 1002 0x000003EA 窗口无法用来传送讯息。 1003 0x000003EB 无法完成这项功能。 1004 0x000003EC 旗号无效。 1005 0x000003ED 储存媒体未含任何可辨识的档案系统。 请确定以加载所需的系统驱动程序,而且该储存媒体并未毁损。 1006 0x000003EE 储存该档案的外部媒体发出警告,表示该已开启档案已经无效。 1007 0x000003EF 所要求的作业无法在全屏幕模式下执行。 1008 0x000003F0 An attempt was made to reference a token that does not ex0000ist. 1009 0x000003F1 组态系统登录数据库毁损。 1010 0x000003F2 组态系统登录机码无效。 1011 0x000003F3 无法开启组态系统登录机码。 1012 0x000003F4 无法读取组态系统登录机码。 1013 0x000003F5 无法写入组态系统登录机码。 1014 0x000003F6 系统登录数据库中的一个档案必须使用记录或其它备份还原。 已经还原成功。 1015 0x000003F7 系统登录毁损。其中某个档案毁损、或者该档案的 系统映对内存内容毁损、会是档案无法复原。 1016 0x000003F8 系统登录起始的 I/O 作业发生无法复原的错误。 系统登录无法读入、写出或更新,其中的一个档案 内含系统登录在内存中的内容。 1017 0x000003F9 系统尝试将档案加载系统登录或将档案还原到系统登录中,但是,指定档案的格式不是系统登录文件的格式。 1018 0x000003FA 尝试在标示为删除的系统登录机码,执行不合法的操作。 1018 0x000003FA 尝试在标示为删除的系统登录机码,执行不合法的操作。 1019 0x000003FB 系统无法配置系统登录记录所需的空间。 1020 0x000003FC 无法在已经有子机码或数值的系统登录机码建立符号连结。 1021 0x000003FD 无法在临时机码下建立永久的子机码。 1022 0x000003FE 变更要求的通知完成,但信息 并未透过呼叫者的缓冲区传回。呼叫者现在需要自行列举档案,找出变更的地方。 1051 0x0000041B 停止控制已经传送给其它服务 所依峙的一个服务。 1052 0x0000041C 要求的控制对此服务无效 1016 0x000003F8 系统登录起始的 I/O 作业发生无法复原的错误。 系统登录无法读入、写出或更新,其中的一个档案 内含系统登录在内存中的内容。 1017 0x000003F9 系统尝试将档案加载系统登录或将档案还原到系统登录中,但是,指定档案的格式不是系统登录文件的格式。 1018 0x000003FA 尝试在标示为删除的系统登录机码,执行不合法的操作。 1018 0x000003FA 尝试在标示为删除的系统登录机码,执行不合法的操作。 1019 0x000003FB 系统无法配置系统登录记录所需的空间。 1020 0x000003FC 无法在已经有子机码或数值的系统登录机码建立符号连结。 1021 0x000003FD 无法在临时机码下建立永久的子机码。 1022 0x000003FE 变更要求的通知完成,但信息 并未透过呼叫者的缓冲区传回。呼叫者现在需要自行列举档案,找出变更的地方。 1051 0x0000041B 停止控制已经传送给其它服务 所依峙的一个服务。 1052 0x0000041C 要求的控制对此服务无效 1052 0x0000041C 要求的控制对此服务无效 1053 0x0000041D The service did not respond to the start or control request in a timely fashion. 1054 0x0000041E 无法建立服务的执行绪。 1055 0x0000041F 服务数据库被锁定。 1056 0x00000420 这种服务已经在执行。 1057 0x00000421 帐户名称错误或者不存在。 1058 0x00000422 指定的服务暂停作用,无法激活。 1059 0x00000423 指定循环服务从属关系。 1060 0x00000424 指定的服务不是安装进来的服务。 1061 0x00000425 该服务项目此时无法接收控制讯息。 1062 0x00000426 服务尚未激活。 1063 0x00000427 无法联机到服务控制程序。 1064 0x00000428 处理控制要求时,发生意外状况。 1065 0x00000429 指定的数据库不存在。 1066 0x0000042A 服务传回专属于服务的错误码。 1067 0x0000042B The process terminated unex0000pectedly. 1068 0x0000042C 从属服务或群组无法激活。 1069 0x0000042D 因为登入失败,所以没有激活服务。 1070 0x0000042E 在激活之后,服务在激活状态时当机。 1071 0x0000042F 指定服务数据库锁定无效。 1072 0x00000430 指定的服务已经标示为删除。 1073 0x00000431 指定的服务已经存在。 1074 0x00000432 系统目前正以上一次执行成功的组态执行。 1075 0x00000433 从属服务不存在,或已经标示为删除。 1076 0x00000434 目前的激活已经接受上一次执行成功的 控制设定。 1077 0x00000435 上一次激活之后,就没有再激活服务。 1078 0x00000436 指定的名称已经用于服务名称或服务显示 名称。 1100 0x0000044C 已经到了磁带的最后。 1101 0x0000044D 到了档案标示。 1102 0x0000044E 遇到磁带的开头或分割区。 1100 0x0000044C 已经到了磁带的最后。 1101 0x0000044D 到了档案标示。 1102 0x0000044E 遇到磁带的开头或分割区。 1103 0x0000044F 到了档案组的结尾。 1104 0x00000450 磁带没有任何资料。 1105 0x00000451 磁带无法制作分割区。 1106 0x00000452 存取多重容体的新磁带时,发现目前 区块大小错误。 1107 0x00000453 加载磁带时,找不到磁带分割区信息。 1108 0x00000454 无法锁住储存媒体退带功能。 1108 0x00000454 无法锁住储存媒体退带功能。 1109 0x00000455 无法解除加载储存媒体。 1110 0x00000456 磁盘驱动器中的储存媒体已经变更。 1111 0x00000457 已经重设 I/O 总线。 1112 0x00000458 磁盘驱动器没有任何储存媒体。 1113 0x00000459 目标 multi-byte code page,没有对应 Unicode 字符。 1114 0x0000045A 动态链接库 (DLL) 起始例程失败。 1115 0x0000045B 系统正在关机。 1116 0x0000045C 无法中止系统关机,因为没有关机的动作在进行中。 1117 0x0000045D 因为 I/O 装置发生错误,所以无法执行要求。 1118 0x0000045E 序列装置起始失败,会取消加载序列驱动程序。 1119 0x0000045F 无法开启装置。这个装置与其它装置共享岔断要求 (IRQ)。至少已经有一个使用同一IRQ 的其它装置已经开启。 1120 0x00000460 A serial I/O operation was completed by another write to the serial port(The IOCTL_SERIAL_x0000OFF_COUNTER reached zero.) 1121 0x00000461 因为已经过了逾时时间,所以序列 I/O 作业完成。 (IOCTL_SERIAL_x0000OFF_COUNTER 不是零。) 1122 0x00000462 在磁盘找不到任何的 ID 地址标示。 1123 0x00000463 磁盘扇区 ID 字段与磁盘控制卡追踪地址 不符。 1124 0x00000464 软式磁盘驱动器控制卡回报了一个软式磁盘驱动器驱动程序无法识别的错误。 1125 0x00000465 软式磁盘驱动器控制卡传回与缓存器中不一致的结果。 1126 0x00000466 存取硬盘失败,重试后也无法作业。 1127 0x00000467 存取硬盘失败,重试后也无法作业。 1128 0x00000468 存取硬盘时,必须重设磁盘控制卡,但是 连重设的动作也失败。 1129 0x00000469 到了磁带的最后。 1130 0x0000046A 可用服务器储存空间不足,无法处理这项指令。 1131 0x0000046B 发现潜在的死锁条件。 1132 0x0000046C 指定的基本地址或档案位移没有适当 对齐。 1140 0x00000474 尝试变更系统电源状态,但其它的应用程序或驱动程序拒绝。 1141 0x00000475 系统 BIOS 无法变更系统电源状态。 1150 0x0000047E 指定的程序需要新的 Windows 版本。 1151 0x0000047F 指定的程序不是 Windows 或 MS-DOS 程序。 1152 0x00000480 指定的程序已经激活,无法再激活一次。 1153 0x00000481 指定的程序是为旧版的 Windows 所写的。 1154 0x00000482 执行此应用程序所需的链接库档案之一毁损。 1155 0x00000483 没有应用程序与此项作业的指定档案建立关联。 1156 0x00000484 传送指令到应用程序发生错误。 1157 0x00000485 找不到执行此应用程序所需的链接库档案。 1200 0x000004B0 指定的装置名称无效。 1201 0x000004B1 装置现在虽然未联机,但是它是一个记忆联机。 1202 0x000004B2 尝试记忆已经记住的装置。 1203 0x000004B3 提供的网络路径找不到任何网络提供程序。 1203 0x000004B3 提供的网络路径找不到任何网络提供程序。 1204 0x000004B4 指定的网络提供程序名称错误。 1205 0x000004B5 无法开启网络联机设定文件。 1206 0x000004B6 网络联机设定文件坏掉。 1207 0x000004B7 无法列举非容器。 1208 0x000004B8 发生延伸的错误。 1209 0x000004B9 指定的群组名称错误。 1210 0x000004BA 指定的计算机名称错误。 1211 0x000004BB 指定的事件名称错误。 1212 0x000004BC 指定的网络名称错误。 1213 0x000004BD 指定的服务名称错误。 1214 0x000004BE 指定的网络名称错误。 1215 0x000004BF 指定的资源共享名称错误。 1216 0x000004C0 指定的密码错误。 1217 0x000004C1 指定的讯息名称错误。 1218 0x000004C2 指定的讯息目的地错误。 1219 0x000004C3 所提供的条件与现有的条件组发生冲突。 1220 0x000004C4 尝试与网络服务器联机,但是 与该服务器的联机已经太多。 1221 0x000004C5 其它网络计算机已经在使用这个工作群组或网域名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo4776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值