我有一个简单的 C 程序。我跑:
$ gcc Q1.c -Wall -save-temps -o Q1
Run Code Online (Sandbox Code Playgroud)
然后我检查生成的可执行文件:
$ objdump -f Q1
Q1: file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x080483b0
Run Code Online (Sandbox Code Playgroud)
然后我用静态链接编译它:
$ gcc Q1.c -Wall -save-temps -static -o Q1
Run Code Online (Sandbox Code Playgroud)
并再次检查文件:
$ objdump -f Q1
Q1: file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048e08
Run Code Online (Sandbox Code Playgroud)
静态链接和动态链接对程序的起始地址有什么影响?起始地址是 的地址main()
,对吗?
我正在检查我的 C 程序的预处理输出,碰巧查看了头文件 wordsize.h
它位于
/usr/include/i386-linux-gnu/bits/wordsize.h
该文件只包含一个宏
#define __WORDSIZE 32
Run Code Online (Sandbox Code Playgroud)
我的问题是,字长是由安装的编译器决定的,还是与我安装的操作系统(32 位或 64 位)有关,还是与我的硬件配置有关?机器。
我是 Linux 下的开发新手。
我尝试了 Ubuntu 12.04,根据我的理解,我做了以下分区:
/boot
,因为我将安装不同的内核版本(我正在开始内核开发)/var
/usr/local
/home
/
(根)现在我想在 Ubuntu 12.04 旁边安装 OpenSUSE 12.2。我可以在两个操作系统之间共享/var
和/usr/local
吗?我知道它们是具有不同软件包的两个不同发行版,但是有什么方法可以共享磁盘空间吗?这样两个操作系统都可以/usr/local
在同一个分区或类似的分区中拥有自己的操作系统?
我在 Linux shell Scripting 的书上看到了这个命令
$ kill -HUP 1234 >killout.txt 2>killerr.txt
Run Code Online (Sandbox Code Playgroud)
我知道命令的作用,但我无法理解标志-HUP
我正在研究我的 C 程序,我是 Linux/UNIX 开发的新手,正在四处看看。
我创建了一个简单的 Hello world C 程序,并正在检查编译过程。
我试图读取最终可执行文件的文件头并得到输出如下
$ objdump -f my_output
file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048320**
Run Code Online (Sandbox Code Playgroud)
我了解 elf32-i386 部分,但我不太确定标题的其他部分。
D_PAGED
与需求分页有某种关系吗?是什么
EXEC_P, HAS_SYSMS
意思?是起始地址,程序的逻辑地址main()
?
我是 Linux 新手,刚刚对分区表有了一些模糊的想法。这里准确地说是:
Model: ATA ST3500418AS (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 1001MB 1000MB primary ext4 boot
2 1001MB 3002MB 2001MB primary
3 3002MB 18.0GB 15.0GB primary ext4
4 18.0GB 500GB 482GB extended
5 18.0GB 53.0GB 35.0GB logical ext4
6 53.0GB 93.0GB 40.0GB logical ext4
7 93.0GB 500GB 407GB logical ext4
$ uname -r -v
3.2.0-41-generic-pae #66-Ubuntu SMP Thu Apr 25 03:50:20 UTC 2013
$ …
Run Code Online (Sandbox Code Playgroud) 有没有办法更改安装应用程序的目录?我的意思 是,只要它们在PATH变量中,/usr/bin
我就可以更改设置以将它们安装在/usr/local/bin
或类似的地方吗?
目前使用 Ubuntu 14.04 64 位。
如果解决方案取决于包管理器,是否有任何通用方法?我应该针对哪个配置文件?
我正在尝试使用 GDB 调试在 QEMU 上运行的内核。
内核已使用以下选项编译:
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y
Run Code Online (Sandbox Code Playgroud)
我使用以下命令在 qemu 中启动内核:
qemu-system-x86_64 -s -S -kernel arch/x86_64/boot/bzImage
Run Code Online (Sandbox Code Playgroud)
在一个单独的终端中,我从相同的路径启动 GDB 并按顺序发出这些命令:
gdb ./vmlinux
(gdb) target remote localhost:1234
(gdb) hbreak start_kernel
(gdb) c
Run Code Online (Sandbox Code Playgroud)
我没有提供 rootfs,因为到目前为止我对完整的工作系统不感兴趣,只对内核感兴趣。我还尝试了 hbreak/break 的组合。
内核只是启动并达到内核恐慌,因为无法找到 rootfs……预期。我希望它在 start_kernel 处停止,然后逐步执行代码。
观察:如果我设置一个立即断点,它会工作并停止,但不会在 start_kernel / startup_64 / main
qemu 是否有可能没有调用所有这些函数,或者它是否以某种方式被屏蔽了?
Kernel: 4.13.4
GDB: GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
GCC: gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
system: ubuntu 14.04 LTS
Run Code Online (Sandbox Code Playgroud)
注意:这个完全相同的过程适用于内核 3.2.93,但不适用于 4.13.4,所以我想需要更多的配置。我无法在网上找到为内核 4.0 及更高版本启用此调试程序的资源,因此到目前为止我正在继续使用 3.2,欢迎任何和所有输入。
c ×3
linux ×3
application ×1
dual-boot ×1
elf ×1
executable ×1
gcc ×1
gdb ×1
kernel ×1
kill ×1
osx ×1
partition ×1
programming ×1
qemu ×1
shell ×1
shell-script ×1
signals ×1