On Mon, Apr 17, 2006 at 02:47:27AM +0400, Dmitry V. Levin wrote: > > Кажется я догадываюсь, как это реализовано: компилятор (линкер в данном > > случае) сканирует аргументы командной строки слева направо. Он видит > > -ldl и проверяет, использует ли создаваемый ELF shared object какие-либо > > символы из -ldl. Поскольку создаваемый ELF в данном случае вообще > > пустой, компилятор выбрасывает -ldl и идёт дальше. Потом ему попадаются > > объектные файлы с dlopen(), но -ldl уже проехали. В конце > > активизируется -Wl,-z,defs и отваливает. > > Именно так оно и происходит, это уже здесь обсуждалось, см. > http://lists.altlinux.org/pipermail/devel/2006-March/029704.html > и в целом архив этого списка за прошлый месяц с темой --as-needed. В два прохода надо делать: сначала *.o, потом *.so, и потом только решать, какие из *.so оставлять. Но есть ещё *.a. Не понятно тогда, вклинивать ли *.a перед *.so или после *.so. На это ещё -static может влиять. Короче точную формулировку в соответствии c "Rule of Least Surprise" с ходу дать затруднительно. Лучше бы порядок аргументов и соответствующая семантика были исчерпывающим образом документированы. А то получается кур смешить: --as-needed должен отсекать только ненужные библиотеки, а на деле может отсекать и нужные.