parent
0f84773e72
commit
d9e961a08f
@ -0,0 +1,54 @@
|
|||||||
|
From 4731ebf085fe6322ba8c7ca14918d3cab2186cf0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Date: Fri, 25 Feb 2022 04:45:37 -0500
|
||||||
|
Subject: [PATCH 1/8] coredump: use MEMBER_{OFFSET, SIZE} instead of
|
||||||
|
GCORE_{OFFSET, SIZE}
|
||||||
|
|
||||||
|
fill_auxv_note() and compat_fill_auxv_note() is called just once each
|
||||||
|
time gcore command is invoked because each process has just one
|
||||||
|
NT_AUXV. This means using MEMBER_{OFFSET, SIZE} is enough; using
|
||||||
|
GCORE_{OFFSET, SIZE} is overkill.
|
||||||
|
|
||||||
|
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
|
||||||
|
---
|
||||||
|
src/libgcore/gcore_coredump.c | 12 ++++++------
|
||||||
|
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c
|
||||||
|
index 3d0c0fcce61e..6f57b21b62b6 100644
|
||||||
|
--- a/src/libgcore/gcore_coredump.c
|
||||||
|
+++ b/src/libgcore/gcore_coredump.c
|
||||||
|
@@ -930,11 +930,11 @@ fill_auxv_note(struct elf_note_info *info, struct task_context *tc,
|
||||||
|
ulong *auxv;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- auxv = (ulong *)GETBUF(GCORE_SIZE(mm_struct_saved_auxv));
|
||||||
|
+ auxv = (ulong *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv"));
|
||||||
|
|
||||||
|
readmem(task_mm(tc->task, FALSE) +
|
||||||
|
- GCORE_OFFSET(mm_struct_saved_auxv), KVADDR, auxv,
|
||||||
|
- GCORE_SIZE(mm_struct_saved_auxv), "fill_auxv_note",
|
||||||
|
+ MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv,
|
||||||
|
+ MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note",
|
||||||
|
gcore_verbose_error_handle());
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
@@ -956,11 +956,11 @@ compat_fill_auxv_note(struct elf_note_info *info,
|
||||||
|
uint32_t *auxv;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- auxv = (uint32_t *)GETBUF(GCORE_SIZE(mm_struct_saved_auxv));
|
||||||
|
+ auxv = (uint32_t *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv"));
|
||||||
|
|
||||||
|
readmem(task_mm(tc->task, FALSE) +
|
||||||
|
- GCORE_OFFSET(mm_struct_saved_auxv), KVADDR, auxv,
|
||||||
|
- GCORE_SIZE(mm_struct_saved_auxv), "fill_auxv_note32",
|
||||||
|
+ MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv,
|
||||||
|
+ MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note32",
|
||||||
|
gcore_verbose_error_handle());
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
@ -0,0 +1,60 @@
|
|||||||
|
From 6f4357340807f70bd1999f0b88435361c583f0b9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Date: Fri, 25 Feb 2022 04:51:06 -0500
|
||||||
|
Subject: [PATCH 2/8] gcore, defs: remove definitions and initializations for
|
||||||
|
saved_auxv entries of offset and size tables
|
||||||
|
|
||||||
|
saved_auxv entries of offset and size tables are now not used in the
|
||||||
|
source code by the previous commit. Let's remove definitions and
|
||||||
|
initializations for them.
|
||||||
|
|
||||||
|
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
|
||||||
|
---
|
||||||
|
src/gcore.c | 2 --
|
||||||
|
src/libgcore/gcore_defs.h | 2 --
|
||||||
|
2 files changed, 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/gcore.c b/src/gcore.c
|
||||||
|
index 5b78d9980887..f86b15f8a9f6 100644
|
||||||
|
--- a/src/gcore.c
|
||||||
|
+++ b/src/gcore.c
|
||||||
|
@@ -371,7 +371,6 @@ static void gcore_offset_table_init(void)
|
||||||
|
GCORE_MEMBER_OFFSET_INIT(mm_struct_arg_end, "mm_struct", "arg_end");
|
||||||
|
GCORE_MEMBER_OFFSET_INIT(mm_struct_map_count, "mm_struct", "map_count");
|
||||||
|
GCORE_MEMBER_OFFSET_INIT(mm_struct_reserved_vm, "mm_struct", "reserved_vm");
|
||||||
|
- GCORE_MEMBER_OFFSET_INIT(mm_struct_saved_auxv, "mm_struct", "saved_auxv");
|
||||||
|
GCORE_MEMBER_OFFSET_INIT(mm_struct_saved_files, "mm_struct", "saved_files");
|
||||||
|
GCORE_MEMBER_OFFSET_INIT(mm_struct_context, "mm_struct", "context");
|
||||||
|
GCORE_MEMBER_OFFSET_INIT(pid_level, "pid", "level");
|
||||||
|
@@ -520,7 +519,6 @@ static void gcore_size_table_init(void)
|
||||||
|
{
|
||||||
|
GCORE_STRUCT_SIZE_INIT(i387_union, "i387_union");
|
||||||
|
GCORE_STRUCT_SIZE_INIT(mm_context_t, "mm_context_t");
|
||||||
|
- GCORE_MEMBER_SIZE_INIT(mm_struct_saved_auxv, "mm_struct", "saved_auxv");
|
||||||
|
GCORE_MEMBER_SIZE_INIT(mm_struct_saved_files, "mm_struct", "saved_files");
|
||||||
|
GCORE_MEMBER_SIZE_INIT(thread_struct_ds, "thread_struct", "ds");
|
||||||
|
GCORE_MEMBER_SIZE_INIT(thread_struct_es, "thread_struct", "es");
|
||||||
|
diff --git a/src/libgcore/gcore_defs.h b/src/libgcore/gcore_defs.h
|
||||||
|
index df87851d23a1..3233ea533ca0 100644
|
||||||
|
--- a/src/libgcore/gcore_defs.h
|
||||||
|
+++ b/src/libgcore/gcore_defs.h
|
||||||
|
@@ -1072,7 +1072,6 @@ struct gcore_offset_table
|
||||||
|
long mm_struct_arg_end;
|
||||||
|
long mm_struct_map_count;
|
||||||
|
long mm_struct_reserved_vm;
|
||||||
|
- long mm_struct_saved_auxv;
|
||||||
|
long mm_struct_saved_files;
|
||||||
|
long mm_struct_context;
|
||||||
|
long pid_level;
|
||||||
|
@@ -1148,7 +1147,6 @@ struct gcore_offset_table
|
||||||
|
struct gcore_size_table
|
||||||
|
{
|
||||||
|
long mm_context_t;
|
||||||
|
- long mm_struct_saved_auxv;
|
||||||
|
long mm_struct_saved_files;
|
||||||
|
long thread_struct_ds;
|
||||||
|
long thread_struct_es;
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
@ -0,0 +1,129 @@
|
|||||||
|
From 4cb65a0d9168778d120920418b968d05da10989f Mon Sep 17 00:00:00 2001
|
||||||
|
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Date: Fri, 25 Feb 2022 04:59:48 -0500
|
||||||
|
Subject: [PATCH 3/8] gcore: fix memory allocation failure during processing
|
||||||
|
NT_AUXV note
|
||||||
|
|
||||||
|
For crash dumps generated using kernel-4.18.0-365.el8 or later on
|
||||||
|
CentOS stream 8, crash gcore command fails as follows:
|
||||||
|
|
||||||
|
crash> gcore -v 7 -f 128 10604
|
||||||
|
gcore: Opening file core.10604.test-dumpfilter ...
|
||||||
|
gcore: done.
|
||||||
|
gcore: Writing ELF header ...
|
||||||
|
gcore: done.
|
||||||
|
gcore: Retrieving and writing note information ...
|
||||||
|
gcore: zero-size memory allocation! (called from 7fd558ce1e05)
|
||||||
|
Failed.
|
||||||
|
|
||||||
|
This memory allocation failure occurs in fill_auxv_note() that creates
|
||||||
|
NT_AUXV note due to saved_auxv entries of size and offset tables are
|
||||||
|
somehow 0.
|
||||||
|
|
||||||
|
This is because during the merge of the upstream kernel commit
|
||||||
|
1c33bb0507508af24fd754dd7123bd8e997fab2f (x86/elf: Support a new ELF
|
||||||
|
aux vector AT_MINSIGSTKSZ), location of saved_auxv of struct mm_struct
|
||||||
|
has been moved as workaround in order to avoid kABI breakage.
|
||||||
|
|
||||||
|
Fix this by using RHEL-specific location for saved_auxv if there is
|
||||||
|
member rh_reserved_saved_auxv in struct mm_struct.
|
||||||
|
|
||||||
|
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
|
||||||
|
---
|
||||||
|
src/libgcore/gcore_coredump.c | 54 +++++++++++++++++++++++++++++------
|
||||||
|
1 file changed, 46 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c
|
||||||
|
index 6f57b21b62b6..c14cc116e951 100644
|
||||||
|
--- a/src/libgcore/gcore_coredump.c
|
||||||
|
+++ b/src/libgcore/gcore_coredump.c
|
||||||
|
@@ -18,6 +18,10 @@
|
||||||
|
|
||||||
|
static struct elf_note_info *elf_note_info_init(void);
|
||||||
|
|
||||||
|
+static void get_auxv_size_addr(struct task_context *tc,
|
||||||
|
+ size_t *size,
|
||||||
|
+ ulong *addr);
|
||||||
|
+
|
||||||
|
static void fill_prstatus_note(struct elf_note_info *info,
|
||||||
|
struct task_context *tc,
|
||||||
|
struct memelfnote *memnote);
|
||||||
|
@@ -923,18 +927,49 @@ compat_fill_prstatus_note(struct elf_note_info *info,
|
||||||
|
|
||||||
|
#endif /* GCORE_ARCH_COMPAT */
|
||||||
|
|
||||||
|
+static void get_auxv_size_addr(struct task_context *tc,
|
||||||
|
+ size_t *psize,
|
||||||
|
+ ulong *paddr)
|
||||||
|
+{
|
||||||
|
+ size_t size;
|
||||||
|
+ ulong addr;
|
||||||
|
+
|
||||||
|
+ if (MEMBER_EXISTS("mm_struct", "rh_reserved_saved_auxv")) {
|
||||||
|
+ ulong mm_rh;
|
||||||
|
+
|
||||||
|
+ size = MEMBER_SIZE("mm_struct_rh", "saved_auxv");
|
||||||
|
+ readmem(task_mm(tc->task, FALSE) + MEMBER_OFFSET("mm_struct", "mm_rh"),
|
||||||
|
+ KVADDR,
|
||||||
|
+ &mm_rh,
|
||||||
|
+ sizeof(mm_rh),
|
||||||
|
+ "mm_struct mm_rh",
|
||||||
|
+ gcore_verbose_error_handle());
|
||||||
|
+ addr = mm_rh + MEMBER_OFFSET("mm_struct_rh", "saved_auxv");
|
||||||
|
+ } else {
|
||||||
|
+ size = MEMBER_SIZE("mm_struct", "saved_auxv");
|
||||||
|
+ addr = task_mm(tc->task, FALSE) +
|
||||||
|
+ MEMBER_OFFSET("mm_struct", "saved_auxv");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *psize = size;
|
||||||
|
+ *paddr = addr;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
fill_auxv_note(struct elf_note_info *info, struct task_context *tc,
|
||||||
|
struct memelfnote *memnote)
|
||||||
|
{
|
||||||
|
ulong *auxv;
|
||||||
|
+ ulong addr;
|
||||||
|
+ size_t size;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- auxv = (ulong *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv"));
|
||||||
|
+ get_auxv_size_addr(tc, &size, &addr);
|
||||||
|
|
||||||
|
- readmem(task_mm(tc->task, FALSE) +
|
||||||
|
- MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv,
|
||||||
|
- MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note",
|
||||||
|
+ auxv = (ulong *)GETBUF(size);
|
||||||
|
+
|
||||||
|
+ readmem(addr, KVADDR, auxv,
|
||||||
|
+ size, "fill_auxv_note",
|
||||||
|
gcore_verbose_error_handle());
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
@@ -954,13 +989,16 @@ compat_fill_auxv_note(struct elf_note_info *info,
|
||||||
|
struct memelfnote *memnote)
|
||||||
|
{
|
||||||
|
uint32_t *auxv;
|
||||||
|
+ ulong addr;
|
||||||
|
+ size_t size;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- auxv = (uint32_t *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv"));
|
||||||
|
+ get_auxv_size_addr(tc, &size, &addr);
|
||||||
|
+
|
||||||
|
+ auxv = (uint32_t *)GETBUF(size);
|
||||||
|
|
||||||
|
- readmem(task_mm(tc->task, FALSE) +
|
||||||
|
- MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv,
|
||||||
|
- MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note32",
|
||||||
|
+ readmem(addr, KVADDR, auxv,
|
||||||
|
+ size, "fill_auxv_note32",
|
||||||
|
gcore_verbose_error_handle());
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
@ -0,0 +1,114 @@
|
|||||||
|
From 03f9360715731f18e4fdae7b30aa34b30dddcd57 Mon Sep 17 00:00:00 2001
|
||||||
|
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Date: Sat, 26 Mar 2022 21:42:02 +0900
|
||||||
|
Subject: [PATCH 4/8] x86: Fix failure of collecting vsyscall mapping due to
|
||||||
|
change of enum type of vsyscall_mode
|
||||||
|
|
||||||
|
vsyscall mapping fails to get collected because the commit
|
||||||
|
bd49e16e3339 (x86/vsyscall: Add a new vsyscall=xonly mode) merged at
|
||||||
|
kernel v5.2-rc7 added constant XONLY to the anonymous enumeration type
|
||||||
|
of variable vsyscall_mode, which made the value of constant NONE
|
||||||
|
change from 1 to 2.
|
||||||
|
|
||||||
|
This commit fixes the issue by checking the value of constant NONE
|
||||||
|
using gdb's print command and typeof operator since there's no utility
|
||||||
|
function to handle such anonymous enumeration type currently in crash
|
||||||
|
utility.
|
||||||
|
|
||||||
|
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
|
||||||
|
---
|
||||||
|
src/libgcore/gcore_x86.c | 56 ++++++++++++++++++++++++++++++++++++++--
|
||||||
|
1 file changed, 54 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/libgcore/gcore_x86.c b/src/libgcore/gcore_x86.c
|
||||||
|
index 08e573c741f6..f334a85d4240 100644
|
||||||
|
--- a/src/libgcore/gcore_x86.c
|
||||||
|
+++ b/src/libgcore/gcore_x86.c
|
||||||
|
@@ -41,6 +41,9 @@ struct gcore_x86_table
|
||||||
|
static struct gcore_x86_table gcore_x86_table;
|
||||||
|
struct gcore_x86_table *gxt = &gcore_x86_table;
|
||||||
|
|
||||||
|
+static void gdb_run_command(char *cmd, char *buf, size_t size);
|
||||||
|
+static int get_vsyscall_mode_none(void);
|
||||||
|
+
|
||||||
|
#ifdef X86_64
|
||||||
|
static ulong gcore_x86_64_get_old_rsp(int cpu);
|
||||||
|
static ulong gcore_x86_64_get_per_cpu__old_rsp(int cpu);
|
||||||
|
@@ -2367,6 +2370,54 @@ int gcore_is_arch_32bit_emulation(struct task_context *tc)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void gdb_run_command(char *cmd, char *buf, size_t size)
|
||||||
|
+{
|
||||||
|
+ open_tmpfile();
|
||||||
|
+ if (!gdb_pass_through(cmd,
|
||||||
|
+ pc->tmpfile,
|
||||||
|
+ GNU_RETURN_ON_ERROR)) {
|
||||||
|
+ close_tmpfile();
|
||||||
|
+ error(FATAL, "gdb command failed: %s", cmd);
|
||||||
|
+ }
|
||||||
|
+ rewind(pc->tmpfile);
|
||||||
|
+ fgets(buf, size, pc->tmpfile);
|
||||||
|
+ close_tmpfile();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int get_vsyscall_mode_none(void)
|
||||||
|
+{
|
||||||
|
+ static int none = -1;
|
||||||
|
+ char cmd[32], buf[BUFSIZE];
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ if (none != -1)
|
||||||
|
+ return none;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Variable vsyscall_mode is of anonymous enumeration
|
||||||
|
+ * type. Because there's no utility function in crash utility
|
||||||
|
+ * to get value of each constant in specified anonymous
|
||||||
|
+ * enumeration type, we have no choice but rely on gdb's print
|
||||||
|
+ * command in combination with typeof operator.
|
||||||
|
+ */
|
||||||
|
+ for (i = 0; i < 10; ++i) {
|
||||||
|
+ snprintf(cmd, sizeof(cmd), "p (typeof(vsyscall_mode))%d", i);
|
||||||
|
+ gdb_run_command(cmd, buf, sizeof(buf));
|
||||||
|
+ if (strstr(buf, "NONE"))
|
||||||
|
+ return none = i;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * When the above logic doesn't work as expected, use 2, which
|
||||||
|
+ * is the value on the definition where vsyscall_mode was
|
||||||
|
+ * first introduced at the commit 3ae36655b97a (x86-64: Rework
|
||||||
|
+ * vsyscall emulation and add vsyscall= parameter).
|
||||||
|
+ */
|
||||||
|
+ none = 2;
|
||||||
|
+
|
||||||
|
+ return none;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* Return an address to gate_vma.
|
||||||
|
*/
|
||||||
|
@@ -2377,7 +2428,8 @@ ulong gcore_arch_get_gate_vma(void)
|
||||||
|
return 0UL;
|
||||||
|
|
||||||
|
if (symbol_exists("vsyscall_mode")) {
|
||||||
|
- enum { ENUMERATE, NONE } vsyscall_mode;
|
||||||
|
+ int vsyscall_mode;
|
||||||
|
+ int none = get_vsyscall_mode_none();
|
||||||
|
|
||||||
|
readmem(symbol_value("vsyscall_mode"),
|
||||||
|
KVADDR,
|
||||||
|
@@ -2386,7 +2438,7 @@ ulong gcore_arch_get_gate_vma(void)
|
||||||
|
"gcore_arch_get_gate_vma: vsyscall_mode",
|
||||||
|
gcore_verbose_error_handle());
|
||||||
|
|
||||||
|
- if (vsyscall_mode == NONE)
|
||||||
|
+ if (vsyscall_mode == none)
|
||||||
|
return 0UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
@ -0,0 +1,53 @@
|
|||||||
|
From dbb542e10bfe1b2e21c7927bda9be1d301cfef65 Mon Sep 17 00:00:00 2001
|
||||||
|
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Date: Fri, 17 Jun 2022 20:38:19 +0900
|
||||||
|
Subject: [PATCH 7/8] coredump: fix unexpected truncation of generated core
|
||||||
|
files
|
||||||
|
|
||||||
|
Core files generated by crash gcore command are sometimes unexpectedly
|
||||||
|
truncated. Then, we can get aware of this from the following warning
|
||||||
|
message output by gdb:
|
||||||
|
|
||||||
|
BFD: warning: /root/./core.1.systemd is truncated: expected core file size >= 43606016, found: 43597824
|
||||||
|
|
||||||
|
From the investigation, it turned out that this truncation is
|
||||||
|
occurring when there is no write() operation after the area skipped by
|
||||||
|
lseek(). Holes are generated only when there is write() operation.
|
||||||
|
|
||||||
|
To fix this issue, use ftruncate() to allocate holes explicitly.
|
||||||
|
|
||||||
|
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
|
||||||
|
---
|
||||||
|
src/libgcore/gcore_coredump.c | 15 +++++++++++++++
|
||||||
|
1 file changed, 15 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c
|
||||||
|
index 424b0a40a42b..27086d91468b 100644
|
||||||
|
--- a/src/libgcore/gcore_coredump.c
|
||||||
|
+++ b/src/libgcore/gcore_coredump.c
|
||||||
|
@@ -331,6 +331,21 @@ void gcore_coredump(void)
|
||||||
|
}
|
||||||
|
progressf("done.\n");
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Use ftruncate() to generate holes explicitly, or core file
|
||||||
|
+ * gets truncated if there is no write() operation after the
|
||||||
|
+ * area skipped by lseek().
|
||||||
|
+ */
|
||||||
|
+ if (fflush(gcore->fp))
|
||||||
|
+ error(FATAL, "%s: fflush: %s\n",
|
||||||
|
+ gcore->corename,
|
||||||
|
+ strerror(errno));
|
||||||
|
+
|
||||||
|
+ if (ftruncate(fileno(gcore->fp), ftell(gcore->fp)) < 0)
|
||||||
|
+ error(FATAL, "%s: ftruncate: %s\n",
|
||||||
|
+ gcore->corename,
|
||||||
|
+ strerror(errno));
|
||||||
|
+
|
||||||
|
gcore->flags |= GCF_SUCCESS;
|
||||||
|
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
@ -0,0 +1,43 @@
|
|||||||
|
From d2795659986dacc51e98a3d1dbc8b673582c20fe Mon Sep 17 00:00:00 2001
|
||||||
|
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Date: Tue, 28 Jun 2022 03:54:46 +0900
|
||||||
|
Subject: [PATCH 8/8] gcore.mk: fix mismatch of _FILE_OFFSET_BITS when building
|
||||||
|
gcore.so
|
||||||
|
|
||||||
|
On arm and mips, while _FILE_OFFSET_BITS=64 is used when building
|
||||||
|
gcore.so by make extensions, it is not used by gcore.mk.
|
||||||
|
|
||||||
|
Fix this inconsistency by using _FILE_OFFSET_BITS=64 in gcore.mk on
|
||||||
|
arm and mips.
|
||||||
|
|
||||||
|
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
|
||||||
|
---
|
||||||
|
src/gcore.mk | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/gcore.mk b/src/gcore.mk
|
||||||
|
index 4af292b79c60..1fd4d84c2ded 100644
|
||||||
|
--- a/src/gcore.mk
|
||||||
|
+++ b/src/gcore.mk
|
||||||
|
@@ -32,7 +32,7 @@ endif
|
||||||
|
|
||||||
|
ifeq ($(shell arch), arm)
|
||||||
|
TARGET=ARM
|
||||||
|
- TARGET_CFLAGS=
|
||||||
|
+ TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64
|
||||||
|
ARCH=SUPPORTED
|
||||||
|
endif
|
||||||
|
|
||||||
|
@@ -44,7 +44,7 @@ endif
|
||||||
|
|
||||||
|
ifeq ($(shell arch), mips)
|
||||||
|
TARGET=MIPS
|
||||||
|
- TARGET_CFLAGS=
|
||||||
|
+ TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64
|
||||||
|
ARCH=SUPPORTED
|
||||||
|
endif
|
||||||
|
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
Loading…
Reference in new issue