Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
void _start(void) {
// stuff
asm("xorq %rdi, %rdi"); // код выхода 0
asm("movq $60, %rax"); // номер системного вызова 60 - exit
asm("syscall"); // выход
};
$ gcc -nostdlib -fomit-frame-pointer -Wl,--strip-all app.c -o app
-fomit-frame-pointer — позволит избавиться от мусора в коде (возня со стеком)-Wl,--strip-all — выпиливает символы (экспресс похудение)-nostdlib напрочь отменяет все подготовительные и завершающие процедуры. Конкретно: аргументов argc, argv, env не будет, ну и как Вы уже смогли убедиться — вызывать выход нужно вручную. Попробуйте заменить
asm("xorq %rdi, %rdi");
asm("movq $97, %rdi");
bash например это$ echo $?
exit() принимает код возврата в %rid. А xorq %rdi, %rdi, уверен Вам известно — это обнуление регистра. Если нужны аргументы или переменные окружения, то они лежат в стеке и на самой верхушке лежит argc.-O3 и осознавать что бородатые дядьки, что пилят gcc применяют хвостовую рекурсию.void _start(void) {
// puts
char hw[] = "Hello, World!\n";
__asm__ __volatile__ ("movq $1, %%rax\n\t"
"movq $1, %%rdi\n\t"
"syscall"
:
: "S" (hw), "d" (sizeof(hw)-1) // S - %rsi, d - %rdx
: "%rax", "%rdi"
);
// exit
__asm__ __volatile__ ("xorq %%rdi, %%rdi\n\t"
"movq $60, %%rax\n\t"
"syscall"
:
:
: "%rdi", "%rax");
};
sudo yum -y install centos-release-scl cmake3
sudo yum -y install devtoolset-7-gcc devtoolset-7-gcc-c++
sudo scl enable devtoolset-7 bash
export CC=/opt/rh/devtoolset-7/root/usr/bin/gcc
export CPP=/opt/rh/devtoolset-7/root/usr/bin/cpp
export CXX=/opt/rh/devtoolset-7/root/usr/bin/c++
export LIBS=/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/libstdc++_nonshared.a
cmake3 . -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON
make
[ 95%] Building CXX object CMakeFiles/xmrig-notls.dir/src/crypto/Asm.cpp.o
[ 97%] Building CXX object CMakeFiles/xmrig-notls.dir/src/crypto/cn_gpu_avx.cpp.o
[ 98%] Building CXX object CMakeFiles/xmrig-notls.dir/src/crypto/cn_gpu_ssse3.cpp.o
[100%] Linking CXX executable xmrig-notls
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: cannot find -lpthread
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: cannot find -lrt
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: cannot find -ldl
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: cannot find -lm
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: cannot find -lc
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/xmrig-notls.dir/build.make:1633: xmrig-notls] Error 1
make[1]: *** [CMakeFiles/Makefile2:106: CMakeFiles/xmrig-notls.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
[root@localhost build]#
==================================================
attempt to open //opt/rh/devtoolset-6/root/usr/x86_64-redhat-linux/lib64/libpthread.so failed
attempt to open //opt/rh/devtoolset-6/root/usr/x86_64-redhat-linux/lib64/libpthread.a failed
attempt to open //opt/rh/devtoolset-6/root/usr/lib64/libpthread.so failed
attempt to open //opt/rh/devtoolset-6/root/usr/lib64/libpthread.a failed
attempt to open //usr/local/lib64/libpthread.so failed
attempt to open //usr/local/lib64/libpthread.a failed
attempt to open //lib64/libpthread.so failed
attempt to open //lib64/libpthread.a failed
attempt to open //usr/lib64/libpthread.so succeeded
opened script file //usr/lib64/libpthread.so
opened script file //usr/lib64/libpthread.so
attempt to open /lib64/libpthread.so.0 succeeded
/lib64/libpthread.so.0
attempt to open /usr/lib64/libpthread_nonshared.a succeeded
libc.so.6 needed by /lib64/libpthread.so.0
found libc.so.6 at //lib64/libc.so.6
ld-linux-x86-64.so.2 needed by /lib64/libpthread.so.0
found ld-linux-x86-64.so.2 at //lib64/ld-linux-x86-64.so.2
ld: warning: cannot find entry symbol _start; not setting start address
Привет из свободного от libc мира! (Часть 1)