diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index db584c4e7e4743a8368cc08a5777c8377a66be69..868552d6caad94dce54514384736715f4a193b17 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -23,11 +23,13 @@
 #include "commands/trigger.h"
 #include "executor/spi.h"
 #include "funcapi.h"
+#include "libpq/pqsignal.h"
 #include "mb/pg_wchar.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "parser/parse_type.h"
 #include "storage/ipc.h"
+#include "tcop/tcopprot.h"
 #include "utils/builtins.h"
 #include "utils/fmgroids.h"
 #include "utils/guc.h"
@@ -741,6 +743,18 @@ plperl_init_interp(void)
 			char	   *dummy_env[1] = {NULL};
 
 			PERL_SYS_INIT3(&nargs, (char ***) &embedding, (char ***) &dummy_env);
+
+			/*
+			 * For unclear reasons, PERL_SYS_INIT3 sets the SIGFPE handler to
+			 * SIG_IGN.  Aside from being extremely unfriendly behavior for a
+			 * library, this is dumb on the grounds that the results of a
+			 * SIGFPE in this state are undefined according to POSIX, and in
+			 * fact you get a forced process kill at least on Linux.  Hence,
+			 * restore the SIGFPE handler to the backend's standard setting.
+			 * (See Perl bug 114574 for more information.)
+			 */
+			pqsignal(SIGFPE, FloatExceptionHandler);
+
 			perl_sys_init_done = 1;
 			/* quiet warning if PERL_SYS_INIT3 doesn't use the third argument */
 			dummy_env[0] = NULL;