GCC gì
Mở rộng kgiannakakis hơn một chút.
Những biểu tượng được xác định bởi các từ khóa PROVIDE
của kịch bản mối liên kết, ghi nhận tại https://sourceware.org/binutils/docs-2.25/ld/PROVIDE.html#PROVIDE
Giá trị mặc định kịch bản được tạo ra khi bạn xây dựng binutils và nhúng vào ld
thực thi: tập tin bên ngoài có thể được cài đặt trong phân phối của bạn như trong /usr/lib/ldscripts
không được sử dụng theo mặc định.
Echo kịch bản mối liên kết sẽ được sử dụng:
ld -verbose | less
Trong binutils 2,24 nó chứa:
.text :
{
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
}
.fini :
{
KEEP (*(SORT_NONE(.fini)))
}
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
Vì vậy, chúng tôi cũng phát hiện ra rằng:
__etext
và _etext
cũng sẽ làm việc
etext
không phải là sự kết thúc của phần .text
, nhưng thay vì .fini
, mà cũng chứa mã
etext
không phải là ở phần cuối của phân khúc này, với .rodata
sau nó, vì binutils bãi tất cả các phần readonly vào cùng một phân khúc
PROVIDE
tạo các ký hiệu yếu: nếu bạn cũng xác định các ký hiệu đó trong mã C của mình, định nghĩa của bạn sẽ giành được và ẩn biểu tượng này.
Minimal Linux 32-bit dụ
Để thực sự hiểu những điều làm việc, tôi muốn tạo ví dụ tối thiểu!
main.S
:
.section .text
/* Exit system call. */
mov $1, %eax
/* Exit status. */
mov sdata, %ebx
int $0x80
.section .data
.byte 2
link.ld
:
SECTIONS
{
. = 0x400000;
.text :
{
*(.text)
sdata = .;
*(.data)
}
}
Biên dịch và chạy:
gas --32 -o main.o main.S
ld -m elf_i386 -o main -T link.ld main.o
./main
echo $?
Output:
2
Giải thích: sdata
trỏ đến byte đầu tiên của phần bắt đầu của phần .data
sau.
Vì vậy, bằng cách kiểm soát byte đầu tiên của phần đó, chúng tôi kiểm soát trạng thái thoát!
This example on GitHub.
Trang người nào? –
Kiểm tra 'man 3 end' –