Короткий ответ заключается в том, что сегодня в Bazel нет способа заставить его устанавливать флаг в зависимости от того, будет ли код компоноваться статически или динамически.
cc_library от Bazel дважды компилирует код для архитектур, которым требуется PIC для динамического связывания, но не требует PIC для статического связывания — один раз с PIC и один раз без него. В основном это делается для повышения производительности статически связанных исполняемых файлов, поскольку код без PIC обычно работает быстрее.
Обратите внимание, что правила cc_test в Bazel по умолчанию связаны динамически, а правила cc_binary по умолчанию связаны статически, поэтому различие PIC/no-PIC требует двойной компиляции почти всего исходного кода C/C++. Для дополнительной сложности обратите внимание, что для исполняемых файлов PIE требуется код, скомпилированный PIC, поэтому, если вы хотите ASLR, для которого требуются исполняемые файлы PIE, код всегда компилируется как PIC.
Однако поддержка PIC/no-PIC жестко запрограммирована в cc_library, и я не вижу очевидного способа «злоупотребить» ею, чтобы делать то, что вы хотите. Возможно, вы могли бы взломать кросс-инструмент, чтобы объявить, что архитектуре требуется PIC для динамической компоновки, но не для статической компоновки, а затем в любом случае объявить с PIC в обоих случаях, а также установить дополнительный флаг. Это приведет к выходным файлам .pic.o и .o, хотя оба будут содержать код PIC. Это невозможно, если вы не можете управлять crosstool, и я бы не рекомендовал этого делать.
Тем не менее, могут быть и другие способы добиться того, чего вы хотите. Не могли бы вы пояснить, почему вам нужен особый случай для статически скомпонованного кода?
person
Ulf Adams
schedule
20.02.2017