--- a/cmake/FindBFD.cmake
+++ b/cmake/FindBFD.cmake
@@ -1,14 +1,46 @@
-find_path(BFD_INCLUDE_DIR bfd.h)
-find_library(BFD_LIBRARY bfd)
-#find_library(IBERTY_LIBRARY iberty)
-#find_library(Z_LIBRARY z)
-#find_library(DL_LIBRARY dl)
+# Patched to use static BFD
+
+# Backup the original value of the requested library suffixes
+set(_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
+# Static libraries end with .a on Unix and .lib on Windows
+set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
+
+find_path(bfd_INCLUDE_DIR bfd.h)
+find_library(bfd_LIBRARY bfd)
 
 include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(BFD DEFAULT_MSG BFD_INCLUDE_DIR BFD_LIBRARY)
+find_package_handle_standard_args(StaticBFD DEFAULT_MSG bfd_LIBRARY
+    bfd_INCLUDE_DIR)
+
+find_path(iberty_INCLUDE_DIR libiberty/libiberty.h)
+find_library(iberty_LIBRARY iberty)
+
+find_path(sframe_INCLUDE_DIR sframe.h)
+find_library(sframe_LIBRARY sframe)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(StaticBFD DEFAULT_MSG bfd_LIBRARY
+    bfd_INCLUDE_DIR)
+find_package_handle_standard_args(StaticIBERTY DEFAULT_MSG iberty_LIBRARY
+    iberty_INCLUDE_DIR)
+find_package_handle_standard_args(StaticSFRAME DEFAULT_MSG sframe_LIBRARY
+    sframe_INCLUDE_DIR)
+
+  
+# Reset the library suffixes to the original value
+set(CMAKE_FIND_LIBRARY_SUFFIXES ${_CMAKE_FIND_LIBRARY_SUFFIXES})
+# Unset the temporary to not pollute the global namespace
+unset(_CMAKE_FIND_LIBRARY_SUFFIXES)
+
+# We found the static BFD library and then we set this target which
+# LLVM CMake uses to find the "shared" library. Then BFD gets linked
+# statically with LFortran and everything works. This is dependent
+# on LLVM's CMake. If it changes, we also have to change the handling
+# here.
+
 
-add_library(p::bfd INTERFACE IMPORTED)
-set_property(TARGET p::bfd PROPERTY INTERFACE_INCLUDE_DIRECTORIES
-    ${BFD_INCLUDE_DIR})
-set_property(TARGET p::bfd PROPERTY INTERFACE_LINK_LIBRARIES
-    ${BFD_LIBRARY})
+add_library(bfd::libbfd_shared INTERFACE IMPORTED)
+set_property(TARGET bfd::libbfd_shared PROPERTY INTERFACE_INCLUDE_DIRECTORIES
+    ${bfd_INCLUDE_DIR})
+set_property(TARGET bfd::libbfd_shared PROPERTY INTERFACE_LINK_LIBRARIES
+    ${bfd_LIBRARY} ${iberty_LIBRARY} ${sframe_LIBRARY})
--- a/src/libasr/CMakeLists.txt
+++ b/src/libasr/CMakeLists.txt
@@ -133,7 +133,7 @@
     target_link_libraries(asr p::libunwind)
 endif()
 if (WITH_BFD)
-    target_link_libraries(asr p::bfd)
+    target_link_libraries(asr bfd::libbfd_shared  p::z)
 endif()
 if (WITH_LINK)
     target_link_libraries(asr p::link)
--- a/src/lfortran/CMakeLists.txt
+++ b/src/lfortran/CMakeLists.txt
@@ -81,7 +81,7 @@
     target_link_libraries(lfortran_lib p::rapidjson)
 endif()
 if (WITH_BFD)
-    target_link_libraries(lfortran_lib p::bfd)
+    target_link_libraries(lfortran_lib bfd::libbfd_shared  p::z)
 endif()
 if (WITH_LINK)
     target_link_libraries(lfortran_lib p::link)
