Как стать автором
Обновить

Комментарии 61

НЛО прилетело и опубликовало эту надпись здесь
Имхо, написано неплохо вне зависимости от пола.
НЛО прилетело и опубликовало эту надпись здесь
«для девушки очень неплохо написано» — для тролля так себе провокация.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Я хочу подчеркнуть что вы идиот и поставить вам за это минус :-)
Хотя нет. Вы жирный и толстый. Обойдетесь.
НЛО прилетело и опубликовало эту надпись здесь
А я с тобой согласен полностью и не минусую ни разу, а кто минусует, тот не шарит. Только ты заметил, что это западная «девушка», блог расположен, там где занимаются ядром linux (видимо, поэтому и отвязка от userspace идет). А перевел, вроде, всеравно парень.
НЛО прилетело и опубликовало эту надпись здесь
А неважно. Я всегда могу просто ответить.
А чем так плох libc кроме лишних 11Кб?
ИМХО, сейчас очень редко 11Кб могут стать проблемой.
Ничем не плох, смысл статьи вот же в чем:
>В качестве упражнения я хочу написать программу на С. Достаточно простую для того, чтобы дизассемблировать ее и объяснить весь код самой себе.
А зачем эти негодяи засовывают в мою программу 11 Кб ненужного кода? Какой-то индус-стайл подход!

Кстати, сам libc мне тоже не нравится, весит по моему больше мегабайта, при том что ничего значительного не содержит, так, всякие вспомогательные функции.
Да дело не в 11 кб, а в том, что автор заметила в поведении компилятора нечто, что не смогла объяснить, но не прошла мимо, а докопалась до истины. По-моему, это заслуживает глубокого респекта.
Расскажите какой быстрый и простой сделать расцветку кода, а то я не нашел как.
Криво там реализовано, нужно же как:
а) идеальный вариант — вбил текст вперемежку с кодом, тапнул «тут есть код» и готово (а совсем идеальный — и тапать не надо);
б) годный вариант — выделил блок когда мышкой, тапнул кнопку «подсветить».

А не копипейстить туда-сюда. Пока что опробую pastebin.com или буду использовать тег pre.
> char *str = «Hello World»;

const char *str
а почему? просто хороший тон?
Потому что строки-литералы — это константы и могут размещаться (и размещаются некоторыми компиляторами) в памяти только для чтения.
«фигасе» (с), забавный хак :-), действительно было интересно, не часто встретишь достойное почитать, написаное достаточно легко, чтоб не напрягаться и достаточно сложно, чтоб не было скушно,
А вообще свободный од glibc мир — это uClibc, dietlibc, Newlib. С первой работал, вот такой простой примерчик занял у меня около 3 кб на SH4 архитектуре и около 14 на PPC405. Практически уверен, что для 386 архитектуры, собраный интеловским компилятором будет меньше 3кб.
Кстати, фото автора ;)

это как бы перевод ее поста/статьи…
чёрт, я не понял намёка Z>Я!

где тут кнопка искреннего покаяния на хабре?
Reset в профиле
Вот сайт автора переведенной статьи
web.mit.edu/jesstess/www/
Люблю вот такие вещи, поковыряться да посмотреть как оно там работает :-)
Странный призыв: программировать на Си и Ассемблере, чтобы избавиться от libc :). А главное ещё 'добро пожаловать'. Чего-то мне кажется, что она в итоге начнёт фигачить ображение к системе через syscall'ы, и добра совсем от этого не прибавится. Надо было статью назвать как-то вроде: как происходит запуск программ в Linux.

P.S. Йэхъ. Побольше бы подобных русскоязычных деффушек :)
Если вам надо меньше кода, то лучше все же взять ulibc :)
На второй странице программа перестает выводить Hello world, но главное, что автор — девушка.
Есть намек:
>во второй части разберем ассемблерный код подробно, посмотрим что случится, если сделать программу более сложной
Когда-то тоже игрался, убирал райнтайм. Бессмысленное занятие.
Но интересно же!
Бессмысленных занятий не так уж и много, и это тоже не быссмысленное. «Лучше ковыряться отладчиком в чужом коде, чем пальцем в собственной заднице» ©. А такие упражнения дают полезный опыт.
захотелось даже снова за Си взяться :)
Так, хорошо, от libc мы освободились. Теперь бы аналог банального printf…
write() — оно почти ровно в syscall перейдет.

Только форматирование — ручками. Но для hello world — вполне пойдет.
НЛО прилетело и опубликовало эту надпись здесь
Было бы там что-то длинное я бы нашел как подсветить, но там мало, и я счел, что усилия того не стоят. Да, в её блоге тоже не расцвечено. Но там удобнее немного читать, на хабре шрифт меньше.
Выдержка из резюме «девочки»:

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.
"wrote a microkernel/exokernel hybrid OS in C" вот это круто!!! Эх… надо догонять и перегонять Америку.
НЛО прилетело и опубликовало эту надпись здесь
А еще она участвует в разработке Twisted
Написано красиво. С литературной точки зрения :)
А вот сама идея статьи и выеденного яйца не стоит. Потому как туториалов о программировании на асме под линукс дофига.

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:~$

Обидно, хоть и очевидно почему глупые статьи пытающихся разобраться нубов набирают тучу плюсов в то время как сложные для основной массы, пусть и полезные, статьи плюсов получают на порядки меньше.
Это риторический вопрос, или ответить?
У меня это даже не вопрос был, а продолжение «повествовательного предложения»
Я все же немножко разовью свою мысль. Хабр как точка запуска, перед ним не стоит задачи научить чему-то глубокому. Скорее дать некоторое представление или развлечь.

Вот есть вебдев, он кодит на flex и php, си знает чуть менее, чем никак. Прочитал статью — немножко расширил кругозор. Хорошо.

И так со всеми статьями. За глубокими же знаниями лезут в msdn или на форумы программистов. Это очевидно.

Или вот знакомство завязать. Тоже хорошо. Я через Хабр нашел на прошлую работу человека.

У Хабра своя задача, которую он, как я считаю, замечательно выполняет.

Это мысли вслух, конечно вы все это знаете ^__^
и все же круто!
Коллега, а Вы не хотите сделать доклад на РИТ++ (http://www.ritconf.ru/)?
Если интересно, то я могу выслать подробную информацию.
Когда-то проводил эксперименты с gcc и as. Но там ассемблер был.
Ну не знаю, на самом деле просто пишем (пример для x64)
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 применяют хвостовую рекурсию.
НЛО прилетело и опубликовало эту надпись здесь
По большому счёту ещё и волатильность нужна, всякие там __подчёркивания__.
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");
};
НЛО прилетело и опубликовало эту надпись здесь
Нет не нужны. Для ANSI C они необходимы. Просто это хорошая практика и код так выглядит более устрашающим. По большому счёту и волатильность не нужна. У меня оптимизатор (-O3) всё портит не смотря на то — есть она или нет, фигня какая-то.
Пробовал чуть пошаманить, но в итоге не получилось, не понял, у меня похожая проблема, как вылечить то?

На 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


Куда дальше копать то?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории