Глобальный нельзя использовать при создании общего объекта с базелем - PullRequest
1 голос
/ 31 марта 2019

Я сталкиваюсь с ошибкой компиляции при попытке скомпилировать разделяемую библиотеку с помощью bazel, где одним из источников является объектный файл, и он компилируется с помощью clang.В частности, я получаю эту ошибку

`usec_delay' can not be used when making a shared object; recompile with -fPIC
error adding symbols: Bad value

usec_delay здесь глобальная переменная.

Вот шаги, которые я выполняю для создания объектного файла.

  1. скомпилировать исходный код в битовый код llvm с помощью clang

    clang -c -emit-llvm example_src.cc

  2. скомпилировать битовый код в сборку

    llc example_src.bc

  3. компилировать сборку в объект

    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",
        ),
    },
)

Подробный сборочный вывод для многословного выводаenter image description here

...