推 b0920075: 0x400624那部分的位置應該只是data section存放的data 01/30 01:54
→ b0920075: ,不是 machine code...,除非你把process的數值都稱作 01/30 01:54
→ b0920075: machine code 01/30 01:54
應該是像你說的才是。
這部份一樣都會在 fork 之後被複製。
推 b0920075: 是說fork的實作應該在kernel內,linux發行版的同版本ke 01/30 01:59
→ b0920075: rnel應該要一樣吧,為啥會不一樣? 01/30 01:59
→ Lipraxde: data 當指令 dump...? 01/30 03:48
→ Lipraxde: 位置不一樣我還蠻好奇的,有圖嗎? 01/30 03:48
char *ptr="abcdef";
11ba: c7 45 f4 08 20 00 00 movl $0x2008,-0xc(%ebp)
0x2008 位址是 abcdef
2008: 61 popa
2009: 62 63 64 bound %esp,0x64(%ebx)
200c: 65 66 00 63 68
parent ptr: 0x5656a008
child ptr: 0x5656a008
ptr 應該要是 0x2008, 但結果卻是 0x5656a008。
這是在 debian 上測試的結果。
我猜測是 loader 載入時加了一個 offset。
→ b10007034: 謝大大回覆! 01/30 06:17
推 b0920075: 這不就是PIE下的offset嗎,要加上process的base addees 01/30 11:44
→ b0920075: s才會是地址阿 01/30 11:44
我有試過 -fno-pie 也是這樣。
在 debian 使用 -m32 才可以加上 -fno-pic -fno-pie。
否則會有以下錯誤。
gcc -g -fno-pic -fno-pie f.c -o f
/usr/bin/ld: /tmp/ccYo1k1x.o: relocation R_X86_64_32S against `.rodata' can
not be used when making a PIE object; recompile with -fPIE
看起來好像是 gcc 9 的關係, 我用 gcc5 編譯之後, 可以取得和 ubuntu 相同結果。
不知道是不是這個的關係, --enable-default-pie
https://nanxiao.me/en/gccs-enable-enable-default-pie-option-make-you-stuck-at-relocation-r_x86_64_32s-against-error/
gcc -static -g -fno-pic -fno-pie f.c -o f
用這個也可以。
→ Lipraxde: -fno-pic 沒作用@@ 01/30 12:15
※ 編輯: descent (175.98.141.254 臺灣), 01/30/2020 13:21:49
推 b0920075: 喔喔所以是gcc的關係嗎?如果是ubuntu用gcc9呢 01/30 16:44
→ Lipraxde: 直接 -no-pie,不要 f 01/30 17:29
→ descent: 感謝, 原來還有這個 option 01/30 17:59