Я сталкиваюсь с ошибкой компиляции при попытке скомпилировать разделяемую библиотеку с помощью bazel, где одним из источников является объектный файл, и он компилируется с помощью clang.В частности, я получаю эту ошибку
`usec_delay' can not be used when making a shared object; recompile with -fPIC
error adding symbols: Bad value
usec_delay здесь глобальная переменная.
Вот шаги, которые я выполняю для создания объектного файла.
скомпилировать исходный код в битовый код llvm с помощью clang
clang -c -emit-llvm example_src.cc
скомпилировать битовый код в сборку
llc example_src.bc
компилировать сборку в объект
clang -c example_src.s -o example_src.o
example_src.o
затем используется в файле bazel BUILD в качестве источника.
Когда я компилирую исходный код того же примера с помощью gcc, компиляция завершается успешно.Т.е.
g++ -S example_src.cc
g++ -c example_src.s
Я пытался добавить -fPIC
к Базелю copts
, но проблема все еще существует.И для случая с g ++ мне даже не нужен этот флаг, он работает без него.
Часть файла BUILD, где выполняется компиляция, выглядит следующим образом:
sim_enclave(
name = "example.so",
srcs = [
"example_enclave.cc",
"example_src.o",
"interface_selectors.h",
],
copts = ASYLO_DEFAULT_COPTS,
deps = [
"//asylo/platform/primitives",
"//asylo/util:status_macros",
],
)
sim_enclave isопределено в asylo и использует приведенное ниже правило sgx_enclave:
def sgx_enclave(
name,
config = "@linux_sgx//:enclave_debug_config",
testonly = 0,
**kwargs):
"""Build rule for creating SGX enclave shared object files signed for testing.
The enclave is signed with test key stored in
@linux_sgx//:enclave_test_private.pem.
This macro creates two build targets:
1) name_unsigned.so: cc_binary that builds the unsigned enclave.
2) name: internal signing rule that (debug) signs name_unsigned.so.
Args:
name: The debug-signed enclave target name.
config: An sgx_enclave_configuration rule.
testonly: 0 or 1, set to 1 if the target is only used in tests.
**kwargs: cc_binary arguments.
Returns:
string: The name of the signed enclave.
"""
unsigned_name = _unsigned_enclave_name(name)
_sgx_unsigned_enclave(
name = unsigned_name,
testonly = testonly,
**kwargs
)
kwargs = {k: v for k, v in kwargs.items() if k in ["visibility"]}
_sgx_debug_sign_enclave(
name = name,
unsigned = unsigned_name,
config = config,
testonly = testonly,
**kwargs
)
return name
Определен _sgx_unsigned_enclave:
def _sgx_unsigned_enclave(
name,
**kwargs):
"""Build rule for creating an unsigned SGX enclave shared object file.
Args:
name: The enclave target name.
**kwargs: cc_binary arguments.
"""
# Append enclave specific arguments.
kwargs["copts"] = kwargs.get("copts", []) + [
"-Iexternal/linux_sgx/common/inc/",
"-fstack-protector",
]
lds_label = "@linux_sgx//:enclave_sim.lds"
kwargs["features"] = kwargs.get("features", []) + [
"fully_static_link",
]
kwargs["linkopts"] = kwargs.get("linkopts", []) + [
"-Wl,-Bstatic",
"-Wl,-Bsymbolic",
"-Wl,-pie,-eenclave_entry",
"-Wl,--defsym,__ImageBase=0",
"-Wl,--export-dynamic",
"-Wl,--version-script",
"$(location %s)" % lds_label,
]
kwargs["linkshared"] = 1
kwargs["linkstatic"] = 1
kwargs["deps"] = kwargs.get("deps", []) + [
lds_label,
"@linux_sgx//:intel_runtime",
]
# Create rule to build unsigned enclave.
native.cc_binary(
name = name,
**kwargs
)
и _sgx_debug_sign_enclave
_sgx_debug_sign_enclave = rule(
implementation = _sgx_debug_sign_enclave_impl,
executable = True,
attrs = {
"config": attr.label(
mandatory = True,
allow_single_file = True,
providers = [SGXEnclaveConfigInfo],
),
"unsigned": attr.label(allow_single_file = True),
"_key": attr.label(
default = Label(
"@linux_sgx//:enclave_test_private.pem",
),
allow_single_file = True,
),
"_sign_tool": attr.label(
default = Label("@linux_sgx//:sgx_sign_tool"),
allow_single_file = True,
executable = True,
cfg = "host",
),
},
)
Подробный сборочный вывод для многословного вывода