首页 > 其他分享 >解决gdb 在64位机器上显示sizeof(long)=4的问题

解决gdb 在64位机器上显示sizeof(long)=4的问题

时间:2024-07-03 23:53:19浏览次数:7  
标签:i386 long powerpc gdb 64 sizeof

问题:gdb 在64位机器上显示sizeof(long)=4

大家都知道在64位机器上,c语言的long类型占用8个字节,但今天因验证一个功能,启动gdb,执行了print sizeof(long) 返回值为4,让人大为震惊,是服务器环境有问题吗?

赶快编写一个最简单的c程序

1 #include <stdio.h>
2 
3 int main(void){
4   printf("sizeof(int)=%d\n",sizeof(int));
5   printf("sizeof(long)=%d\n",sizeof(long));
6   printf("sizeof(long int)=%d\n",sizeof(long int));
7   printf("sizeof(long long)=%d\n",sizeof(long long));
8   return 0 ;
9 }

编译运行

1 [ansible@rocky works]$ gcc p.c
2 [ansible@rocky works]$ ./a.out 
3 sizeof(int)=4
4 sizeof(long)=8
5 sizeof(long int)=8
6 sizeof(long long)=8

看来服务器没有问题,估计是gdb的问题,在搜索引擎上搜索,得到有效资料:

1、Bug 80777 - gdb sizeof(long int)=4 but gcc sizeof(long int)=8 on x86_64-pc-cygwin
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80777
2、Bug 518712 - gdb thinks sizeof(long)==4 on 64bit
https://bugzilla.redhat.com/show_bug.cgi?id=518712

总结原因:gdb 缺省架构为i386,所以sizeof(long)=4,如果设置为x64,则sizeof(long)=8

网络资料:验证过程:

[ansible@rocky ~]$ gdb
GNU gdb (GDB) Rocky Linux 10.2-13.el9
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) print sizeof(int)
$1 = 4
(gdb) print sizeof(long)
$2 = 4
(gdb) print sizeof(long int)
$3 = 4
(gdb) print sizeof(long long)
$4 = 8
(gdb) show arch
The target architecture is set to "auto" (currently "i386").
(gdb) set arch
Requires an argument. Valid arguments are i386, i386:x86-64, i386:x64-32, i8086, i386:intel, i386:x86-64:intel, i386:x64-32:intel, s390:64-bit, s390:31-bit, rs6000:6000, rs6000:rs1, rs6000:rsc, rs6000:rs2, powerpc:common64, powerpc:common, powerpc:603, powerpc:EC603e, powerpc:604, powerpc:403, powerpc:601, powerpc:620, powerpc:630, powerpc:a35, powerpc:rs64ii, powerpc:rs64iii, powerpc:7400, powerpc:e500, powerpc:e500mc, powerpc:e500mc64, powerpc:MPC8XX, powerpc:750, powerpc:titan, powerpc:vle, powerpc:e5500, powerpc:e6500, arm, armv2, armv2a, armv3, armv3m, armv4, armv4t, armv5, armv5t, armv5te, xscale, ep9312, iwmmxt, iwmmxt2, armv5tej, armv6, armv6kz, armv6t2, armv6k, armv7, armv6-m, armv6s-m, armv7e-m, armv8-a, armv8-r, armv8-m.base, armv8-m.main, armv8.1-m.main, arm_any, aarch64, aarch64:ilp32, aarch64:armv8-r, auto.
(gdb) set arch i386:x86-64
The target architecture is set to "i386:x86-64".
(gdb) show arch
The target architecture is set to "i386:x86-64".
(gdb) print sizeof(int)
$5 = 4
(gdb) print sizeof(long)
$6 = 8
(gdb) print sizeof(long int)
$7 = 8
(gdb) print sizeof(long long)
$8 = 8

虽然极少情况使用gdb当计算器,但万一呢?还是找一下解决方案吧

解决: 设置gdb的配置文件

vi ~/.gdbinit
set arch i386:x86-64

保存后,再执行gdb

[ansible@rocky works]$ gdb
...
For help, type "help".
Type "apropos word" to search for commands related to "word".
The target architecture is set to "i386:x86-64".
(gdb) print sizeof(int)
$3 = 4
(gdb) print sizeof(long)
$4 = 8
(gdb) print sizeof(long int)
$2 = 8
(gdb) print sizeof(long long)
$1 = 8

补充,如果gdb一个执行程序, 则gdb自动从程序处获得arch 信息

删除 .gdbinit

gdb
GNU gdb (GDB) Rocky Linux 10.2-13.el9
...
(gdb) show arch
The target architecture is set to "auto" (currently "i386").

调试a.out
[ansible@rocky works]$ gdb a.out
...
(gdb) show arch
The target architecture is set to "auto" (currently "i386:x86-64").

总结:gdb一个简单的问题,在32位机器上没有问题,但在64位机器上的缺省参数没有做到自适应,白白给人带来了困扰,或者说当64位机器成为主流后,代码的维护者没有及时修改,至少属于不积极吧。我们在开发软件过程中要引以为戒,充分考虑软件的主流运行平台的适应以及平台兼容性问题。

  

标签:i386,long,powerpc,gdb,64,sizeof
From: https://www.cnblogs.com/fanzhenyong/p/18282752

相关文章

  • 用WSL2+Docker Desktop部署InLong的坑和经验
    WSL的网络坑死了————题记看到腾讯在搞开源,邂逅了ApacheInLong,觉得很有意思,就开始研究。考虑到这是和性能有关的东西,以后说不定还要压测什么的,所以就决定用WSL2+DockerDesktop,不用虚拟机了,感觉这样性能会好一点,正好也熟悉熟悉命令行,毕竟打CTF虽然天天用Linux但基本能用GU......
  • Linux-gdb
    目录1.-g生成含有debug信息的可执行文件2.gdb开始以及gdb中的常用执行指令3.断点的本质用法4.快速跳出函数体5.其他1.-g生成含有debug信息的可执行文件2.gdb开始以及gdb中的常用执行指令3.断点的本质用法断点的本质是帮助我们缩小出问题的范围比如,......
  • Vue3实战笔记(64)—Vue 3自定义指令的艺术:实战中的最佳实践
    文章目录前言一、一些简单的Vue3自定义指令超实用案例总结前言书接上文,在Vue3中,自定义指令是一种强大的工具,允许我们扩展HTML元素的功能。通过自定义指令,我们可以创建可重用的行为,并将它们绑定到任何元素上。下面,本文备份一些简单的Vue3自定义指令超实用案例,并解释......
  • jdk17 package sun.misc.BASE64Encoder 报找不到符号
    解决办法:对于只需要Base64编码的简单场景,可以考虑使用Java8及以上版本提供的内置`java.util.Base64`类,这是一个标准API,无需额外引入任何库: //importsun.misc.BASE64Encoder;//java8importjava.util.Base64;//java17publicclassBase64EncodingExample{......
  • [漏洞复现]Geoserver表达式注入致远程代码执行漏洞(CVE-2024-36401)
    觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。看到长亭昨晚发送的漏洞风险提示,我这边快马加鞭看看能不能赶上热度,payload就放在星球了,欢迎各位师傅来白嫖,看上眼的话可以留下试试。漏洞描述GeoServer是一个开源服务器,用于共享、处......
  • 安装Mingw64
    进入官网:MinGW-w64-for32and64bitWindowsdownload|SourceForge.net点击Files,找到如下所示的这个版本双击即可下载,下载完成后解压在c盘将路径“C:\mingw64\bin”设置为环境变量(选中PATH,点击编译——新建)到此完成安装,在powershell输入命令测......
  • 丝滑解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_
    基础环境:MacOSm1、python=3.9前情提要:在Anaconda终端运行代码的时候,显示报错:importError:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:version`GLIBCXX_3.4.29'notfound1问题分析:根据提示是/usr/lib/x86_64-linux-gnu/路径下的libstdc++.so.6缺少版本GLIBCXX_3.4.29解......
  • (nice!!!)LeetCode 3164. 优质数对的总数 II(数组、哈希表)
    3164.优质数对的总数II思路:先找出可以被k整除的nums[i].方法一:统计因子。1、找出数组nums1每个元素的因子,用哈希表来记录每个因子出现的次数。然后再遍历数组nums2进行累加即可。classSolution{public:constintN=1e6+10;longlongnumberOfPairs(vec......
  • C++编译问题,解决arm下链接静态库,引起的relocation R_AARCH64_ADR_PREL_PG_HI21 agains
    显示的完整错误如下:relocationR_AARCH64_ADR_PREL_PG_HI21againstsymbol`ZN2c43yml9free_implEPvmS1'whichmaybindexternallycannotbeusedwhenmakingasharedobject;recompilewith-fPIC根据提示,在链接.a静态库时,应该在编译时加上参数-fPIC然而CMake文件中已......
  • 嵌入式GDB调试Linux C程序或交叉编译(开发板)
    目录简介开始使用电脑端准备安装gdb1.编译带调试信息的可执行文件2.进入gdb3.启动程序常用命令设置断点:进入函数打印数值结束常用命令l回车键bCSnpq参考文档1、安装gdb。2、gdb的简单使用。(1)在可执行文件中加入源码信息(2)进入gdb(3)gdb调试常用命令[1]start[2]单步执行(n......