Pull to refresh

Comments 61

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

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

А не копипейстить туда-сюда. Пока что опробую pastebin.com или буду использовать тег pre.
а почему? просто хороший тон?
Потому что строки-литералы — это константы и могут размещаться (и размещаются некоторыми компиляторами) в памяти только для чтения.
«фигасе» (с), забавный хак :-), действительно было интересно, не часто встретишь достойное почитать, написаное достаточно легко, чтоб не напрягаться и достаточно сложно, чтоб не было скушно,
А вообще свободный од glibc мир — это uClibc, dietlibc, Newlib. С первой работал, вот такой простой примерчик занял у меня около 3 кб на SH4 архитектуре и около 14 на PPC405. Практически уверен, что для 386 архитектуры, собраный интеловским компилятором будет меньше 3кб.
это как бы перевод ее поста/статьи…
чёрт, я не понял намёка Z>Я!

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

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

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

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" вот это круто!!! Эх… надо догонять и перегонять Америку.
UFO just landed and posted this here
А еще она участвует в разработке 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 применяют хвостовую рекурсию.
UFO just landed and posted this here
По большому счёту ещё и волатильность нужна, всякие там __подчёркивания__.
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");
};
UFO just landed and posted this here
Нет не нужны. Для 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


Куда дальше копать то?
Sign up to leave a comment.

Articles