Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    MihaNix

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Заметил интересную особенность при работе над курсовой работой.
    Компилировал ее с использованием GCC, сборка 4.7.0.
    Программка небольшая, консольная написанная на чистом С.
    Заметил, что размер выходного файла получился 1 042 051 байт. Я глазам не поверил.
     
    Решил проверить - в чем же проблемка заключается.
    Написал стандартный hello world с включением библиотеки stdio.h - откомпилировал, результат 25 947байт.
    Немного поигрался, писал функции различные, включал math.h - результат практически тот-же/
    Затем прописал iostream, причем нигде ее функций не задействовал - и чудо то какое размер опять вырос до 1 038 197 байт.
    Нехилый такой hello world
    компилировал без каких либо параметров:
    g++ hello.c -o hello.exe
     
    Как такое возможно? Решение пожалуйста подскажите. Как получить файл минимального размера с использованием GCC?

    Всего записей: 124 | Зарегистр. 18-06-2010 | Отправлено: 12:13 17-06-2012
    cp58

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MihaNix

    Цитата:
    Заметил, что размер выходного файла получился 1 042 051 байт.

    Это могло произойти только по одной причине - статическое связывание стандартной библиотеки c++/c.
    Подключение заголовочных файлов(stdio.h, iostream...) здесь ни при чем.
     
    Компилятор первоначально пытается связать динамически, а при указании обратного статически. Но можно дать указание связывать динамически: "g++ -Wl,-Bdynamic -lstd++ -o hello.exe hello.cpp".
     
    Сразу дополню выделенное, g++ это подмножество gcc, для компилирования c++ программ, поэтому правильнее использовать cc(c подмножество) для компилирования с программ или использовать gcc с опциями для c(стандартно) или для c++(с указанием опций).
     

    Цитата:
    Как получить файл минимального размера с использованием GCC?

    Если не нужна стандартная библиотека c/c++, то так:
    g++ -nostdlib -o hello.exe hello.cpp && strip hello.exe ~2000 байт. Можно еще удалить лишние секции и останется практически "голый" PE заголовок. Стандартная входная точка _start вместо main.
    int _start(...)
    {
    }
    В противном случае:
    g++ -o hello.exe hello.cpp && strip hello.exe

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 13:00 17-06-2012 | Исправлено: cp58, 13:01 17-06-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MihaNix
    на первом этапе самое простое, -- это выкусить ненужную для работы информацию
     
    strip.exe -o hello.exe hello_stripped.exe
     
    -----
    это хорошо, что я опоздал :)

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 13:06 17-06-2012 | Исправлено: akaGM, 13:37 17-06-2012
    MihaNix

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    cp58
    Получилось только strip-ом и то размер сократился примерно на половину(до 519 168 байт).
    "g++ -Wl,-Bdynamic -lstd++ -o hello.exe hello.cpp" - не проканал, потом только посмотрел, что lstdc нет.
    "g++ -nostdlib -o hello.exe hello.cpp" - тоже кучу ошибок выдал.
    попытался собрать... int _start()... пробовал как в GCC так и в VC - ничего не вышло
    Причем только VC что-то вразумительное сказала: _start: должна возвращать значение (пробовал и с передачей значения - нифига)
    cl.exe /c hello.cpp /Ox
    Ну а gcc dsgktdsdftn hello.o при таком запуске - "g++ hello.cpp -o hello.o -c" а потом что с ним делать не пойму - тоже ошибочки выдаются при попытке exe-шник собрать.

    Всего записей: 124 | Зарегистр. 18-06-2010 | Отправлено: 17:48 17-06-2012
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Без stdlib необойтись, если нужны float, long long, __try __except, malloc и ешё много хороших вещей. Что то из них можно заменить системными API (malloc -> HeapAlloc), что то inline асмом, а чтото и вообще незменимо.
    Если все условия есть, пишем (для VC):
     
    #include <windows.h>
    #pragma comment(linker, "/NODEFAULTLIB /ENTRY:main /SUBSYSTEM:WINDOWS /MERGE:.rdata=.text")
     
    main()
    {
        //code here
        ExitProcess(0);
    }
     
    Потом собираем:
    cl /Ox /GF test.c kernel32.lib user32.lib advapi32.lib

    Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 18:26 17-06-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MihaNix
    -lstdc++
     
    а вообще, под винды меньше, чем делается strip'ом, не получится
    если уж очень хочется, как вариант, использовать ехе-пакеры...

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 19:26 17-06-2012 | Исправлено: akaGM, 19:27 17-06-2012
    cp58

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MihaNix

    Цитата:
    -lstd++  

    Мою опечатку уже поправили, конечно, -lstdc++.

    Цитата:
    "g++ -nostdlib -o hello.exe hello.cpp" - тоже кучу ошибок выдал.

    Я написал "если не требуется", а кучу ошибок может выдать только в случае использования библиотеки.

    Цитата:
    попытался собрать... int _start()... пробовал как в GCC так и в VC - ничего не вышло  

    Это относится только к -nostdlib. main - входная точка для библиотеки c/c++.

    Цитата:
    если нужны float, long long, __try __except, malloc и ешё много хороших вещей.

    При чем тут базовые типы вобще? malloc, конечно, входит в стандартную библиотеку c.

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 20:38 17-06-2012 | Исправлено: cp58, 20:40 17-06-2012
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Операции над этими типами (_allmul(), _allrem(), _fltused(), etc) находятся в stdlib. Можно, конечно, слинковать с msvcrt.lib, но тогда к exe придётся прилагать C runtime, и идея малого исполняемого файла сведётся на нет.

    Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 10:02 18-06-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ne_viens
    начальный вопрос задавался относительно гнуси...

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 10:15 18-06-2012
    karakurt2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В прошлом году написал процедуру с использованием библиотеки boost::spirit, которая преобразует строку в поток команд. Она хорошо работала в версии boost 1.47.0, а в новой версии 1.48.0 выдаётся куча ошибок. Можете подсказать, в чём проблема?
     
    код:
    Подробнее...
     

    Всего записей: 733 | Зарегистр. 06-12-2003 | Отправлено: 11:53 18-06-2012
    MihaNix

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо за советы.
    Никакой из способов правда сильно не помог
    Попытаюсь еще с точкой входа _start поиграть - не компилится никак у меня такой исходник уже по разному извращался, линкер обламывается...
    Можно еще hex редактором, типа hiew-а поработать - попробовал, после нескольких проб и ошибок вырезал приличные куски с сохранением работоспособности программы.
     
    Возник еще один вопрос по G++ с ключом -S выдет асемблерный код, как я понял. Так вот можно ли этот код загнать в nasm, чтобы получить рабочий exe-шник?

    Всего записей: 124 | Зарегистр. 18-06-2010 | Отправлено: 17:13 18-06-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MihaNix

    Цитата:
    Попытаюсь еще с точкой входа _start поиграть - не компилится никак у меня такой исходник уже по разному извращался, линкер обламывается...
    надеюсь, что все эти извращения под линуксом происходят?
     

    Цитата:
    Так вот можно ли этот код загнать в nasm, чтобы получить рабочий exe-шник?

    я не знаю nasm, но можно :)
    после допиливания ручками можно загнать в любой ассемблер, и, слинковав с rtl-библиотеками, получить рабочий экзюк...
     
    а зачем тебе это?

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 17:20 18-06-2012 | Исправлено: akaGM, 17:39 18-06-2012
    cp58

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ne_viens

    Цитата:
    Операции над этими типами (_allmul(), _allrem(), _fltused(), etc) находятся в stdlib.

    Но float здесь при чем? "C" без проблем сгенерирует код для сопроцессора, без каких либо stdlib.
    akaGM

    Цитата:
    начальный вопрос задавался относительно гнуси...

    Насколько я помню MinGW использует C бибилотеку от microsoft, то есть msvcrt, а C++ своя.
    karakurt2
    Ошибки бы сюда, так как вряд ли проблема с совместимостью.
    MihaNix

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

    Вы уверены что c/c++ библиотеки не требуются? Это любая функция вроде printf/scanf.

    Цитата:
    Возник еще один вопрос по G++ с ключом -S выдет асемблерный код, как я понял. Так вот можно ли этот код загнать в nasm, чтобы получить рабочий exe-шник?

    GCC генерирует код с AT&T синтаксисом, а nasm работает с intel синтаксисом. Надо или использовать VC от Microsoft и выставить подобный ключ или использовать GAS(GNU Assembler), который входит в GCC.
    Можно просто через gcc - gcc -o some.exe source.S
    akaGM

    Цитата:
    надеюсь, что все эти извращения под линуксом происходят?  

    А разница?

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 17:54 18-06-2012
    karakurt2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ошибки
     
    Вот ещё что заметил:
     
    I note that if I replace lit("ratio") with char_('r') this code will be compiled  
    successfully. The same thing is observed if I replace "double_  
    [at_c<2>(_val) = _1]" with "long_ [at_c<3>(_val) = _1]".
     
    Добавлено:
    abbreviated version

    Всего записей: 733 | Зарегистр. 06-12-2003 | Отправлено: 18:09 18-06-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    cp58

    Цитата:
    А разница?

    я не знал, что mingw использует ms crt...
     
    MihaNix
    ну на МС тогда вот так попробуй:
    cl hello.c /link /entry:"_start"
     
    а для гнуси
    gcc -s hello.c -o hello.exe

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:30 18-06-2012 | Исправлено: akaGM, 18:39 18-06-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    я не знал, что mingw использует ms crt...

    кстати, каким образом?
    глупость какая...
    всё у них своё автономное...

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 12:36 19-06-2012
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Но float здесь при чем? "C" без проблем сгенерирует код для сопроцессора, без каких либо stdlib

     
    В stdlib находится код инициализации сопроцессора (точность вычислений, режим округления, floating point exceptions, итд). Если либа нет, придётся самому всё настраивать в асме (fstcw, finit).

    Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 12:57 19-06-2012
    cp58

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    karakurt2

    Цитата:
    ratio %= lit("ratio")[at_c<0>(_val) = command::RATIO][at_c<1>(_val) = false]  
                    || double_ [at_c<2>(_val) = _1][at_c<1>(_val) = true];  

    Да это надо заменить. Переписать без %=.
     
    akaGM
    Как найдете - скажите.
     
    ne_viens

    Цитата:
    В stdlib находится код инициализации сопроцессора (точность вычислений, режим округления, floating point exceptions, итд). Если либа нет, придётся самому всё настраивать в асме (fstcw, finit).

    И что с этого? float будет работать. А выставить 3 регистра(fstat,ftag,fooff) если нужна точность не проблема.

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 14:38 19-06-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    cp58
    что найду?

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 14:48 19-06-2012
    cp58

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    C библиотеку от mingw.

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 14:55 19-06-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru