错误: 空 %file 文件 /home/user/rpmbuild/BUILD/xxxx-0.1/debugsourcefiles.list

你看错误的里边有一个%file,这是使用spec文件构建时的一个命令阶段,用于列出文件以生成对应的rpm包。

我们查找rpm的宏定义,发现了一行代码%files debugsource -f debugsourcefiles.list,debugsource包要使用debugsourcefiles.list文件,而debugsourcefiles.list是空的,所以出现了相应的错误。

源码包经过构建后,除了生成spec中指定的包外,还会生成额外的debuginfo和debugsource包,noarch架构除外。

  • 那么debugsourcefiles.list文件是怎么生成的?为什么是空的?

debugsourcefiles.list是由find-debuginfo生成的。

生成的文件内容为空有以下几个原因:

1 编译的目标并未生成任何动态库和可执行文件。

2 编译时未给编译器加可调试选项,比如gcc的-g选项。

3 有些开发者在构建文件的install阶段执行了strip,剥除了调试信息。

如果不想生成额外的debuginfo和debugsource包,可以在rpmbuild命令行指定--nodebuginfo,也可以在spec文件的开头加上%define debug_package %{nil}

如果只是不想生成debugsource,还继续生成debuginfo,可以在spec文件的开头加上%define _debugsource_template %{nil}

如果不想生成debuginfo,还继续生成debugsource?别折腾了,这样做没意义。

但是如果本意是想生成的,却遇到了以上的问题,那就往下看,了解一下find-debuginfo的原理。

find-debuginfo

创建临时目录 /tmp/find-debuginfo.XXXXXX,XXXXXX为随机数。

然后在$RPM_BUILD_ROOT查找文件属性中有not stripped标志的文件,将结果写到临时目录的primary文件内。使用了下边的一段代码。

可以看到查找条件,只要文件权限中owner、group、other任意一个可执行,并且属性中有not stripped就满足要求。

touch "$temp/primary"
find "$RPM_BUILD_ROOT" ! -path "${debugdir}/*.debug" -type f \
\( -perm -0100 -or -perm -0010 -or -perm -0001 \) \
-print | LC_ALL=C sort |
file -N -f - | sed -n -e 's/^\(.*\):[ ]*.*ELF.*, not stripped.*/\1/p' |
xargs --no-run-if-empty stat -c '%h %D_%i %n' |
while read nlinks inum f; do
if [ $nlinks -gt 1 ]; then
var=seen_$inum
if test -n "${!var}"; then
echo "$inum $f" >>"$temp/linked"
continue
else
read "$var" < <(echo 1)
fi
fi
echo "$nlinks $inum $f" >>"$temp/primary"
done

对所有写入primary的文件,逐个进行处理,这里使用了多线程,脚本中每个线程是一个run_job函数,ran_job其本质执行的是do_file函数。

比如使用了8个线程,线程0是run_job0,run_job0将自己处理过的文件写入elfbins.0,将提取的信息写入debugsources.0,将处理结果写入res.0。

然后再将多个线程处理产生的多个elfbins和debugsources文件进行合并,顾名思义,debugsources里边记录着调试源文件的名称和类型。

debugsourcefiles.list debugsource包的列表文件。记录所有调试源文件(就是代码文件)将要被安装到系统的路径,一般是/usr/src/debug/%{packagename}-%{version}-%{release}.%{dist}.%{arch}
debugfiles.list debuginfo包的列表文件。记录所有的调试文件将要被安装的路径,就是未被stripped的文件,每个文件一条记录。
debuglinks.list
debugsources.list 记录所有调试用源代码文件的名称和类型。源代码文件的调试类型可以是<internal><built-in><__thread_local_inner macros>等。
elfbins.list 记录所有的可调试的可执行程序,不包括动态库,每个文件一条记录。

我们再来看看run_job线程内都做了些什么?

run_job线程内调用了do_file函数,do_file函数使用了debugedit命令对单个文件进行调试信息处理。

rpmbuild时为什么会出现空的debugsourcefiles.list?的更多相关文章

  1. dedecms添加文章时提示标题为空,编辑文章时编辑器空白的解决办法

    dedecms添加文章时提示标题为空,编辑文章时编辑器空白的解决办法 dedecms出现这个问题与代码无关,主要是和PHP的版本有关,用的PHP5.4,更换成PHP5.2之后就不会有这个问题了. 问题 ...

  2. (转)MyBatis在插入的数据有空值时,可能为空的字段都要设置jdbcType

    1 引言 前面的所有语句中你所见到的都是简单参数的例子,实际上参数是 MyBatis 非常强大的元素,对于简单的做法, 90% 的情况参数都很少,比如: <select id="sel ...

  3. Day11 空时编码理论之正交空时分组码和垂直分层空时编码

    空时编码的用途: 一是获得分集增益(STBC,通过不同的发射天线发送相同传输信号的不同副本,实现空间分集,提高传输质量): 二是获得复用增益(V-BLAST在同一时隙,将不同的符号通过不同的天线发射出 ...

  4. spring boot加mybatis使用Map返回时,当值为空时属性也会没有(转)

    使用spring boot加mybatis时,设置Map返回,当值为空时属性也会没有,就会报错 在application.properties中加入下面配置,将会解决这个问题.   #当查询数据为空时 ...

  5. layui批量传值到后台操作时出现传值为空的问题

    如图,前台的样子,data的参数为 [ {"good_id":1,"good_name":"标样-总磷","good_num&qu ...

  6. 为什么Tableviewcell创建时可以不判空

    dequeueReuseableCellWithIdentifier:与dequeueReuseableCellWithIdentifier:forIndexPath:的区别: 前者不必向tableV ...

  7. php读取json时无数据(为空)的解决方法

    在使用PHP调用一些json接口文件时 如果使用 file_get_contents 获取页面json数据后 再使用json_decode()解析后 数据无法正常输出 这是的返回值为null 这是由于 ...

  8. Mybatis中 Integer 值为0时,默认为空字符串的解决办法。

    需求是查询级别为0的用户 User对象里的level字段的值为0,查询时居然没有查到为level为0的用户. <select id="selectSelective" par ...

  9. 解决EF使用context.Database.SqlQuery时NotMapped属性列为空null的问题(转载)

    有时候我们要为EF中的Model加一个新属性,这个属性不是数据库中的字段,而是从其它表中关联出来的.EF中要标示一个列不是对应表中字段只需要加上NotMapped特性.要使用NotMapped,保证你 ...

  10. .NET开源工作流RoadFlow-Bug修改-1.8.2表单验证时ueditor编辑非空验证无效

    RoadFlow生成的表单,Ueditor编辑器不能进行非空验证的BUG修改: 1.修改控制器:WorkFlowFormDesignerController红框处: 2.修改js文件:Scripts/ ...

随机推荐

  1. Go语言核心36讲14

    在前几期文章中,我们分了几次,把Go语言自身提供的,所有集合类的数据类型都讲了一遍,额外还讲了标准库的container包中的几个类型. 在几乎所有主流的编程语言中,集合类的数据类型都是最常用和最重要 ...

  2. shell文件报错syntax error near unexpected token '$'\r''

    本来跑的好好得一个文件,在windows下修改了,然后移植到linux就报错了. 找了一圈以下是解决方案: 这种情况发生的原因是因为你所处理的文件换行符是dos格式的"\r\n" ...

  3. layui table表格使用table.resize()方法 重置表格尺寸

    解决 使用layui中的table表格重置表格尺寸 问题 表格的高度共有两种写法 相对应的就有两种解决方法 第一种 当表格高度设置为固定高度时,改变表格高度使用 tableIns=table.rend ...

  4. 对于函数极限存在的充要条件“lim f(x)=A互推f(x)=A+a(x) lim a(x)=0”补充解释

    毫无疑问,这个定义适用于任何函数极限,诺f(x)有去间断点的时候,a(x)也为可去间断点函数. 例:

  5. 再见CMS

    观察网站最下方,根据备案号搜到这是个齐博CMS,然后百度就可以搜到齐博CMS漏洞了 然后开始利用 首先尝试了在用户信息修改处进行注入,发现好像想不通了,就在博客界面进行注入 Payload: 获取版本 ...

  6. 第2-4-2章 规则引擎Drools入门案例-业务规则管理系统-组件化-中台

    目录 3. Drools入门案例 3.1 业务场景说明 3.2 开发实现 3.3 小结 3.3.1 规则引擎构成 3.3.2 相关概念说明 3.3.3 规则引擎执行过程 3.3.4 KIE介绍 3. ...

  7. 把Mybatis Generator生成的代码加上想要的注释

    作者:王建乐 1 前言 在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件.但是Mybatis Generator默认生成的代码中,注释并不是我 ...

  8. 大前端html基础学习01

    根目录 相对路径:针对图片数量比较多的情况,新建一个文件夹,将所有图片放进去,imgs/cat.webp (1)/:下一级 (2)a/b/c/cat.webp 返回路径(向外找):从下一级html中找 ...

  9. 关于 python3 中的多线程的问题及理解

    什么是 join() ? join() 有什么用? 答:join() 有一个参数是timeout 设置超时,这里的超时都是针对主线程的,当子线程设置为 join(1) 后,则主线程会等待这个线程 1 ...

  10. go slice不同初始化方式性能&数组比较

    go语言开发中,slice是我们常用的数据类型之一,也是因为它的灵活性,自己也很少使用数组,当然我也知道它的一些特性,不过没有真实的去验证它,因为大多数使用场景没必要对code太过苛刻,但是如果封装作 ...