Asm/C++/Delphi/Py/PHP/VBA
|
|
1 | |
Системные вызовы и brk vs sbrk в частности10.02.2017, 02:04. Показов 5754. Ответов 24
Изучаю программинг под Linux, в частности системные вызовы
Многочасовые поиски нормального справочника по системным вызовам завершились, по сути, тремя ссылками: http://linuxdoc.ru/sys-doc.html http://www.digilife.be/quickre... erence.pdf http://syscalls.kernelgrok.com/ Всё остальное - примерно то же самое, только с разным дизайном. Ну или учебник какой-нибудь о Unix в целом (хоть и на русском). Так вот, на практике придётся использовать все 3 справочника... 1. В первом находить нужную функцию и читать её описание (неплохо, что там всё по-русски). 2. Во втором находить номер функции по названию. 3. Третий использовать, когда информации из 1-го недостаточно (там расписано подробнее и кол-во функций значительно больше... и даже исходники есть). У кого есть, киньте, плиз, ссылкой на удобный, полный, структурированный справочник, в котором будут указаны (важно!) номера функций и значения констант (типа EBADF и т.д.). Что дескриптор стандартного ввода = 0, а вывода = 1 я уже понял, но сдаётся мне, есть там ещё куча подобных штук, искать которые опять же придётся в example'ах на просторах всея интернета, что не очень удобно... А если там ещё и примеры использования будут, то будет вообще супер (хотя не критично). В частности, вот такой вопрос у меня возник: brk и sbrk вроде разные функции. А номер функции (eax) как будто один и тот же... Как это может быть? В чём подвох? Или система по значению передаваемого параметра определяет (типа > 0x8000000, значит brk, иначе sbrk)?
0
|
10.02.2017, 02:04 | |
Ответы с готовыми решениями:
24
Системные вызовы. Получение заголовка консольного окна Brk, sbrk и прочие системные вызовы Qt и системные вызовы Системные вызовы |
Asm/C++/Delphi/Py/PHP/VBA
|
|
10.02.2017, 02:16 [ТС] | 3 |
nimazzzy, ну ок, как же мне её вызвать из ассемблера-то?
Мне надо скачать glibc, скомпилить и присоединить к моему .o файл sbrk.o? Или как вообще? Добавлено через 1 минуту У меня уже башка пухнет от этих заморочек, жесть какая-то...!
0
|
Заблокирован
|
||||||
10.02.2017, 02:42 | 4 | |||||
Как и любую другую библиотечную функцию, по имени + линковка.
Добавлено через 5 минут Зачем? libc на системе стоит. Динамическая линковка есть. Добавлено через 13 минут Почему жесть-то? Так везде, на любой системе работает. Хочешь библиотечную функцию - зовешь по имени, линкуешься с библиотекой. Не хочется - пожалуйста, системные вызовы через syscall. По-другому как бы никак нигде Добавлено через 2 минуты Бессмысленный код, вызывающий sbrk:
1
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
10.02.2017, 11:39 [ТС] | 5 |
nimazzzy, спасибо, всё начинает проясняться...
Потому что я всё делаю в Windows (в т.ч. компиляцию), а Ubuntu стоит на виртуалке только для запуска. Т.к. он для меня пока как тёмный лес (установил его дня 3 назад только). И вообще я впервые с этим всем сталкиваюсь Т.е. если я буду производить компиляцию в Linux'е, то там всё автоматом прилинкуется? Или нужно находить где-то sbrk.o и его прилинковывать ld'ом? А почему rdi, если это обычная функция? Или туда параметры передаются только в формате ebx, ecx, edx... / rdi, rsi, rdx... а не через push (я пока с 32 битами работаю)? После выделения памяти, освобождать её нужно перед выходом или нет? Кстати, где-то мельком прочитал, что в Debian (Ubuntu, значит, тоже) вызывать int 0x80 (или syscall) можно не только передав параметры через регистры, но и передав их через стек (cdecl). Если это так, как же система определяет какой именно способ я использовал? Под винду при таком названим функции (main) компиляция не создавала точку входа, только _start или явно указывать через -e main. Или в линуксе можно использовать main (без указания -e)? Добавлено через 22 минуты nimazzzy, у нас, видимо, какие-то разные ассемблеры (в Ubuntu). Во-первых, as использует AT&T-синтаксис, во-вторых, .globl вместо global и .extern вместо extern... И когда я линкую всё это дело, он пишет, что функции sbrk нет (undefined reference). Где её искать-то?
0
|
Заблокирован
|
||||||
10.02.2017, 11:44 | 6 | |||||
Удобнее и проще после компиляции ассемблером, слинковаться gcc. Он автоматически с libc слинкует. Когда использую сишный рантайм, то примерно так компилируюсь:
0
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
10.02.2017, 12:15 [ТС] | 9 |
Всё равно не понял. Там другие соглашения, чем в Windows? Не rcx, rdx первые параметры?
Так, прикол в том, что мне Сишный рантайм не нужен вообще никак А если всё-таки через as, ld слинковать? Я в системе файла sbrk.o не нашёл... Добавлено через 1 минуту Некто говорил, что as использует сишный препроцессор и можно подключать .h к асмовским исходникам.
0
|
Заблокирован
|
|
10.02.2017, 12:17 | 10 |
Разумеется, другие rdi, rsi, rdx, и так далее.
Так не сипользуй sbrk, вот и все!
Это libc.
Добавлено через 1 минуту Может быть и так. Я не пользуюсь этой функциональностью, не вижу в ней необходимости. И ассемблирую nasm'ом.
1
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
10.02.2017, 12:19 [ТС] | 11 |
Если не подключать .h, тогда непонятно откуда брать константы (номера функций, коды ошибок и т.д.). В том же NASM'е никаких inc'ов не идёт в комплекте. В MinGW тоже... В самом линуксе (gas), правда, не знаю...
Добавлено через 1 минуту А если надо? Я хочу научиться это делать... Не понимаю. Если он стоит, значит sbrk.o (на край sbrk.c) должен же быть...
0
|
Заблокирован
|
|||||||||||
10.02.2017, 12:31 | 12 | ||||||||||
Из header-файлов ручками, или какой-либо документации.
Добавлено через 1 минуту Если надо - то нужен сишный рантайм. Если не нужен сишный рантайм, то пиши без вызовов к нему. Не понимаю Добавлено через 1 минуту Да почему? .o это объектный файл. Как ты связал .so файл с .o? Их при сборке может быть тысяча, а потом они линкуются в одну библиотеку, или исполняемый файл. Ровно как и на винде. Там нет объектников (если не считать статических либ), там dll и exe, которые были собраны из объектников. Добавлено через 6 минут Слинкуй:
1
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
10.02.2017, 12:55 [ТС] | 13 |
0
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
10.02.2017, 13:54 [ТС] | 15 |
А include'ов для асма вообще нет никаких?
А зачем мне сишный рантайм, если я хочу использовать 1 конкретную функцию из obj-файла? Нашёл я libc.a, но толка никакого... Запускаю: ld -L '/usr/lib/x86_64-linux-gnu' -o test.elf test.o -l libc.a А мне в ответ: Код
libc.a(iofclose.o): In function `_IO_new_fclose': (.text+0x288): undefined reference to `_Unwind_Resume' libc.a(iofclose.o):(.eh_frame+0x13): undefined reference to `__gcc_personality_v0' libc.a(iofflush.o): In function `_IO_fflush': (.text+0x173): undefined reference to `_Unwind_Resume' libc.a(iofflush.o):(.eh_frame+0x13): undefined reference to `__gcc_personality_v0' libc.a(iofputs.o): In function `_IO_fputs': (.text+0x188): undefined reference to `_Unwind_Resume' libc.a(iofputs.o):(.eh_frame+0x13): undefined reference to `__gcc_personality_v0' libc.a(iofwrite.o): In function `_IO_fwrite': (.text+0x20d): undefined reference to `_Unwind_Resume' libc.a(iofwrite.o):(.eh_frame+0x13): undefined reference to `__gcc_personality_v0' libc.a(wfileops.o): In function `_IO_wfile_underflow': (.text+0x734): undefined reference to `_Unwind_Resume' libc.a(wfileops.o):(.eh_frame+0x6b): undefined reference to `__gcc_personality_v0' libc.a(fileops.o): In function `_IO_new_file_underflow': (.text+0x45f): undefined reference to `_Unwind_Resume' libc.a(fileops.o):(.eh_frame+0xa7): undefined reference to `__gcc_personality_v0' libc.a(backtrace.o): In function `backtrace_helper': (.text+0x24): undefined reference to `_Unwind_GetIP' libc.a(backtrace.o): In function `backtrace_helper': (.text+0x30): undefined reference to `_Unwind_GetCFA' libc.a(backtrace.o): In function `__backtrace': (.text+0xbc): undefined reference to `_Unwind_Backtrace' libc.a(iogetdelim.o): In function `_IO_getdelim': (.text+0x328): undefined reference to `_Unwind_Resume' libc.a(iogetdelim.o):(.eh_frame+0x13): undefined reference to `__gcc_personality_v0' libc.a(fseek.o): In function `fseek': (.text+0x11d): undefined reference to `_Unwind_Resume' libc.a(fseek.o):(.eh_frame+0x13): undefined reference to `__gcc_personality_v0' libc.a(ftello.o): In function `__ftello': (.text+0x192): undefined reference to `_Unwind_Resume' libc.a(ftello.o):(.eh_frame+0x13): undefined reference to `__gcc_personality_v0' libc.a(ioseekoff.o): In function `_IO_seekoff': (.text+0x318): undefined reference to `_Unwind_Resume' libc.a(ioseekoff.o):(.eh_frame+0x67): undefined reference to `__gcc_personality_v0' Добавлено через 54 секунды А ты говоришь... Добавлено через 1 минуту А каком файле (объектном, библиотеке, в буфете...) находится функция sbrk? Почему я не могу её одну вытащить без сишного рантайма?
0
|
Заблокирован
|
||||||
10.02.2017, 14:17 | 16 | |||||
Может, есть. Я их никогда не использую.
Потому что она в нем лежит. Потому что функция может зависеть от инициализации какой-либо фигни перед началом ее работы.
Потому что ты все делаешь ручками, а когда собираешься с сишным рантаймом, то проще попросить за тебя все сделать gcc. Если хочешь ld, то запусти gcc с опцией -v и посмотри, какие он параметры линковщика использует, чтобы собраться.
Добавлено через 22 секунды в libc. Добавлено через 6 минут А ты можешь вытащить на винде из dll-ки один одинокий printf? потому что это библиотека с набором функци. Ты с ней линкуешься. Существует статическая линковка, с .a файлом, либо вытаскиванием объектного файла из архива. Но я всячески против таких вещей. Добавлено через 7 минут На моей системе:
Добавлено через 5 минут Хочешь библиотечную функцию - линкуешься динамически с библиотекой. Не надо ничего выдумывать. Тем более, с libc, которая есть на каждом линухе.
1
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
10.02.2017, 14:24 [ТС] | 17 |
А разве sbrk – рантаймовская функция? Или libc - это и есть рантайм (типа msvcrt)?
Хотя, в любом случае ничто не мешает ей обратиться к какой-нибудь глобальной рантаймовской переменной. Ну да. Это ж не dll-ка... Хорошо. Если не использовать библиотеку, а использовать только brk, откуда брать исходный адрес? Посмотрел исходники sbrk.c и дальше по цепочке... там используется переменная _hurd_brk, который изначально присваивается &_end. Вот только что это за _end - непонятно. Концов не найти... Как его определить?
0
|
Заблокирован
|
|
10.02.2017, 14:29 | 18 |
Она находится в libc. У меня на этот счет есть своя позиция. Это третьесторонняя библиотека. Если я использую ее функцию, то я с ней линкуюсь. К чему внутри нее она конретно относится мне пофигу. Все может поменяться в любой момент. На то она и библиотека. Мое дело просто указать своему приложения - бери вот эту функцию вот оттуда.
0
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
10.02.2017, 14:37 [ТС] | 19 |
_end везде (во всех файлах, в которых есть это слово) объявлен как extern...
Добавлено через 1 минуту Что значит "бери"? Переписать на асме? Я ж говорю: там используется extern-переменная _end, которая нигде не инициализируется. Как узнать текущую позицию brk (или как там правильно выразиться)? Добавлено через 1 минуту Так, libc - это рантаймовская сишная библиотека и есть? Или нет? Добавлено через 3 минуты А вообще, это вроде как не libc, а glibc... нет?
0
|
Заблокирован
|
|
10.02.2017, 15:10 | 20 |
С кодом работать забота об адресе кучи - это загрузчика загрузчика бинарей.
Добавлено через 3 минуты Не знаю, надо инвестигировать код. Да. Добавлено через 5 минут Как я вижу по коду сискола, при невалидном адресе (например, 0 попробовать), он вернет текущее значение. Попробуй, поиграйся. И не путай сискол brk с функцией. Добавлено через 7 минут "Бери" это значит, что немного раньше очень искал sbrk.o. Я тебе показал, где он лежит. Бери и делай, что ты там хотел с ним сделать ))))))) Вот это я имел в виду )
0
|
10.02.2017, 15:10 | |
10.02.2017, 15:10 | |
Помогаю со студенческими работами здесь
20
Системные вызовы Системные вызовы Pintos системные вызовы Системные вызовы Ubuntu Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |