Комментарии 61
НЛО прилетело и опубликовало эту надпись здесь
Имхо, написано неплохо вне зависимости от пола.
+9
«для девушки очень неплохо написано» — для тролля так себе провокация.
+21
Я хочу подчеркнуть что вы идиот и поставить вам за это минус :-)
Хотя нет. Вы жирный и толстый. Обойдетесь.
Хотя нет. Вы жирный и толстый. Обойдетесь.
0
А я с тобой согласен полностью и не минусую ни разу, а кто минусует, тот не шарит. Только ты заметил, что это западная «девушка», блог расположен, там где занимаются ядром linux (видимо, поэтому и отвязка от userspace идет). А перевел, вроде, всеравно парень.
-2
А чем так плох libc кроме лишних 11Кб?
ИМХО, сейчас очень редко 11Кб могут стать проблемой.
ИМХО, сейчас очень редко 11Кб могут стать проблемой.
+3
Ничем не плох, смысл статьи вот же в чем:
>В качестве упражнения я хочу написать программу на С. Достаточно простую для того, чтобы дизассемблировать ее и объяснить весь код самой себе.
>В качестве упражнения я хочу написать программу на С. Достаточно простую для того, чтобы дизассемблировать ее и объяснить весь код самой себе.
+1
А зачем эти негодяи засовывают в мою программу 11 Кб ненужного кода? Какой-то индус-стайл подход!
Кстати, сам libc мне тоже не нравится, весит по моему больше мегабайта, при том что ничего значительного не содержит, так, всякие вспомогательные функции.
Кстати, сам libc мне тоже не нравится, весит по моему больше мегабайта, при том что ничего значительного не содержит, так, всякие вспомогательные функции.
-3
Да дело не в 11 кб, а в том, что автор заметила в поведении компилятора нечто, что не смогла объяснить, но не прошла мимо, а докопалась до истины. По-моему, это заслуживает глубокого респекта.
+7
Расскажите какой быстрый и простой сделать расцветку кода, а то я не нашел как.
0
В хабраредакторе есть подсветка кода.
0
Криво там реализовано, нужно же как:
а) идеальный вариант — вбил текст вперемежку с кодом, тапнул «тут есть код» и готово (а совсем идеальный — и тапать не надо);
б) годный вариант — выделил блок когда мышкой, тапнул кнопку «подсветить».
А не копипейстить туда-сюда. Пока что опробую pastebin.com или буду использовать тег pre.
а) идеальный вариант — вбил текст вперемежку с кодом, тапнул «тут есть код» и готово (а совсем идеальный — и тапать не надо);
б) годный вариант — выделил блок когда мышкой, тапнул кнопку «подсветить».
А не копипейстить туда-сюда. Пока что опробую pastebin.com или буду использовать тег pre.
+1
> char *str = «Hello World»;
const char *str
const char *str
+4
«фигасе» (с), забавный хак :-), действительно было интересно, не часто встретишь достойное почитать, написаное достаточно легко, чтоб не напрягаться и достаточно сложно, чтоб не было скушно,
А вообще свободный од glibc мир — это uClibc, dietlibc, Newlib. С первой работал, вот такой простой примерчик занял у меня около 3 кб на SH4 архитектуре и около 14 на PPC405. Практически уверен, что для 386 архитектуры, собраный интеловским компилятором будет меньше 3кб.
А вообще свободный од glibc мир — это uClibc, dietlibc, Newlib. С первой работал, вот такой простой примерчик занял у меня около 3 кб на SH4 архитектуре и около 14 на PPC405. Практически уверен, что для 386 архитектуры, собраный интеловским компилятором будет меньше 3кб.
+3
Кстати, фото автора ;)
+25
а по посту и не скажешь, habrahabr.ru/blogs/nix_coding/88101/#comment_2640714
-3
Вот сайт автора переведенной статьи
web.mit.edu/jesstess/www/
web.mit.edu/jesstess/www/
+1
Люблю вот такие вещи, поковыряться да посмотреть как оно там работает :-)
+1
Странный призыв: программировать на Си и Ассемблере, чтобы избавиться от libc :). А главное ещё 'добро пожаловать'. Чего-то мне кажется, что она в итоге начнёт фигачить ображение к системе через syscall'ы, и добра совсем от этого не прибавится. Надо было статью назвать как-то вроде: как происходит запуск программ в Linux.
P.S. Йэхъ. Побольше бы подобных русскоязычных деффушек :)
P.S. Йэхъ. Побольше бы подобных русскоязычных деффушек :)
-2
Если вам надо меньше кода, то лучше все же взять ulibc :)
0
На второй странице программа перестает выводить Hello world, но главное, что автор — девушка.
+1
Когда-то тоже игрался, убирал райнтайм. Бессмысленное занятие.
+2
захотелось даже снова за Си взяться :)
+1
Так, хорошо, от libc мы освободились. Теперь бы аналог банального printf…
+4
Крутооо!!!
0
НЛО прилетело и опубликовало эту надпись здесь
Выдержка из резюме «девочки»:
Projects and Awards
• (2009 ) Mobile Application Competition: wrote a location-aware, collaborative task manager
with persistent storage for the iPhone. Winner of the Qualcomm award.
• (2009 )Web Programming Competition (6.470): wrote a music-exploration website using AJAX,
JSON, PHP, and SQL. Finalist; honorable mention for “Best Minimalist Site”.
• (2008 ) Operating Systems Engineering (6.828): wrote a microkernel/exokernel hybrid OS in C
from scratch, including memory management, process creation, an Ethernet driver, and several
networking extensions to a lightweight TCP/IP stack including NAT, firewalls, and DNS resolution.
• (2008 ) MASLAB (Mobile Autonomous System Laboratory): built a fully autonomous,
vision-based robot with control software written in Java to navigate an unknown playing field.
• (2007 ) Autonomous Robotics Design Competition (6.270): built a fully autonomous, sensorbased
robot with control software written in C to compete against an opponent robot on a known
playing field.
Projects and Awards
• (2009 ) Mobile Application Competition: wrote a location-aware, collaborative task manager
with persistent storage for the iPhone. Winner of the Qualcomm award.
• (2009 )Web Programming Competition (6.470): wrote a music-exploration website using AJAX,
JSON, PHP, and SQL. Finalist; honorable mention for “Best Minimalist Site”.
• (2008 ) Operating Systems Engineering (6.828): wrote a microkernel/exokernel hybrid OS in C
from scratch, including memory management, process creation, an Ethernet driver, and several
networking extensions to a lightweight TCP/IP stack including NAT, firewalls, and DNS resolution.
• (2008 ) MASLAB (Mobile Autonomous System Laboratory): built a fully autonomous,
vision-based robot with control software written in Java to navigate an unknown playing field.
• (2007 ) Autonomous Robotics Design Competition (6.270): built a fully autonomous, sensorbased
robot with control software written in C to compete against an opponent robot on a known
playing field.
+5
Написано красиво. С литературной точки зрения :)
А вот сама идея статьи и выеденного яйца не стоит. Потому как туториалов о программировании на асме под линукс дофига.
dchekmarev@dchekmarev:~$ cat test.s && as test.s -o test.o && ld test.o -o test && ls -l test* && ./test
.section .data
hello:
.ascii «hello, world!\n»
hello_len:
.long. — hello
.section .text
.globl _start
_start:
xorl %ebx, %ebx
movl $4, %eax
xorl %ebx, %ebx
incl %ebx
leal hello, %ecx
movl hello_len, %edx
int $0x80
xorl %eax, %eax
incl %eax
xorl %ebx, %ebx
int $0x80
-rwxr-xr-x 1 dchekmarev dchekmarev 640 2010-03-19 14:38 test
-rw-r--r-- 1 dchekmarev dchekmarev 624 2010-03-19 14:38 test.o
-rw-r--r-- 1 dchekmarev dchekmarev 317 2010-03-19 14:34 test.s
hello, world!
dchekmarev@dchekmarev:~$
Обидно, хоть и очевидно почему глупые статьи пытающихся разобраться нубов набирают тучу плюсов в то время как сложные для основной массы, пусть и полезные, статьи плюсов получают на порядки меньше.
А вот сама идея статьи и выеденного яйца не стоит. Потому как туториалов о программировании на асме под линукс дофига.
dchekmarev@dchekmarev:~$ cat test.s && as test.s -o test.o && ld test.o -o test && ls -l test* && ./test
.section .data
hello:
.ascii «hello, world!\n»
hello_len:
.long. — hello
.section .text
.globl _start
_start:
xorl %ebx, %ebx
movl $4, %eax
xorl %ebx, %ebx
incl %ebx
leal hello, %ecx
movl hello_len, %edx
int $0x80
xorl %eax, %eax
incl %eax
xorl %ebx, %ebx
int $0x80
-rwxr-xr-x 1 dchekmarev dchekmarev 640 2010-03-19 14:38 test
-rw-r--r-- 1 dchekmarev dchekmarev 624 2010-03-19 14:38 test.o
-rw-r--r-- 1 dchekmarev dchekmarev 317 2010-03-19 14:34 test.s
hello, world!
dchekmarev@dchekmarev:~$
Обидно, хоть и очевидно почему глупые статьи пытающихся разобраться нубов набирают тучу плюсов в то время как сложные для основной массы, пусть и полезные, статьи плюсов получают на порядки меньше.
+2
Это риторический вопрос, или ответить?
+1
У меня это даже не вопрос был, а продолжение «повествовательного предложения»
0
Я все же немножко разовью свою мысль. Хабр как точка запуска, перед ним не стоит задачи научить чему-то глубокому. Скорее дать некоторое представление или развлечь.
Вот есть вебдев, он кодит на flex и php, си знает чуть менее, чем никак. Прочитал статью — немножко расширил кругозор. Хорошо.
И так со всеми статьями. За глубокими же знаниями лезут в msdn или на форумы программистов. Это очевидно.
Или вот знакомство завязать. Тоже хорошо. Я через Хабр нашел на прошлую работу человека.
У Хабра своя задача, которую он, как я считаю, замечательно выполняет.
Это мысли вслух, конечно вы все это знаете ^__^
Вот есть вебдев, он кодит на flex и php, си знает чуть менее, чем никак. Прочитал статью — немножко расширил кругозор. Хорошо.
И так со всеми статьями. За глубокими же знаниями лезут в msdn или на форумы программистов. Это очевидно.
Или вот знакомство завязать. Тоже хорошо. Я через Хабр нашел на прошлую работу человека.
У Хабра своя задача, которую он, как я считаю, замечательно выполняет.
Это мысли вслух, конечно вы все это знаете ^__^
+1
и все же круто!
0
Коллега, а Вы не хотите сделать доклад на РИТ++ (http://www.ritconf.ru/)?
Если интересно, то я могу выслать подробную информацию.
Если интересно, то я могу выслать подробную информацию.
0
Когда-то проводил эксперименты с gcc и as. Но там ассемблер был.
0
Ну не знаю, на самом деле просто пишем (пример для x64)
776B — таков размер ELF-а
Обращаю Ваше внимание, что
на
И после компиляции проверить с каким кодом завершиласьсуперфункциональная программа.
Для
Системная функция
P.S.: приятно компилировать свою программку (не эту) на С с флагом
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
— выпиливает символы (экспресс похудение)776B — таков размер ELF-а
Обращаю Ваше внимание, что
-nostdlib
напрочь отменяет все подготовительные и завершающие процедуры. Конкретно: аргументов argc, argv, env
не будет, ну и как Вы уже смогли убедиться — вызывать выход нужно вручную. Попробуйте заменить
asm("xorq %rdi, %rdi");
на
asm("movq $97, %rdi");
И после компиляции проверить с каким кодом завершилась
Для
bash
например это$ echo $?
Системная функция
exit()
принимает код возврата в %rid
. А xorq %rdi, %rdi
, уверен Вам известно — это обнуление регистра. Если нужны аргументы или переменные окружения, то они лежат в стеке и на самой верхушке лежит argc
.P.S.: приятно компилировать свою программку (не эту) на С с флагом
-O3
и осознавать что бородатые дядьки, что пилят gcc
применяют хвостовую рекурсию.0
НЛО прилетело и опубликовало эту надпись здесь
По большому счёту ещё и волатильность нужна, всякие там __подчёркивания__.
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");
};
0
Пробовал чуть пошаманить, но в итоге не получилось, не понял, у меня похожая проблема, как вылечить то?
На CentOS6 — хочу сделать STATIC, для этого делаю:
Получаю в итоге:
Запускаю ld -lpthread --verbose и вижу:
Куда дальше копать то?
На CentOS6 — хочу сделать STATIC, для этого делаю:
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]#
Запускаю ld -lpthread --verbose и вижу:
==================================================
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
Куда дальше копать то?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Привет из свободного от libc мира! (Часть 1)