Bug Board

记录bug

-bash: ./app: no such file or directory

Bug产生背景:项目里用g++编译产生*.o,然后再用动态链接得到可执行文件app,执行时发现无法运行,报错信息非常奇怪,是-bash: ./app: no such file or directory。看到这个报错我的第一反应当然是检查文件是否存在,ls指令告诉我文件的确存在。

# ls -lh | grep app
-rwxr-xr-x 1 root root 115K Aug 25 17:34 app

遇到没有见过的bug,首先要做的当然是搜索有没有类似的问题。用关键词"bash", "no such file or directory"的确搜索到了很多post,提示有可能是文件的位数和系统位数不一致,比如32的文件尝试在64位系统上执行,就会产生这个错误。file指令告诉我文件是64位的,然后uname指令又告诉我系统也是64位的。因此这个原因被排除了。

# file app
app: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld64.so.1, 
for GNU/Linux 2.6.32, BuildID[sha1]=01185822dd63c4dd6da6c6673ae7bdc36f8cac43, not stripped

# uname -a
Linux vca_node_00 4.14.20-1.2.3.26.vca #1 SMP Wed Nov 28 17:11:04 CET 2018 x86_64 x86_64 x86_64 GNU/Linux

更进一步的搜索结果暗示bug可能是缺失的系统库引起的,用ldd命令检查发现系统库一切正常。

# ldd app
        linux-vdso.so.1 =>  (0x00007ffe1ba94000)
        libsgx_urts.so => /usr/lib/x86_64-linux-gnu/libsgx_urts.so (0x00007f01fd02b000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f01fce0e000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f01fca8c000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f01fc6c2000)
        libsgx_enclave_common.so.1 => /usr/lib/x86_64-linux-gnu/libsgx_enclave_common.so.1 (0x00007f01fc4b2000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f01fc2ae000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f01fc098000)
        /lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f01fd26e000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f01fbd8f000)
        libsgx_uae_service.so => /usr/lib/x86_64-linux-gnu/libsgx_uae_service.so (0x00007f01fbb10000)
        libprotobuf.so.9 => /usr/lib/x86_64-linux-gnu/libprotobuf.so.9 (0x00007f01fb7f2000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f01fb5d8000)

感觉debug陷入了走投无路的阶段了。直接解析源码,发现program sections一切正常。

# readelf -l app

Elf file type is EXEC (Executable file)
Entry point 0x4017d0
There are 8 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001c0 0x00000000000001c0  R E    8
  INTERP         0x0000000000000200 0x0000000000400200 0x0000000000400200
                 0x000000000000000f 0x000000000000000f  R      1
      [Requesting program interpreter: /lib/ld64.so.1]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x000000000000a3c8 0x000000000000a3c8  R E    200000
  LOAD           0x000000000000ac80 0x000000000060ac80 0x000000000060ac80
                 0x0000000000000718 0x0000000000000998  RW     200000
  DYNAMIC        0x000000000000add8 0x000000000060add8 0x000000000060add8
                 0x0000000000000200 0x0000000000000200  RW     8
  NOTE           0x0000000000000210 0x0000000000400210 0x0000000000400210
                 0x0000000000000044 0x0000000000000044  R      4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     10
  GNU_RELRO      0x000000000000ac80 0x000000000060ac80 0x000000000060ac80
                 0x0000000000000380 0x0000000000000380  R      1

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame .gcc_except_table 
   03     .init_array .fini_array .jcr .data.rel.ro .dynamic .got .got.plt .data .bss 
   04     .dynamic 
   05     .note.ABI-tag .note.gnu.build-id 
   06     
   07     .init_array .fini_array .jcr .data.rel.ro .dynamic .got

但program headers中有一行引人注意:[Requesting program interpreter: /lib/ld64.so.1]。结合关键词ld64.so.1,新的搜索结果显示尽管ldd告诉我们系统知道了这个库的位置,但在/lib64文件夹下的库在程序装载时无法使用。这个库是一个关键的动态链接库,失去这个库程序必然无法运行。

解决方法是建立软链接/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2,或者直接把库从/lib64中拷贝到/lib中来。完成库的修复后,再次执行app,结果一切正常。

尽管问题解决了,但bug的内在机理,bug的生成原因目前尚不知晓。推测与编译链接过程中的某些不当操作有关。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容