On Mon, Apr 17, 2006 at 01:50:27AM +0400, Dmitry V. Levin wrote: > > Теперь я переставляю -ldl с первого места на последнее: > > > > $ g++ -shared -Wl,-hlibxplc-0.3.so -Wl,--version-script=config/exports.map xplc/category.o xplc/catiter.o xplc/catmgr.o xplc/loader.o xplc/moduleloader.o xplc/modulemgr.o xplc/monikers.o xplc/new.o xplc/servmgr.o xplc/statichandler.o libxplc-cxx.so -o libxplc.so -Wl,-z,defs -ldl > > $ > > > > Получилось! > > Лёш, это не глюк, это --as-needed, видимо, ты пропустил эту историю, см. > напр. http://wiki.sisyphus.ru/devel/UpStream/AsNeeded Кажется я догадываюсь, как это реализовано: компилятор (линкер в данном случае) сканирует аргументы командной строки слева направо. Он видит -ldl и проверяет, использует ли создаваемый ELF shared object какие-либо символы из -ldl. Поскольку создаваемый ELF в данном случае вообще пустой, компилятор выбрасывает -ldl и идёт дальше. Потом ему попадаются объектные файлы с dlopen(), но -ldl уже проехали. В конце активизируется -Wl,-z,defs и отваливает. Если считать это такое поведение компилятора консистентным (особенно с точки зрения "Rule of Least Surprise"), тогда я наверное великий Корнхолио. Поэтому я и спрашиваю: документирован порядок обработки аргументов или нет.