LINUX.ORG.RU

Кто поломал gcc и главное зачем?

 , , ,


0

1

Прошу помощи у знающих и опытных камрадов. Я люблю всякое красноглазое задротство в консольке. Есть у меня хобби, игрульки для терминала собирать. Решил тут консольный пасьянс собрать, cpat называется. Я его собирал раз пять на разных системах, никогда проблем не было. Тут говорю консольке: «мейк, дружище». А он такой:

gcc  -g -O2   -o cpat  cpat.o common.o document.o highscores.o freecell.o klondike.o spider.o fortythieves.o bakersdozen.o scorpion.o penguin.o yukon.o strategy.o canfield.o duchess.o -lncurses -lncurses
/usr/bin/ld: common.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: common.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: common.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: document.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: document.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: document.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: highscores.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: highscores.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: highscores.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: freecell.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: freecell.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: freecell.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: klondike.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: klondike.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: klondike.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: spider.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: spider.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: spider.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: fortythieves.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: fortythieves.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: fortythieves.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: bakersdozen.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: bakersdozen.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: bakersdozen.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: scorpion.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: scorpion.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: scorpion.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: penguin.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: penguin.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: penguin.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: yukon.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: yukon.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: yukon.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: strategy.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: strategy.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: strategy.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: canfield.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: canfield.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: canfield.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
/usr/bin/ld: duchess.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: multiple definition of `hs'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:221: first defined here
/usr/bin/ld: duchess.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: multiple definition of `pauseleft'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:219: first defined here
/usr/bin/ld: duchess.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: multiple definition of `pauselength'; cpat.o:/home/hanzo/Documents/terminal_games/gamez_p0/cpat-1.2.1/src/cpat.h:218: first defined here
collect2: error: ld returned 1 exit status
make: *** [Makefile:212: cpat] Error 1

Говорит у тебя там мультипл дефинишен. Ну я-то не программист, я фиг его знает, что это за дефинишен, да к тому же мультипл. Пошёл, думаю, в другую игрульку сыграю. А там такая же байда.

Я не поленился, погуглил другой компилятор, нашел какой-то тини компайлер. Установил, говорю tcc: «а нука, собери мне cpat». И что вы думаете? Собрал. Перепроверил на других проблемных играх, тоже собрались.

Собственно вопрос. Что изменили в gcc, что код, который годами никто не трогал и который собирался у меня с помощью версий gcc, которые были в убунту 14.04, дебиане 9 и 10, перестал в новой версии собираться? А главное, зачем? Есть хорошее правило. Работает - не трожь. Вот и не надо трогать. Пусть старый код собирается. Он есть, пить не просит.



Последнее исправление: nab_linux (всего исправлений: 3)

Раньше: -fcommon по умолчанию.
Сейчас: -fno-common по умолчанию.

https://gcc.gnu.org/gcc-10/changes.html

GCC now defaults to -fno-common. As a result, global variable accesses are more efficient on various targets. In C, global variables with multiple tentative definitions now result in linker errors. With -fcommon such definitions are silently merged during linking. 
xaizek ★★★★★
()

Есть хорошее правило. Работает - не дрожь.

Тут это правило неприменимо.

В новых gcc и clang -fno-common по умолчанию, выключается -fcommon (если уверен в том, что делаешь).

dsdqmhsx
()
Ответ на: комментарий от dsdqmhsx

Не можешь объяснить не программисту, в чем цимес? Почему надо было менять. Годами же не меняли. И смотри. Мне надо в мейкфайле добавить ключик -fcommon, чтобы было как раньше. Правильно?

nab_linux
() автор топика
Ответ на: комментарий от nab_linux

Если не программист то и не парься тебе должно быть пофигу. Просто сделали более строгим всё. Глобальная переменная в заголовочном файле для множества исходников это не всегда ошибка и это делают намеренно, но иногда всё же ошибка, а если такая есть то она серьёзная. Ключик добавь или gcc-9 используй вот и всё.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

А какие ограничения у tcc? Поди мелкие игрульки-то хватит силёнок у него собрать? Я же не хром с либрой или ядро компилирую им…

nab_linux
() автор топика
Ответ на: комментарий от nab_linux

tcc даже ядро линуса может собрать (не новое). Перечислять ограничения нет смысла. Для множества вещей, а тем более экспериментов он годен, высокая скорость по сравнению с gcc/clang ему в плюс. Просто используй и всё. Если что-то не так то clang/gcc

LINUX-ORG-RU ★★★★★
()

А главное, зачем? Есть хорошее правило. Работает - не дрожь. Вот и не надо трогать. Пусть старый код собирается. Он есть, пить не просит.

Компилятор теперь находит баги в коде, да и ещё и на этапе компиляции, это отлично. Мёртвый код не нужен, а если бы это был не мёртвый код, то мейнтейнеры или разработчики должны были бы пофиксить баги.

6.9.5 пункт стандарта C11

if an identifier declared with external linkage is used in an expression (other than as part of the operand of a sizeof or _Alignof operator whose result is an integer constant), somewhere in the entire program there shall be exactly one external definition for the identifier

Догадайся что такое exactly one.

gcc и так милостив к ошибкам программистов…

fsb4000 ★★★★★
()
Ответ на: комментарий от nab_linux

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

anonymous
()
Ответ на: комментарий от xaizek

О, а я удивлялся ещё чего это раньше компилятор не ругался на бажный код, который нашёлся у меня после обновления системы (в т.ч. gcc). И, более того, тот код странным образом работал, оказываеся это линкер всё починил за мной тогда а теперь перестал по-дефолту.

firkax ★★★★★
()
Ответ на: комментарий от fernandos

Да, статью на хабре читал: https://habr.com/ru/post/592233/

А ссылку на эту цитату я думал что увидел у какого-то анонима, но сейчас поискал на лоре и нашлось только это сообщение:

Это вообще законно? Провал выполнения в нижележащую «мёртвую» функцию (комментарий)

Значит я видел эту цитату у @ZenitharChampion, а не у анонима

fsb4000 ★★★★★
()
Ответ на: комментарий от nab_linux

Его один человек вроде как разрабатывает. Не, он конечно крутой, но всё же. Заявлена поддержка только ISO99 стандарта Си, то есть никаких тебе фортранов или плюсов, да и с архитектурами там только i386 и amd64. Хотя может быть я неправ и что-то поменялось.

Но проект хороший, в наше время таких самодостаточных компиляторов Си считай не осталось. Gcc и Clang уже давно на C++ переписаны.

luke ★★★★★
()
Ответ на: комментарий от fernandos

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

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

nanosecond
()
Последнее исправление: nanosecond (всего исправлений: 1)

я не ломал, если что…

anonymous
()
Ответ на: комментарий от nanosecond

сам не понял что написал, короче имхо.

У си легкая типизация, и программист более свободен застрелиться не навредив другим.
Легкая не значит что вы конструкцию языка можете изменить, а означат что язык не будет сильно влиять на вашу конструкцию.
А например если у языка типизация жесткая, то программист умирает раньше чем ошибется).

Си статичный и поэтому более чувствительный к деталям и мелочам.
А например если язык динамичный, то все сожрет не вдаваясь в подробности выдаст результат.

nanosecond
()
Последнее исправление: nanosecond (всего исправлений: 3)
Ответ на: комментарий от fernandos

Авторы выражают благодарность Андрею Викторовичу Столярову

Ржали всем шредером. Постеснялся бы тут такое рекламировать, нас дети читают.

untitl3d
()
Ответ на: комментарий от untitl3d

Пусть и дети знают, что по свету гуляют глупые люди.

Характерно, что на хабре её заплюсовали.

fernandos ★★★
()
Последнее исправление: fernandos (всего исправлений: 1)
Ответ на: комментарий от nanosecond

сам не понял что написал, короче имхо.

Аналогично.

У си легкая типизация

Какая-какая типизация?

К остальному — так-то да. Проблема динамической типизации в том, что ей надо уметь пользоваться. Я могу (ну, только на каком-то подходящем языке) ей пользоваться, просто проблема в том, что так бывает очень редко.

fernandos ★★★
()
Ответ на: комментарий от fsb4000

в девелопмент цитируют зенитара… когда казалось, что дно достигнуто, снизу постучали

anonymous
()

компилируй старыми версиями gcc

burato ★★★★★
()

Есть хорошее правило. Работает - не трожь.

Это правило профнепригодных лентяев. В современной разработке (админстве, всяческих -опс практиках, да и инженерии в целом) не просто трогают, а намеренно шатают и ломают всё что только можно расшатать и поломать - от использования всевозможных линтеров, санитайзеров, фаззеров и CI на самых невменяемых конфигурациях до выключения целых ДЦ.

Вот и не надо трогать.

А почему, ты, не программист, вдруг решаешь что надо и что не надо программистам?

Пусть старый код собирается. Он есть, пить не просит.

Просит, и очень дофига. Это называется maintenance burden. Введение в язык новых фичей, которые необходимы для стабильности, безопасности и эффективности приложений невозможно без поломок говнокода, который когда-то работал по чистому недоразумению (multiple definition это вопиющий пример). Это не представляет проблемы, поскольку этот код, как правило, тривиально исправляется. Если же речь идёт о не поддерживаемом несколько десятилетий говне, то надо понимать что его ценность настолько ничтожна, что не стоит даже десятка байт кода совместимости в gcc, не заикаясь даже о том чтобы он собирался из коробки в течение неограниченного времени.

Поэтому тут три пути - не использовать неподдерживаемое говно, поддерживать его самому или найти кто будет поддерживать его за тебя (и тебе не показалось, варианта «остановить развитие gcc чтобы этот код не ломался» здесь нет). Последний вариант включает и привлечение пакетных мантейнеров твоего дистрибутива - например, в openbsd эта проблема пропатчена (это, кстати, пример того самого maintenance burden), возможно пропатчена и в других дистрибутивах где эта игра опакечена. И по-хорошему, вместо собирания своих игрулек на локалхосте тебе давно надо было сделать пакеты для своего дистра (а это тебе абсолютно точно под силу и у тебя есть на это время, если под силу и есть время собрать из исходников) - не исключено что проблему исправили бы за тебя при обновлении компилятора. Но увы, последнее время я часто вижу похожие жалобы на слом совместимости с чем-то гнилым и допотопным, и их авторов объединяет непробиваемый эгоизм - они почему-то считают что сообщество должно все свои задачи бросить и работать на них лично, при этом сами они удавятся, но не законтрибутят хоть бы даже банальный багрепорт, при этом не стесняясь поливать сообщество, продуктами которого продолжают пользоваться, говном.

PS. Из консольных пасьянсов есть ещё tty-solitaire.

slovazap ★★★★★
()

Удивительно, как компилятор может НЕ ругаться на multiple definition. Видимо, засилье говнокодеров, не понимающих, чем отличается определение переменной от её объявления, достигло уже экстремальных значений.

anonymous
()

Я думаю что ответ очевиден. Только мерзко ВРЕДИТЕЛЬСВО прикрывают заботой о конечном пользователе. GCC ломают умышлено и нет иного объяснения и быть не может.

anonymous
()
Ответ на: комментарий от slovazap

с чем-то гнилым и допотопным

Единственое что тут гнилое и допотопное так это вы все те кто берет то что сделано другими и ломает объясняя это тем что не должен gcc собираться из коробки простыми смертными. Нужно придти на форум и получить одобрение, а еще лучше в job. А так что ж получается каждый возмет и собирет себе ту версию компилятора которую захочет и с любыми параметрами. НЕПОРЯДОК. И вот придумали подлые душонки взять и сломать то что делали другие люди для извлечения личной выгоды и возвышения чувство собственного достоинства которое в силу обстоятельств резко пошло вниз. Еще их сводит с ума тот факт что каждый может получить права root, гниль уже над этим работает пытаясь придумать способ чтобы усложнить эту процеДУРУ.

считают что сообщество должно все свои задачи бросить и работать на них лично

И какие же задачи у сообщества кроме извлечения собсвенной выгоды из миллиона строк написаных безвозмездно людьми которые поверили в идею линуса? Вы просто паразитируете на чужом выдавая это чужое за свое.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.