Merge "Support -z options in bcc::Linker."
diff --git a/include/bcc/Support/LinkerConfig.h b/include/bcc/Support/LinkerConfig.h
index d1ab0b1..4c21edc 100644
--- a/include/bcc/Support/LinkerConfig.h
+++ b/include/bcc/Support/LinkerConfig.h
@@ -50,6 +50,26 @@
bool initializeDiagnostic();
public:
+ enum ZOptionEnum {
+ kCombReloc = 1 << 0, ///< [on] -z combreloc, [off] -z nocombreloc
+ kDefs = 1 << 1, ///< -z defs
+ kExecStack = 1 << 2, ///< [on] -z execstack, [off] -z noexecstack
+ kInitFirst = 1 << 3, ///< -z initfirst
+ kInterPose = 1 << 4, ///< -z interpose
+ kLoadFltr = 1 << 5, ///< -z loadfltr
+ kMulDefs = 1 << 6, ///< -z muldefs
+ kNoCopyReloc = 1 << 7, ///< -z nocopyreloc
+ kNoDefaultLib = 1 << 8, ///< -z nodefaultlib
+ kNoDelete = 1 << 9, ///< -z nodelete
+ kNoDLOpen = 1 << 10, ///< -z nodlopen
+ kNoDump = 1 << 11, ///< -z nodump
+ kRelro = 1 << 12, ///< [on] -z relro, [off] -z norelro
+ kLazy = 1 << 13, ///< [on] -z lazy, [off] -z now
+ kOrigin = 1 << 14, ///< -z origin
+ kZOptionMask = 0xFFFF,
+ };
+
+public:
//===--------------------------------------------------------------------===//
// Getters
//===--------------------------------------------------------------------===//
@@ -81,6 +101,8 @@
void setSysRoot(const std::string &pSysRoot);
+ void setZOption(unsigned int pOptions);
+
void addWrap(const std::string &pWrapSymbol);
void addPortable(const std::string &pPortableSymbol);
diff --git a/lib/Support/LinkerConfig.cpp b/lib/Support/LinkerConfig.cpp
index bdbde23..34b5d84 100644
--- a/lib/Support/LinkerConfig.cpp
+++ b/lib/Support/LinkerConfig.cpp
@@ -22,6 +22,7 @@
#include <mcld/MC/MCLDInfo.h>
#include <mcld/MC/MCLDFile.h>
#include <mcld/MC/MCLDDirectory.h>
+#include <mcld/MC/ZOption.h>
#include <mcld/LD/TextDiagnosticPrinter.h>
#include <mcld/Support/Path.h>
#include <mcld/Support/MsgHandling.h>
@@ -112,6 +113,100 @@
return;
}
+void LinkerConfig::setZOption(unsigned int pOptions) {
+ mcld::ZOption option;
+ if (pOptions & kCombReloc) {
+ option.setKind(mcld::ZOption::CombReloc);
+ mLDInfo->options().addZOption(option);
+ }
+ else {
+ option.setKind(mcld::ZOption::NoCombReloc);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kDefs) {
+ option.setKind(mcld::ZOption::Defs);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kExecStack) {
+ option.setKind(mcld::ZOption::ExecStack);
+ mLDInfo->options().addZOption(option);
+ }
+ else {
+ option.setKind(mcld::ZOption::NoExecStack);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kInitFirst) {
+ option.setKind(mcld::ZOption::InitFirst);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kInterPose) {
+ option.setKind(mcld::ZOption::InterPose);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kLoadFltr) {
+ option.setKind(mcld::ZOption::LoadFltr);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kMulDefs) {
+ option.setKind(mcld::ZOption::MulDefs);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kNoCopyReloc) {
+ option.setKind(mcld::ZOption::NoCopyReloc);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kNoDefaultLib) {
+ option.setKind(mcld::ZOption::NoDefaultLib);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kNoDelete) {
+ option.setKind(mcld::ZOption::NoDelete);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kNoDLOpen) {
+ option.setKind(mcld::ZOption::NoDLOpen);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kNoDump) {
+ option.setKind(mcld::ZOption::NoDump);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kRelro) {
+ option.setKind(mcld::ZOption::Relro);
+ mLDInfo->options().addZOption(option);
+ }
+ else {
+ option.setKind(mcld::ZOption::NoRelro);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kLazy) {
+ option.setKind(mcld::ZOption::Lazy);
+ mLDInfo->options().addZOption(option);
+ }
+ else {
+ option.setKind(mcld::ZOption::Now);
+ mLDInfo->options().addZOption(option);
+ }
+
+ if (pOptions & kOrigin) {
+ option.setKind(mcld::ZOption::Origin);
+ mLDInfo->options().addZOption(option);
+ }
+}
+
void LinkerConfig::addWrap(const std::string &pWrapSymbol) {
bool exist = false;