Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux上64位进程中的地址_C_Linux_64 Bit - Fatal编程技术网

C Linux上64位进程中的地址

C Linux上64位进程中的地址,c,linux,64-bit,C,Linux,64 Bit,我写了一个简单的C-pgm,它在源代码中有一个函数func,在共享库中有另一个函数funcs;汇编是通过以下方式完成的: $ gcc -shared -fPIC -o libfuncs.so -m64 -g funcs.c $ gcc -g -m64 -fPIC -o stack stack.c -L. -lfuncs i、 e.它是一个64位编译的phm和共享库: $ file stack libfuncs.so stack: ELF 64-bit LSB executable,

我写了一个简单的C-pgm,它在源代码中有一个函数func,在共享库中有另一个函数funcs;汇编是通过以下方式完成的:

$ gcc -shared -fPIC -o libfuncs.so -m64 -g funcs.c
$ gcc -g -m64 -fPIC -o stack stack.c -L. -lfuncs
i、 e.它是一个64位编译的phm和共享库:

$ file stack libfuncs.so
stack:       ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.0.0, BuildID[sha1]=bf7a7e15181e110789a4ee0b237f3a8ec58d4823, not stripped
libfuncs.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f1ffa166db952b92479c36169252e5ddff01e19e, not stripped
当我用gdb检查这个问题时,我有一个问题:为什么64位addr char*p显示为0x400734,或者在malloc之后显示为0x602010,我希望共享库中char*p有8个字节,显示为0x7ffff7bd9609:


当代码在gdb下运行时,将禁用该选项,以便于调试和再现。这使得将所有相关分配位打包到前32位地址变得更容易

它没有什么特别之处,分配足够大,您将开始看到更高的地址

试着在代码中而不是在gdb中打印指针,看看它是如何运行的


注意:评估空间布局随机化并不一定意味着分配不能驻留在较低的32位地址中,只是随机化占用了部分空间。此外,这取决于实际的地址随机化算法。

@guru 0x400734是8字节。0x400734怎么可能是8字节?0x0000000000400734是8个字节。所以0始终是0位?两个十六进制数字表示一个字节,每个Nyble是4位,可以包含数字0-15。GDB将地址格式化为%llx。前导零被省略,因为它们是零。你问为什么地址不是8字节,我说是8字节。虽然我同意[ASLR]不一定意味着分配不能驻留在较低的32位地址中,但它确实使这样的地址不太可能。
Breakpoint 1, main () at stack.c:12
12         char *p = "hello";
(gdb) n
14         p = (char *) malloc(10);
(gdb) p p
$1 = 0x400734 "hello"
(gdb) n
16         func(p, "foo");
(gdb) p p
$2 = 0x602010 ""
(gdb) s
func (p=0x602010 "", s=0x40073a "foo") at stack.c:25
25         char *a = "bla";
(gdb) n
27      }
(gdb) p a
$3 = 0x40073e "bla"
(gdb) n
main () at stack.c:17
17         funcs(p, "foo");   // this is a shared lib
(gdb) s
funcs (a=0x602010 "", b=0x40073a "foo") at funcs.c:8
8           char *p = "bar";
(gdb) n
10      }
(gdb) p p
$4 = 0x7ffff7bd9609 "bar"