diff --git a/ivar.c b/ivar.c
index 2bfdaaf..b63ade4 100644
--- a/ivar.c
+++ b/ivar.c
@@ -8,10 +8,42 @@
 #include "ivar.h"
 #include "visibility.h"
 #include "gc_ops.h"
+#include <dlfcn.h>
 
 ptrdiff_t objc_alignof_type(const char *);
 ptrdiff_t objc_sizeof_type(const char *);
 
+PRIVATE int *global_ptr_to_offset_for_ivar_from_class(struct objc_ivar *ivar, Class class)
+{
+	static const char symbol_name_format_str[] = "__objc_ivar_offset_%s.%s";
+	int symbol_name_length, **ivar_offset_handle;
+	char *symbol_name;
+
+	if (!ivar || !class || !ivar->name || !class->name)
+	{
+		return NULL;
+	}
+
+	symbol_name_length =
+		strlen(symbol_name_format_str) + strlen(class->name) + strlen(ivar->name);
+
+	symbol_name = malloc(symbol_name_length);
+
+	if (!symbol_name)
+		return NULL;
+
+	sprintf(symbol_name, symbol_name_format_str, class->name, ivar->name);
+
+	ivar_offset_handle = dlsym(NULL, symbol_name);
+
+	free(symbol_name);
+
+	if (!ivar_offset_handle)
+		return NULL;
+
+	return *ivar_offset_handle;
+}
+
 PRIVATE void objc_compute_ivar_offsets(Class class)
 {
 	int i = 0;
@@ -81,6 +113,19 @@ PRIVATE void objc_compute_ivar_offsets(Class class)
 				*/
 				if (objc_test_class_flag(class, objc_class_flag_new_abi))
 				{
+					int *global_ivar_offset_ptr =
+							global_ptr_to_offset_for_ivar_from_class(ivar, class);
+
+					if (global_ivar_offset_ptr
+						&& (global_ivar_offset_ptr != class->ivar_offsets[i]))
+					{
+						// class->ivar_offsets[i] has the wrong address for the
+						// __objc_ivar_offset_[classname].[ivarname] global, so
+						// set it to the correct one:
+
+						class->ivar_offsets[i] = global_ivar_offset_ptr;
+					}
+
 					*(class->ivar_offsets[i]) = ivar->offset;
 				}
 			}
