LinuxForum.Fans
Тема

x86_64, openSUSE 11.3, скажите результат

Автор: UTe11ok 12 сообщений 3090 просмотров
#102407

Всем привет

Надо протестировать небольшую программку:

text
#include <stdio.h>
  #include <unistd.h>

int main () { printf("--------------------\n"); __asm__("movl $2, %eax; int $0x80"); printf("[i am %d]\n", getpid()); }

Сделайте gcc asm.c -o asm && ./asm и выложите сюда вывод.

Только для opeSUSE 11.3/11.4 и на x86-64 архитектуре (на 32 битной все ок).

#102410

Да и еще:
запустите потом strace ./asm и выложите в тегах [ code ] вывод после вызова write(1, "--------------------\n", 21--------------------) = 21

Будьте так любезны :P

#102443

20 просмотров, ни одного ответа.

Делов-то на 10 секунд...

#102463
UTe11ok написал:
20 просмотров, ни одного ответа.

Делов-то на 10 секунд...

Ну так я на дебиан и "прсомтрел"... И даже попробовал. Вывод надо?(64bit)

#102464
voral написал:
Ну так я на дебиан и "прсомтрел"... И даже попробовал. Вывод надо?(64bit)

Ну вообще-то я пытаюсь воспроизвести баг именно в oS 11.3/11.4.

Так получилось, что у меня всего одна 64bit машина дома и на ней oS 11.1, а хотелось бы последнюю.
Ну, думаю, ваш вывод будет тоже интересен wink

#102466

[console]
alex@debian:~/utenok$ gcc asm.c -o asm && ./asm
--------------------
[i am 4628]
[i am 4629]
[/console]
[console]
alex@debian:~/utenok$ strace ./asm
execve("./asm", ["./asm"], [/* 41 vars */]) = 0
brk(0) = 0x823000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5bbfa2000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=111792, ...}) = 0
mmap(NULL, 111792, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa5bbf86000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\355\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1432968, ...}) = 0
mmap(NULL, 3541032, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa5bba26000
mprotect(0x7fa5bbb7e000, 2093056, PROT_NONE) = 0
mmap(0x7fa5bbd7d000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x157000) = 0x7fa5bbd7d000
mmap(0x7fa5bbd82000, 18472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa5bbd82000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5bbf85000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5bbf84000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5bbf83000
arch_prctl(ARCH_SET_FS, 0x7fa5bbf84700) = 0
mprotect(0x7fa5bbd7d000, 16384, PROT_READ) = 0
mprotect(0x7fa5bbfa4000, 4096, PROT_READ) = 0
munmap(0x7fa5bbf86000, 111792) = 0
fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 5), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5bbfa1000
write(1, "--------------------\n", 21--------------------
) = 21
open(0xffffffff, O_RDONLY|O_SYNC|O_NOFOLLOW|O_CLOEXEC|0xbbf00000) = 4635
getpid() = 4634
[i am 4635]
write(1, "[i am 4634]\n", 12) = ? ERESTARTSYS (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
write(1, "[i am 4634]\n", 12[i am 4634]
) = 12
exit_group(12) = ?
[/console]

#102468

[console]
alex@debian:~/utenok$ uname -a
Linux debian 2.6.32-5-amd64 #1 SMP Sat Oct 30 14:18:21 UTC 2010 x86_64 GNU/Linux
[/console]

#102470

Ну вот та же фишка...

В файле /usr/src/linux/include/asm-x86/unistd_64.h вторым системным вызовом идет sys_open(), а не fork() как на 32bit архитектуре. При этом запускается fork(), что как бы и неплохо... но... получается, что strace обманывает нас, когда показывает open() oO

#102477

voral
Спасибо за вывод

#102478

Если интерестно, то вот на CentOS i386

[console]gcc asm.c -o asm && ./asm
--------------------
[i am 5163]
[i am 5162][/console]


[console] strace ./asm
execve("./asm", ["./asm"], [/* 22 vars */]) = 0
brk(0) = 0x9a32000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=40948, ...}) = 0
mmap2(NULL, 40948, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7ef8000
close(3) = 0
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340_\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1686224, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7ef7000
mmap2(NULL, 1410500, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x110000
mmap2(0x263000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x152) = 0x263000
mmap2(0x266000, 9668, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x266000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7ef6000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7ef66c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0x263000, 8192, PROT_READ) = 0
mprotect(0x79e000, 4096, PROT_READ) = 0
munmap(0xb7ef8000, 40948) = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f01000
write(1, "--------------------\n", 21--------------------
) = 21
fork() = 5192
[i am 5192]
getpid() = 5191
write(1, "[i am 5191]\n", 12[i am 5191]
) = 12
exit_group(12) = ?
[/console]

#102480

xlin

Cпасибо.

У Вас 32bit машина, и там видно (в выводе strace), что запускается fork(), что логично.

#102540

Хм...
Система:
Linux 2.6.31.14-0.4-desktop x86_64
openSUSE 11.2 x86_64

Первый вывод:

text
bigkvak@lingate:~/bin> ./asm
------------------
[i am 22676]
[i am 22675]

Второй вывод:

text
bigkvak@lingate:~/bin> strace ./asm
execve("./asm", ["./asm"], [/* 58 vars */]) = 0
brk(0)                                  = 0x602000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57ce02a000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57ce029000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/usr/lib64/mpi/gcc/openmpi/lib64/tls/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/mpi/gcc/openmpi/lib64/tls/x86_64", 0x7fff2dad24e0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/mpi/gcc/openmpi/lib64/tls/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/mpi/gcc/openmpi/lib64/tls", 0x7fff2dad24e0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/mpi/gcc/openmpi/lib64/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/mpi/gcc/openmpi/lib64/x86_64", 0x7fff2dad24e0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/mpi/gcc/openmpi/lib64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/mpi/gcc/openmpi/lib64", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=115540, ...}) = 0
mmap(NULL, 115540, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f57ce00c000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY)      = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\353\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1408560, ...}) = 0
mmap(NULL, 3516488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f57cdab3000
fadvise64(3, 0, 3516488, POSIX_FADV_WILLNEED) = 0
mprotect(0x7f57cdc04000, 2097152, PROT_NONE) = 0
mmap(0x7f57cde04000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x151000) = 0x7f57cde04000
mmap(0x7f57cde09000, 18504, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f57cde09000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57ce00b000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57ce00a000
arch_prctl(ARCH_SET_FS, 0x7f57ce00a6f0) = 0
mprotect(0x7f57cde04000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ)     = 0
mprotect(0x7f57ce02b000, 4096, PROT_READ) = 0
munmap(0x7f57ce00c000, 115540)          = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57ce028000
write(1, "------------------\n", 19------------------
)    = 19
open(0xffffffff, O_RDONLY|O_LARGEFILE|O_NOFOLLOW|0xce000000[i am 22687]
) = 22687
--- SIGCHLD (Child exited) @ 0 (0) ---
getpid()                                = 22686
write(1, "[i am 22686]\n", 13[i am 22686]
)          = 13
exit_group(13)                          = ?

И тоже вместо форка оупен....
Позже включу ноут, посмотрю что на нем получается... там 11.3 32битная...

файла такого /usr/src/linux/include/asm-x86/unistd_64.h у Меня нету...
единственное что обнаружил: /usr/include/asm/unistd_64.h
в нем, второй системный функций open

text
#define __NR_open                                                                2
Войдите или зарегистрируйтесь, чтобы ответить.