Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: программа без #include<файл> (си)  (Прочитано 7316 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #15 : 27 Марта 2011, 07:49:30 »
Всё... тушите свет.

как мне написать программу, которая бы делала системный вызов и не подключала стандартных библиотек?
Это невозможно! Явно или не явно библиотеки будут подключены.
Lifewalker, такого феерического бреда я давно не встречал. Пиши еще! погугли gcc -nostdlib

hippi90, за таненбаума +1 отличная книженция, Lifewalker тоже почитай её не досуге.
за
Цитировать
Чтобы gcc не линковал объектный код с библиотеками есть опция -c, подробнее опять же в манах.
-1
этот флаг говорит компилятору выполнить только компиляцию. на выходе получается вообще никак не линкованый объектный код. он не будет выполняться ОС при всём желании. у фала к тому же нету точки входа. для того чтобы не цеплял ни какие библиотеки есть -nostdlib

Sеr я написал как заставить компилятор не использовать никаких библиотек. Точнее не использовать никаких стандартных автоматически подключаемых библиотек. уже попробуй почитать внимательнее.

Хочешь свою ОС? Берешь Виртуалку, GRUB, книжку Таненбаума и вперед. всё написано более чем доходчиво. Вот в этом случае тебе никакие заголовочные файлы не нужны. Ну только то что сам напишешь.

Если хочешь написать приложение для Linux без использования каких-либо стандартных и нестандартных библиотек тогда тебе понадобятся только заголовочные файлы ядра.

-nostdlib не даст компилятору подцепить по умолчанию libc. но ему можно руками указать какие библиотеки прилинковать. это могут быть ваши библиотеки или сторонние.

Lifewalker

  • Гость
Re: программа без #include<файл> (си)
« Ответ #16 : 27 Марта 2011, 08:45:08 »
Lifewalker, такого феерического бреда я давно не встречал. Пиши еще! погугли gcc -nostdlib
Я очень не люблю, когда меня поучают без должного основания. Давайте посмотрим, кто из нас не прав.
Беру простейшую программку, например вот такую:
int main (void)
{
int i;
int* pi;

i = 10;
pi = malloc(sizeof(int));
if (pi != 0) // NULL здесь не применим
*pi = 20;
else
return (1);
return (0);
}
и пробуем её компилить, затем смотрим.

testuser@testcomp:~# gcc test.c -o test
test.c: In function ‘main’:
test.c:9:7: warning: incompatible implicit declaration of built-in function ‘malloc’
Как видно ругается, но компилирует и исполняемый файл создаётся, потому что в стандартной внешней библиотеке нашлись ссылки на main и malloc.

testuser@testcomp:~# gcc test.c -o test -nostdlib
test.c: In function ‘main’:
test.c:9:7: warning: incompatible implicit declaration of built-in function ‘malloc’
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000080480b8
/tmp/cc8wV7ri.o: In function `main':
test.c:(.text+0x19): undefined reference to `malloc'
collect2: ld returned 1 exit status
Компилируется, но сборщик отваливается ввиду невозможности разрешить внешние ссылки и приделать загрузчик программы.

ЧЯНТД в создании програмы, пытающейся сделать системный вызов без подключения стандартных библиотек?
« Последнее редактирование: 27 Марта 2011, 08:48:15 от Lifewalker »

Оффлайн Sеr

  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #17 : 27 Марта 2011, 10:37:20 »
hippi90, я сейчас как раз читаю танненбаума,
Под дос программ не приходилось писать.
Микроконтроллерами я щас собирался заняться как раз, но сначала хотел научится писать подобные проги.
Да, все таки вопрос был поставлен неверно.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #18 : 27 Марта 2011, 11:39:35 »
Lifewalker, дело в том что ты слишком наивен. malloc это функция стандартной библиотеки Си а не системный вызов. Иди дальше гуглить... как ты там выразился? Теперь у тебя есть должное основание, умник! =) Книжку Таненбаума то прочитай. Я ведь не просто так это советовал.

Lifewalker

  • Гость
Re: программа без #include<файл> (си)
« Ответ #19 : 27 Марта 2011, 11:49:15 »
Скажите мне, дорогой мой просветитель, а каким образом malloc выделяет память - само или через ядрёный диспетчер памяти? Так или иначе рано или поздно, любой вызов добирается до ядра, неужели эту банальную мысль нужно жевать?

Ну поискал бы я ради интересу истинный вызов в ядре, всё равно результат был бы тот же самый: без вызовов невозможно написать ни одну программу, делающую хоть что-то кроме банального 2+2.

Танненбаум мне ничего нового не сказал, во всяком случае когда я читал его книжку. Может быть мы разных Танненбаумов читали, а? Или по-разному восприняли? :) В том смысле, что у меня хватило соображалки абстрагироваться от мелочей и понять принципы.  :coolsmiley:

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #20 : 27 Марта 2011, 12:04:26 »
Есть вызов ядра и есть вызов функции из библиотеки (в частности из стандартной библиотеки).
Твоё первое утверждение которое я назвал феерическим бредом было
как мне написать программу, которая бы делала системный вызов и не подключала стандартных библиотек?
Это невозможно! Явно или не явно библиотеки будут подключены.
Можно написать приложение которое будет вызывать ядро напрямую, без стандартной библиотеки. И она не будет подключена никак. ни явно ни не явно. Что тебе еще не понятно. Ты в трёх соснах заблудился.

Да. в конце концов стандартная библиотека вызывает ядро. Без этого в user-space никак (ну тут я привираю кое что сделать можно и даже с внешним миром общаться можно, если интересно расскажу).

Кстати Таненбаум про это рассказывал. По диагонали читал?

И я не понял, ты уже согласен что malloc является функцией стандартной библиотеки? И ты признаешь что понял ЧТДНТ в своём посте https://forum.ubuntu.ru/index.php?topic=145207.msg1067064#msg1067064 ? (даю подсказку. ты вызываешь стандартную библиотеку и отбираешь её у компилятора, да еще и называешь malloc системным вызовом)

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #21 : 27 Марта 2011, 13:11:48 »
Зацепила меня ваша дискуссия. :)

Решил-таки попробовать сделать бинарник, ни с чем не слинкованный, но реализующий задачу ТС.

Воспользовавшись гуглом, исходниками libc6 (eglibc-2.11.1) , man syscall и немного вспомнив ассемблер, намалевал вот что:
(Нажмите, чтобы показать/скрыть)

Что получается:
$ gcc -nostdlib -o nostdlib nostdlib.c
$ ldd ./nostdlib
не является динамическим исполняемым файлом
$ ./nostdlib
12
12
23
23
34
34
^C
$

Но правда:
$ ./nostdlib
123
Ошибка сегментирования

Аналогично с echo:
$ echo 12 | ./nostdlib
12
Ошибка сегментирования

Для справки, оригинальный код syscall из eglibc-2.11.1 (eglibc-2.11.1/sysdeps/unix/sysv/linux/x86_64/syscall.S):
(Нажмите, чтобы показать/скрыть)
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн Sеr

  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #22 : 27 Марта 2011, 13:28:17 »
Цитировать
Можно написать приложение которое будет вызывать ядро напрямую, без стандартной библиотеки
ну так КАК его написать? КАК мне заставить компилятор сделать системный вызов в моей проге?
вот у меня есть код:
#define EOF (-1)
int main()
{
char ch;
while(ch!=EOF)
{
read(0,&ch,1);
write(0,&ch,1);
}
return 0;
}
допустим, у меня не существует на данный момент ни одной подключаемой библиотеки.
=> функции read и write не обьявлены => код не будет откомпилирован или будут ошибки компиляции.
так вот, как мне обьявить самому эти функции?
что бы read делала соответствующий системный вызов read и имела те же аргументы.
read(int fd, char *buf, int n);собственно, вот функция read, производящая соответствующий системный вызов.
это не объявление, это просто "показ" функции.
а как мне обьявить ее? что нужно сделать, как сказать компилятору сделать системный вызов?

Пользователь решил продолжить мысль 27 Марта 2011, 13:31:46:
Интересно...спасибо, сейчас посмотрю, что получится...
« Последнее редактирование: 27 Марта 2011, 13:31:46 от Sеr »

Lifewalker

  • Гость
Re: программа без #include<файл> (си)
« Ответ #23 : 27 Марта 2011, 13:50:23 »
Можно написать приложение которое будет вызывать ядро напрямую, без стандартной библиотеки. И она не будет подключена никак. ни явно ни не явно. Что тебе еще не понятно. Ты в трёх соснах заблудился.
Ладно я уже понял, что я дурак.

Приведите пример программы, которая бы аналогично моей динамически выделяла кусок памяти для одной целой переменнй и присваивала ей значение. Так как вы это видите с вашей мегамозговой колокольни.

Оффлайн Sеr

  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #24 : 27 Марта 2011, 13:54:02 »
sergey@SergeyTar:~$ gcc -nostdlib -o test '/home/sergey/Рабочий стол/test.c'
/home/sergey/Рабочий стол/test.c: Assembler messages:
/home/sergey/Рабочий стол/test.c:5: Error: bad register name `%rdi'
/home/sergey/Рабочий стол/test.c:6: Error: bad register name `%rsi'
/home/sergey/Рабочий стол/test.c:7: Error: bad register name `%rdx'
/home/sergey/Рабочий стол/test.c:8: Error: bad register name `%rcx'
/home/sergey/Рабочий стол/test.c:9: Error: bad register name `%r8'
/home/sergey/Рабочий стол/test.c:10: Error: bad register name `%r9'
/home/sergey/Рабочий стол/test.c:11: Error: bad register name `%rsp)'
вот такие вот бэд регистер неймы.

Пользователь решил продолжить мысль 27 Марта 2011, 13:56:18:
но это я тупо скопировал...буду разбираться, что тут у меня за ошибки. особенно что за ошибки в голове.
« Последнее редактирование: 27 Марта 2011, 13:56:18 от Sеr »

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #25 : 27 Марта 2011, 14:06:59 »
sergey@SergeyTar:~$ gcc -nostdlib -o test '/home/sergey/Рабочий стол/test.c'
/home/sergey/Рабочий стол/test.c: Assembler messages:
/home/sergey/Рабочий стол/test.c:5: Error: bad register name `%rdi'
/home/sergey/Рабочий стол/test.c:6: Error: bad register name `%rsi'
/home/sergey/Рабочий стол/test.c:7: Error: bad register name `%rdx'
/home/sergey/Рабочий стол/test.c:8: Error: bad register name `%rcx'
/home/sergey/Рабочий стол/test.c:9: Error: bad register name `%r8'
/home/sergey/Рабочий стол/test.c:10: Error: bad register name `%r9'
/home/sergey/Рабочий стол/test.c:11: Error: bad register name `%rsp)'
вот такие вот бэд регистер неймы.
Подозреваю, это потому что в x86 нет таких регистров. Мой код работает на x86_64 (AMD64, EM64_T).
Вам нужно адаптировать код из eglibc-2.11.1/sysdeps/unix/sysv/linux/i386/syscall.S
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #26 : 27 Марта 2011, 14:12:47 »
Lifewalker, открыть исходники и почитать? Ядро может выделять приложениям память только страницами. malloc просит у ядра довольно большие блоки и распределяет это пространство вашему приложению. Первый класс вторя четверть. Про всякие разные аллокаторы памяти написано туева хуча. так что как именно распределяет прочитать не составит труда. Если тебя интересует какой именно системный вызов вызывает malloc то я точно не знаю. рискну предположить что лучше это описано здесь http://www.linuxjournal.com/article/6390

Оффлайн Sеr

  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #27 : 27 Марта 2011, 14:43:11 »
мда...еще и на ассемблер навернулся =/
я его фактически не знаю.
тогда еще и ассемблер буду смотреть понемногу.
ну, здесь никак без ассемблера не обойтись?

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #28 : 27 Марта 2011, 15:45:39 »
ну, здесь никак без ассемблера не обойтись?
Сдается мне, что нет. Мне кажется, что тот syscall, который используется в ассемблерной вставке, является непосредственно инструкцией процессора. Но я не специалист по ассемблеру и архитектурам, поэтому могу ошибаться.

Другой вопрос, зачем вам всё это надо? :)
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн Sеr

  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: программа без #include<файл> (си)
« Ответ #29 : 27 Марта 2011, 15:49:20 »
Цитировать
Другой вопрос, зачем вам всё это надо?
дурная голова ногам покоя не дает =) в своем роде =))
мне это интересно)

Пользователь решил продолжить мысль 27 Марта 2011, 15:53:42:
книжечку какую нибудь для ознакомления с ассемблером посоветовать можете?
раз без ассемблера не обойтись, полезу в ассемблер..
« Последнее редактирование: 27 Марта 2011, 15:53:42 от Sеr »

 

Страница сгенерирована за 0.02 секунд. Запросов: 22.