Скачивание файла из URL
Запись от Замабувараев размещена 30.11.2021 в 18:41
Обновил(-а) Замабувараев 02.12.2021 в 20:00 (Причины неосвобождения памяти)
Обновил(-а) Замабувараев 02.12.2021 в 20:00 (Причины неосвобождения памяти)
Предупреждение: это программа из категории «Спойлер: 2048 байт», если вы считаете, что в 21 веке нельзя экономить на диске, памяти и возиться с битами и байтами, обязательно напишите об этом комментарий. Как‐то на одном разделе форума Я обратил внимание, что их компилятор, когда в коде есть функция загрузки файла, вместо программ создаёт 180‐килобайтное Bloatware. Я подумал, а насколько можно вручную уменьшить размер исполняемого файла средствами компилятора, не прибегая к модификации екзешника? Оказалось, что функциональность загрузки файла с сайта можно уместить в 2048 байт. Потребуется всего лишь компилятор FreeBASIC. (Я не буду приводить весь код, только объясню что он делает, весь код лежит на гитхабе по ссылке) Чтобы уместиться в 2048 байт: * запретим линковку со статическими библиотеками вроде Runtime Library * будем вызывать функции ОС напрямую * установим собственную точку входа Начнём с конца. Создадим простой текстовый файл и напишем там функцию EntryPoint: Код:
Sub EntryPoint() ' скачиваем байты и сохраняем в файл End Sub А компилятору мы скажем, чтобы он только оттранслировал код в промежуточное представление и остановился: Код:
fbc -gen gcc -r -maxerr 1 -w all -O 0 -s console -d UNICODE GetWebSiteData.bas Таким образом мы получим программу примерно три килобайта. Чтобы уменьшить ещё, необходимо объединить секции .data и .text. Для этого у нас есть специальный сценарий линковщика, который удаляет всё лишнее и объединяет секции: Код:
SECTIONS { /DISCARD/ : { *(.fbctinf) *(.comment) *(.note) } .text : { *(.text) *(.data) *(.rdata) } } Код:
Type IID_IXmlHttpRequest_inline b(3) As ULong End Type Dim iidXml As IID_IXmlHttpRequest_inline = Any iidXml.b(0) = &hED8C108D iidXml.b(1) = &h11D24349 iidXml.b(2) = &hC000A491 iidXml.b(3) = &hE869794F ' Аналогично для CLSID_XMLHTTPREQUEST Программа консольная, можно переписать для GUI и окошек, но тогда будет пожирнее и помаслянистее, чем 2048 байт сейчас. Ещё в программе нет удаления созданной памяти. Во‐первых, ещё одна функция в таблице импорта приведёт к её переполнению. Во‐вторых, в данном случае это не актуально, программа не выделяет память в цикле, скачивает файл и тут же завершается, система сама всё очистит. Ссылка на исходный код: https://github.com/zamabuvaraeu/DownloadFile Релиз: https://github.com/zamabuvarae... g/v1.0.0.0 |
Всего комментариев 7
Комментарии
-
Цитата:Я обратил внимание, что их компилятор, когда в коде есть функция загрузки файла, вместо программ создаёт 180‐килобайтное Bloatware.
180 КБ с учетом кроссплатформенности это очень немного.
Читая остальную часть статьи, возникает смыл - а зачем такие сложности? Затрата времени и сил больше чем возможная выгода.
Цитата:РелизЗапись от locm размещена 02.12.2021 в 19:16 -
Цитата:180 КБ с учетом кроссплатформенности это очень немного.
Цитата:а зачем такие сложности? Затрата времени и сил больше чем возможная выгода
Цитата:Зачем одни и те же исходники продублировали в zip и tar.gz архивах?Запись от Замабувараев размещена 02.12.2021 в 19:44
Обновил(-а) Замабувараев 02.12.2021 в 19:46 -
Цитата:из этого промежуточного представления мы получаем ассемблерный код, из ассемблерного кода → объектный файл, из объектного файла → исполняемый файл. Для линковщика указываем точку входа в виде -e ENTRYPOINT.
Таким образом мы получим программу примерно три килобайта. Чтобы уменьшить ещё, необходимо объединить секции .data и .text. Для этого у нас есть специальный сценарий линковщика, который удаляет всё лишнее и объединяет секции:
Или не написать на Бейсике программу, которая сама пишет виндовую DLL, выполняющую скачивание?Запись от politoto размещена 02.12.2021 в 20:28 -
Цитата:В 2021 году говорить об маленьких программах, уменьшении размера бинарника, экономии на памяти — это правило дурного тона. Я могу себе позволить писать маленькие программы.
В 2022 году может появиться что-то ещё. Но самое главное уже давно создано, а ерунда-2021 лишь отвлекает от реального дела.Запись от wer1 размещена 02.12.2021 в 20:35 -
Запись от Замабувараев размещена 04.12.2021 в 03:56 -
Я имею ввиду самодельную DLL, которая вызывает функцию из system32
Запись от politoto размещена 04.12.2021 в 19:10 -
Цитата:Я имею ввиду самодельную DLL, которая вызывает функцию из system32
Запись от Замабувараев размещена 06.12.2021 в 19:23