簡體   English   中英

fno-exceptions 和 POSITION 獨立代碼的交互

[英]Interaction of fno-exceptions and POSITION INDEPENDENT CODE

我在構建動態庫時遇到了一個相當奇怪的問題。 以下是一個小示例的詳細信息:

一個名為static.h的簡單文件,其內容為:

#pragma once

#include <string>

std::string static_speak();

static.cpp看起來像這樣:

#include "static.h"

std::string static_speak() {
  return "I am static";
}

可以使用以下兩個文件(使用 cmake)構建 static 庫:

add_library(static
  static.cpp
)

現在,考慮另一個名為shared.cpp的文件,其內容是:

#include "static.h"

std::string dynamic_speak() {
  return static_speak() + " I am dynamic";
}

可以嘗試構建一個動態庫(再次使用 cmake):

add_library(shared SHARED
  shared.cpp
)
target_link_libraries(shared PRIVATE
  static
)

當嘗試構建上述內容時,將遇到以下錯誤:

[4/4] Linking CXX shared library libshared.so
FAILED: libshared.so
: && /opt/vatic/bin/clang++ -fPIC -g   -shared -Wl,-soname,libshared.so -o libshared.so CMakeFiles/shared.dir/shared.cpp.o  libstatic.a && :                                 
/usr/bin/ld: libstatic.a(static.cpp.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC                    
/usr/bin/ld: final link failed: Nonrepresentable section on output
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

這是有道理的。 我們沒有使用POSITION_INDEPENDENT_CODE編譯static 這很容易通過以下方式修復:

add_library(static
  static.cpp
)
set_target_properties(static
  PROPERTIES
  POSITION_INDEPENDENT_CODE ON
)

當一個人編譯shared庫時,現在一切正常。

現在問題來了。 假設我沒有啟用POSITION_INDEPENDENT_CODE而是在我的代碼中禁用了異常 (:):

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")

現在,當我嘗試編譯shared時,一切仍然有效?! 異常和 fPIC 是如何相互關聯的?

這是重現該問題的存儲庫: https://github.com/skgbanga/shared

異常和 fPIC 是如何相互關聯的?

他們不是(大部分)。

發生的情況是使用-fno-exceptions進行編譯會更改重定位(不再引用某些與異常相關的數據),因此,在鏈接時沒有導致錯誤的重定位。

您可以通過使用和不使用-fno-exceptions進行構建,並比較來自objdump -dr CMakeFiles/static.dir/static.cpp.o的 output 來確認這一點。

PS我無法使用g++ (Debian 9.3.0-8)重現您的問題,因為它默認使用-fPIE ,並且兩個鏈接都成功。

如果我添加-fno-pie ,那么兩個鏈接都會以同樣的方式失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM