进程环境
# 进程环境
ldd
命令可以查看一些可执行文件的依赖库
[root@VM-16-4-centos process]# ldd /usr/bin/php
linux-vdso.so.1 => (0x00007ffe3afdc000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f5ad5d26000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f5ad5b0c000)
librt.so.1 => /lib64/librt.so.1 (0x00007f5ad5904000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f5ad55fc000)
libm.so.6 => /lib64/libm.so.6 (0x00007f5ad52fa000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f5ad50f6000)
libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f5ad4d8c000)
libssl.so.1.0.0 => /usr/local/openssl/lib/libssl.so.1.0.0 (0x00007f5ad4b1a000)
libcrypto.so.1.0.0 => /usr/local/openssl/lib/libcrypto.so.1.0.0 (0x00007f5ad46c4000)
libsqlite3.so.0 => /lib64/libsqlite3.so.0 (0x00007f5ad440f000)
libz.so.1 => /lib64/libz.so.1 (0x00007f5ad41f9000)
libcurl.so.4 => /usr/local/curl/lib/libcurl.so.4 (0x00007f5ad3f85000)
libcares.so.2 => /lib64/libcares.so.2 (0x00007f5ad3d74000)
libpng15.so.15 => /lib64/libpng15.so.15 (0x00007f5ad3b49000)
libwebp.so.4 => /lib64/libwebp.so.4 (0x00007f5ad38f9000)
libjpeg.so.62 => /lib64/libjpeg.so.62 (0x00007f5ad36a4000)
libfreetype.so.6 => /lib64/libfreetype.so.6 (0x00007f5ad33e5000)
libicuio.so.50 => /lib64/libicuio.so.50 (0x00007f5ad31d7000)
libicui18n.so.50 => /lib64/libicui18n.so.50 (0x00007f5ad2dd8000)
libicuuc.so.50 => /lib64/libicuuc.so.50 (0x00007f5ad2a5f000)
libicudata.so.50 => /lib64/libicudata.so.50 (0x00007f5ad148c000)
libonig.so.5 => /lib64/libonig.so.5 (0x00007f5ad1209000)
libsodium.so.23 => /lib64/libsodium.so.23 (0x00007f5ad0fb1000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f5ad0d9b000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5ad09cd000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f5ad07ca000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5ad05ae000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5ad5f5d000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f5ad0388000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f5ad0178000)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
使用nm
具体查看ELF
文件中的函数以及变量的虚拟内存地址
readelf -h demo1
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
# 入口地址
Entry point address: 0x400490
Start of program headers: 64 (bytes into file)
Start of section headers: 6624 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 30
Section header string table index: 29
[root@VM-16-4-centos process]# nm demo1
0000000000601044 B __bss_start
0000000000601044 b completed.6355
0000000000601038 D __data_start
0000000000601038 W data_start
00000000004004c0 t deregister_tm_clones
0000000000400530 t __do_global_dtors_aux
0000000000600e18 t __do_global_dtors_aux_fini_array_entry
0000000000400648 R __dso_handle
0000000000600e28 d _DYNAMIC
0000000000601044 D _edata
0000000000601050 B _end
0000000000400634 T _fini
0000000000400550 t frame_dummy
0000000000600e10 t __frame_dummy_init_array_entry
00000000004007b0 r __FRAME_END__
0000000000601000 d _GLOBAL_OFFSET_TABLE_
0000000000601048 B glob_var
000000000060103c D glob_var1
w __gmon_start__
0000000000400664 r __GNU_EH_FRAME_HDR
000000000040057d T hello
0000000000400418 T _init
0000000000600e18 t __init_array_end
0000000000600e10 t __init_array_start
0000000000400640 R _IO_stdin_used
0000000000600e20 d __JCR_END__
0000000000600e20 d __JCR_LIST__
0000000000400630 T __libc_csu_fini
00000000004005c0 T __libc_csu_init
U __libc_start_main@@GLIBC_2.2.5
000000000040058a T main
U printf@@GLIBC_2.2.5
U puts@@GLIBC_2.2.5
00000000004004f0 t register_tm_clones
0000000000400490 T _start # 从这开始运行 和入口地址一样
0000000000601048 D __TMC_END__
0000000000601040 d x.2688
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
程序存储空间布局
# 命令函参数与环境参数表
来一个案例c
代码:
#include <stdio.h>
#include <stdlib.h>
// 命令行参数
int main(int argc, char *argv[])
{
printf("%d\n", argc);
printf("%s\n", argv[0]); // 通常都是文件名
printf("%s\n", argv[1]);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
首先进行编译
gcc demo2.c -o demo2
1
然后运行可执行文件加一些参数
[root@VM-16-4-centos process]# ./demo2 a b c
4
./demo2
a
1
2
3
4
5
2
3
4
5
再换一个 PHP 代码
<?php
print_r($argv);
1
2
3
2
3
我们必须在cli
即终端模式下进行运行
[root@VM-16-4-centos process]# php demo2.php a b c
Array
(
[0] => demo2.php
[1] => a
[2] => b
[3] => c
)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
[a b c]
这 3 个参数就叫命令行参数,会把 3 个参数传给这个变量。
[root@VM-16-4-centos process]# strace -f -s 6500 ./demo2 a b c
execve("./demo2", ["./demo2", "a", "b", "c"], 0x7fffec5e9420 /* 25 vars */) = 0
brk(NULL) = 0x1ce9000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5eeaaee000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=51367, ...}) = 0
mmap(NULL, 51367, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5eeaae1000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`&\2\0\0\0\0\0@\0\0\0\0\0\0\0p\325 \0\0\0\0\0\0\0\0\0@\08\0\n\0@\0K\0J\0\6\0\0\0\5\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0000\2\0\0\0\0\0\0000\2\0\0\0\0\0\0\10\0\0\0\0\0\0\0\3\0\0\0\4\0\0\0`\354\30\0\0\0\0\0`\354\30\0\0\0\0\0`\354\30\0\0\0\0\0\34\0\0\0\0\0\0\0\34\0\0\0\0\0\0\0\20\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0203\34\0\0\0\0\0\0203\34\0\0\0\0\0\0\0 \0\0\0\0\0\1\0\0\0\6\0\0\0\3606\34\0\0\0\0\0\3606<\0\0\0\0\0\3606<\0\0\0\0\0\260Q\0\0\0\0\0\0\20\233\0\0\0\0\0\0\0\0 \0\0\0\0\0\2\0\0\0\6\0\0\0`k\34\0\0\0\0\0`k<\0\0\0\0\0`k<\0\0\0\0\0\360\1\0\0\0\0\0\0\360\1\0\0\0\0\0\0\10\0\0\0\0\0\0\0\4\0\0\0\4\0\0\0p\2\0\0\0\0\0\0p\2\0\0\0\0\0\0p\2\0\0\0\0\0\0D\0\0\0\0\0\0\0D\0\0\0\0\0\0\0\4\0\0\0\0\0\0\0\7\0\0\0\4\0\0\0\3606\34\0\0\0\0\0\3606<\0\0\0\0\0\3606<\0\0\0\0\0\20\0\0\0\0\0\0\0\240\0\0\0\0\0\0\0\20\0\0\0\0\0\0\0P\345td\4\0\0\0|\354\30\0\0\0\0\0|\354\30\0\0\0\0\0|\354\30\0\0\0\0\0\374j\0\0\0\0\0\0\374j\0\0\0\0\0\0\4\0\0\0\0\0\0\0Q\345td\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\0\0\0\0R\345td\4\0\0\0\3606\34\0\0\0\0\0\3606<\0\0\0\0\0\3606<\0\0\0\0\0\209\0\0\0\0\0\0\209\0\0\0\0\0\0\1\0\0\0\0\0\0\0\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\215\251p}Q\216\210\27\233\33)\3\315\204l\202\20-\204\301\4\0\0\0\20\0\0\0\1\0\0\0GNU\0\0\0\0\0\2\0\0\0\6\0\0\0 \0\0\0\0\0\0\0\363\3\0\0\7\0\0\0\0\1\0\0\16\0\0\0\0000\20D\240 \2\1\210\3\346\220\305E\214\0\300\0\10\0\5\200\0`\300\200\0\r\212\f\0\4\20\0\210D2\10.@\210T<, \0162H&\204\300\214\4\10\0\2\2\16\241\254\32\4f\300\0\3002\0\300\0P\1 \201\10\204\v ($\0\4 Z\0\20X\200\312DB(\0\6\200\20\30B\0 @\200\0\tP\0Q\212@\20\0\0\0\0\10\0\0\21\20", 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2156592, ...}) = 0
mmap(NULL, 3985920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f5eea500000
mprotect(0x7f5eea6c4000, 2093056, PROT_NONE) = 0
mmap(0x7f5eea8c3000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c3000) = 0x7f5eea8c3000
mmap(0x7f5eea8c9000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f5eea8c9000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5eeaae0000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5eeaade000
arch_prctl(ARCH_SET_FS, 0x7f5eeaade740) = 0
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/sysconfig/strcasecmp-nonascii", F_OK) = -1 ENOENT (No such file or directory)
mprotect(0x7f5eea8c3000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7f5eeaaef000, 4096, PROT_READ) = 0
munmap(0x7f5eeaae1000, 51367) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5eeaaed000
write(1, "4\n", 24
) = 2
write(1, "./demo2\n", 8./demo2
) = 8
write(1, "a\n", 2a
) = 2
exit_group(0) = ?
+++ exited with 0 +++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
可以看到
execve("./demo2", ["./demo2", "a", "b", "c"], 0x7fffec5e9420 /* 25 vars */) = 0
是把
a b c
参数传递进去的。
<?php
print_r($argv);
print_r($GLOBALS);
print_r($_SERVER);
1
2
3
4
5
2
3
4
5
PHP 的下面 2 个全局变量,也可以进行查看argc
和argv
的参数内容,因为php
的解释器是C
语言写的,所以命令行参数都差不多。
# 环境参数
[root@VM-16-4-centos process]# strace -f -s 65500 ./demo2
execve("./demo2", ["./demo2"], 0x7ffe4a696458 /* 25 vars */) = 0
1
2
3
2
3
就是0x7ffe4a696458
这么一段内容就是环境参数表内容。
php 代码则使用getenv
函数来获取
// bash 进程 调用 execve 函数 传递进来的
print_r(getenv());
1
2
2
如果是windows
下的话,那就是我的电脑:环境变量里的属性
Linux 下除了个别的,几乎也都差不多,我们还可以在shell
中自定义环境变量:
vim /etc/bash_profile
1
decaler -x csm="good body and good man"
export csm
1
2
2
然后可以在终端中输出变量
echo $csm
good body and good man
1
2
2
编辑 (opens new window)
上次更新: 2022/03/31, 23:19:55