Ah, I see, there are still a few left in the runtime. The runtime forces 
optimizations on even when -N is used.

So no, I don't think you can do what you want (without hacking the compiler 
to turn jump tables off completely.)

On Monday, December 2, 2024 at 2:25:22 AM UTC-8 Karolina GORNA wrote:

> Hello Keith,
>
> Thank you for your curiosity.
>
> This is the procedure I follow :
>
>    1. I have written the test program main.go below in the directory 
>    switch-go
>    2. I use the command *GOARCH=amd64 GOOS=linux go build 
>    -gcflags=all='-N -l' . *with "go version go1.23.3 linux/amd64".
>    3. I open the produced binary switch-go in the emulator tool of 
>    Ghidra, selecting the Golang compiler and launching the default analysis.
>    4. In the Symbol Tree, I search for "switch" key world, and I find 
>    switch tables in the .rodata section, which are actually the jump tables I 
>    don't want to have.
>
> Following the same procedure with go1.23.3 linux/amd64 and 
> GCCGO 14.2.0 (Ubuntu 14.2.0-4ubuntu2~24.04) , but with the command 
> *GOARCH=amd64 
> GOOS=linux go build -buildvcs=false -compiler=gccgo 
> -gccgoflags='-fno-jump-tables' . *, I don't have any switch tables (more 
> precisely, jump tables) in the .rodata section (where there are supposed to 
> be if they exist). But again, GCCGO currently doesn't support 
> functionalities for Go above 1.18. 
>
> Best,
> Karolina
>
> PS : I know I don't need to specify *GOARCH=amd64 GOOS=linux *in the 
> command but I have included them for the purpose of this debugging 
> discussion.
>
>
> *switch-go/main.go*----------------------------------------------
> package main
>
> import "fmt"
>
> func main() {
>     x := 10
>     switch x {
>     case 1:
>         fmt.Println("One")
>     case 5:
>         fmt.Println("Five")
>     case 10:
>         fmt.Println("Ten")
>     default:
>         fmt.Println("Other")
>     }
> }
> ----------------------------------------------
> On Saturday, November 30, 2024 at 2:16:20 AM UTC+1 Keith Randall wrote:
>
>> Hmm, that's strange. I am not seeing that behavior.
>> Could you paste the *exact* commands you used to build your program here? 
>> Include GOARCH, GOOS, Go version, and anything else relevant.
>> How are you determining that there are are still jump tables? Please post 
>> the exact commands you used to determine that also.
>>
>> One thing to try is to use "-gcflags=all=-N -l" instead of just 
>> "-gcflags=-N -l".
>>
>>
>> On Friday, November 29, 2024 at 2:58:01 AM UTC-8 Karolina GORNA wrote:
>>
>> Hello everyone,
>>
>> @Lin thank you for your feedback. However, I don't want to add a 
>> constraint on rewriting switch cases in if/else, I would be happy that the 
>> compiler can handle it at its end. For instance, GCC is able to remove jump 
>> tables even when there are switch cases in the source code with the option 
>> "-fno-jump-tables".
>>
>> @Keith, the example I took was the simple Go code below, so no cgo 
>> involved. I built it with the command *go build -gcflags='-N -l'  . . *I 
>> analyzed the binary in Ghidra and I saw the switch tables I mentioned 
>> (being actually jump tables) in the .rodata section.
>> --> However, I figured out that by using the command *go build -o 
>> <bin-name> -compiler=gccgo -gccgoflags='-fno-jump-tables' . *, I 
>> successfully get a binary of the same code without jump tables in the 
>> .rodata section. The issue with GCCGO is that it doesn't handle Go 
>> functionalities about Go1.18 (see 
>> https://www.mail-archive.com/debian-b...@lists.debian.org/msg1983336.html 
>> <https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1983336.html>)
>>  
>> so it's quite limiting.
>> ----------------------------------------------
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> *package mainimport "fmt"func main() {    x := 10    switch x {    case 
>> 1:        fmt.Println("One")    case 5:        fmt.Println("Five")    case 
>> 10:        fmt.Println("Ten")    default:        fmt.Println("Other")    }}*
>> ----------------------------------------------
>>
>> @Ian, I'm working on bug detection, and there seems to be more 
>> granularity and therefore more accuracy in analyzing low-level code than 
>> source code.
>>
>> Best,
>> Karolina
>> On Friday, November 29, 2024 at 6:39:02 AM UTC+1 Ian Lance Taylor wrote:
>>
>> On Thu, Nov 28, 2024, 1:13 AM 'Karolina GORNA' via golang-nuts <
>> golan...@googlegroups.com> wrote:
>>
>>
>> @Ian, ok I understand thank you. I am working on Go binary analysis and 
>> this feature would help a lot.
>>
>>
>> Out of curiosity, why do you want to do binary analysis on a program if 
>> you can ask for specific options to be used when building?  Why not just do 
>> source analysis, for which there are a bunch of good tools available? 
>>
>> Ian
>>
>>
>> ------------------------------
>> Les informations contenues dans ce message électronique ainsi que celles 
>> contenues dans les documents attachés sont strictement confidentielles et 
>> sont destinées à l'usage exclusif du (des) destinataire(s) nommé(s).
>> Toute divulgation, distribution ou reproduction, même partielle, en est 
>> strictement interdite sauf autorisation écrite et expresse de l’émetteur.
>> Si vous recevez ce message par erreur, veuillez le notifier immédiatement 
>> à son émetteur par retour, et le détruire ainsi que tous les documents qui 
>> y sont attachés.
>>
>> The information contained in this email and in any document enclosed is 
>> strictly confidential and is intended solely for the use of the individual 
>> or entity to which it is addressed.
>> Partial or total disclosure, distribution or reproduction of its contents 
>> is strictly prohibited unless expressly approved in writing by the sender.
>> If you have received this communication in error, please notify us 
>> immediately by responding to this email, and then delete the message and 
>> its attached files from your system.
>> ------------------------------
>>
>>
> ------------------------------
> Les informations contenues dans ce message électronique ainsi que celles 
> contenues dans les documents attachés sont strictement confidentielles et 
> sont destinées à l'usage exclusif du (des) destinataire(s) nommé(s).
> Toute divulgation, distribution ou reproduction, même partielle, en est 
> strictement interdite sauf autorisation écrite et expresse de l’émetteur.
> Si vous recevez ce message par erreur, veuillez le notifier immédiatement 
> à son émetteur par retour, et le détruire ainsi que tous les documents qui 
> y sont attachés.
>
> The information contained in this email and in any document enclosed is 
> strictly confidential and is intended solely for the use of the individual 
> or entity to which it is addressed.
> Partial or total disclosure, distribution or reproduction of its contents 
> is strictly prohibited unless expressly approved in writing by the sender.
> If you have received this communication in error, please notify us 
> immediately by responding to this email, and then delete the message and 
> its attached files from your system.
> ------------------------------
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/c94266cf-9281-4160-838d-ce081724be92n%40googlegroups.com.

Reply via email to