Index: lld/ELF/Arch/RISCV.cpp
--- lld/ELF/Arch/RISCV.cpp.orig
+++ lld/ELF/Arch/RISCV.cpp
@@ -144,7 +144,7 @@ uint32_t RISCV::calcEFlags() const {
       target |= EF_RISCV_RVC;
 
     if ((eflags & EF_RISCV_FLOAT_ABI) != (target & EF_RISCV_FLOAT_ABI))
-      error(
+      warn(
           toString(f) +
           ": cannot link object files with different floating-point ABI from " +
           toString(ctx.objectFiles[0]));
@@ -621,7 +621,7 @@ static bool relax(InputSection &sec) {
   // iteration.
   DenseMap<const Defined *, uint64_t> valueDelta;
   ArrayRef<SymbolAnchor> sa = ArrayRef(aux.anchors);
-  uint32_t delta = 0;
+  uint64_t delta = 0;
   for (auto [i, r] : llvm::enumerate(sec.relocs())) {
     for (; sa.size() && sa[0].offset <= r.offset; sa = sa.slice(1))
       if (!sa[0].end)
@@ -688,8 +688,8 @@ static bool relax(InputSection &sec) {
       a.d->value -= delta - valueDelta.find(a.d)->second;
   }
   // Inform assignAddresses that the size has changed.
-  if (!isUInt<16>(delta))
-    fatal("section size decrease is too large");
+  if (!isUInt<32>(delta))
+    fatal("section size decrease is too large: " + Twine(delta));
   sec.bytesDropped = delta;
   return changed;
 }
